物理学在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融合部分,后面写点文章再继续阐述!

代码下载