Link

首页

Tweet

书单

about me

Command

友情链接

Category

物理学在flash中的运用之第二运动定律


      当我们看到flashplayer11的重大改进之后相信不少童鞋都开始着迷与stage3D,但是想做出一个好的stage3D游戏或者其他的也好,我们就需要模拟一些现实中的物理效果。本平文章我们先不对stage3D过多进行融合,先来开始编写一点点基于物理公式的程序。到后面的时候我们再来对stage3D进行融合。

      在学习之前我们需要对所有的物理知识进行一下不系统的复习,换句话说,你只需要过多过少的了解其中的一些原理即可。更多的则是掌握公司,算法和程序中的编写方式。

      微博上northwolf木子竹 希望能看到一些小的demo,这里为了方便大家学习,放出的demo均由flashdevelop开发。所以麻烦大家支持一下这个IDE咯~

      在这个运动第二定律中,我们伟大的牛顿牛师傅提出了一个很伟大的公式:

      F = ma

      这里的F指的是合理,也就是作用在物体上力的大小,m为物体质量,a为物体的重心。

通过对a重心的换算,我们可以得到等同公式:

点击查看原图

      在这个新的公式中,L为运动距离,T为运动时间。这里我们再提出一个流体摩擦力的概念,当我们一个物体在流体中运动的时候,比如在空气或者水中运动(潜艇就是一个比较好的例子)。那么我们如何得出流体中运动摩擦力的公式呢?我们来看一下公式换算过程。

点击查看原图

 

上面这个公式其实就是流体摩擦力公式,我们可以通过换色得到最终公式:

点击查看原图

      其实我们可以看到,不管是不是流体,我们的运动定律都是相同的。

      下面就来利用我们的flash实现这两种公式。为了方便的演示,我们就以汽车运动为例。由于程序运行时候仅仅是一些数据在运算,所以并不存在真正的物理环境。我们要对所有的模拟物理环境进行定义,比如长度,尺寸数据,或者重量等等。这些都需要在我们程序中进行统一的单位定义。例如,在flash中,我们将10px定义为显示中的1米。这样,当我们程序运行时候我们就可以对单位进行统一的换算。来看看我们的代码吧!

      在这个demo中我们实际上是通过对F,力的数值的改变来使得CAR进行移动,同时根据F的数值来计算出移动的距离。

代码如下:

Car.as

package 
{
    import flash.display.Shape;
    import flash.display.Sprite;
   
    /**
     * 1米 = 10px
     * 当前车辆类型 BMW X6
     * 外形尺寸(长/宽/高): 4877/1983/1690mm   4.877米/1.983米
     * 整车质量(Kg):     2145
     * 最大马力(Ps):     306 = 3000834.9 N
     * @author mebius.ashan
     */
    public class Car extends Sprite
    {
       
        private var n:Number = 3000834.9;
       
        public var KG:Number = 2145;
       
        public function Car()
        {
            var drawobj:Shape = this.drawShape(1.983, 4.877);
            drawobj.x = drawobj.width / 2 * -1;
            drawobj.y = drawobj.height / 2 * -1;
            this.addChild(drawobj);
        }
        private function drawShape(ws:Number,hs:Number):Shape
        {
            var carObject:Shape = new Shape();
            carObject.graphics.beginFill(Math.random() * 0xffffff);
            carObject.graphics.drawRect(0, 0, Maths.length(ws), Maths.length(hs) );
            carObject.graphics.endFill();
            return carObject;
        }
       
        public function get N():Number
        {
            return  this.n;
        }
       
    }

}

Maths.as

package 
{
    /**
     * ...
     * @author mebius.ashan
     */
    public class Maths
    {
        /**
         * 长度换算
         * @param    val 米
         * @return  px长度
         */
        public static function length(val:Number):Number
        {
            return val * 10;
        }
       
    }

}

Main.as

package
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;
    /**
     * ...
     * @author mebius.ashan
     */
    public class Main extends Sprite
    {
       
        private var car:Car ;
       
        private var F:Number = 0;
       
        private var iskeyDown:Boolean = false;
       
        public function Main():void
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
       
        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            // entry point
           
            car = new Car();
            car.x = stage.stageWidth / 2;
            car.y = stage.stageHeight / 2;
            this.addChild(car);
           
            this.addEventListener(Event.ENTER_FRAME, moving);
            stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown);
            stage.addEventListener(KeyboardEvent.KEY_UP, keyup);
        }
       
        private function moving(evt:Event):void
        {
            if (this.iskeyDown == false && this.F>0 )
            {
                this.F -=14000;
            }
           
            var times:Number = 1 / stage.frameRate ;
            var len:Number = this.F * (times * times) / this.car.KG;
            trace(len);
            this.car.y -= Maths.length(len);
        }
       
        private function keydown(evt:KeyboardEvent):void
        {
            if (Keyboard.UP)
            {
                this.iskeyDown = true;
                if (this.F < this.car.N)
                {
                    this.F +=5000 ;
                }
            }
           
           
        }
       
        private function keyup(evt:KeyboardEvent):void
        {
            if (Keyboard.UP)
            {
                this.iskeyDown = false;
            }
           
        }
    }
   
}

 

关于stage3D融合部分,后面写点文章再继续阐述!

代码下载