物理是一个很有趣的东西,flash 结合物理是其中一个很重要的方向,也是学习flash技术一个很重要的门。最近翻阅一些资料,复习了一下物理和flash技术,虽然是一点皮毛的东西,不过先把他记录下来。为日后需要作一个基础,下面我们采用小球模拟重力,但是本身没有涉及到质量,没有涉及到球与球之间的碰撞,这样可操作性会简单一些,容易掌握,重力结合当中。在Make thing move 一书当中,这本书已经讲解得很深入,它有碰撞,和能量损失等模拟。可以参考这本书,不过既然初学的,先简单的一些好。自己本身物理知识还在恶补当中。只能一点一点来。
重力模拟,只要技巧在于加速度和位移是怎样结合起来。我们知道在每一帧刷新的时候,不断执行
(物体.y+=值)。物体就会一直向下移动。
(物体的垂直速度vy+=g)加上一个重力加速度,使物体在vy垂直方向的速度有了一个额外的递增值,因此vy值会不断增加
从而物体.y 的值会发生变化,其实flash 里面隐含了一个时间概念。每一帧其实有一个时间间隔,这样这个隐含的时候就会无形加上去了
速度公式:vt=v0+at(其中v0为初始速度,t为时间)
位移的公式:s=v0t + 1/2at^2 (其中v0为初始速度,a为加速度,t为时间);
这样的组合方式
vy+=a;
物体.y+=vy;
就能够产生位移变化。(该公式可以在make thing move 找到)
下面就是模拟出一些小球进行,小球采用绘图api来模拟出来。
private function creatBalls(num:int):void 创建一系列的小球
其中:我们加入了阻力去模拟,效果会更加好,小球受到空气阻力,因此落体的时候会发生速度递减。
list[i].vy+=g;//加速度加上向下的垂直速度
list[i].vy*=friction;//阻力
list[i].y+=list[i].vy;// s=vt;
这里就是关键的地方,不是很难,因为没有涉及到质量和球与球之间碰撞,这部分资料很多,可以去找找。我发现到这部分知识,对一个flash 爱好者来讲,是需要去了解和掌握的。这样就能够创造很多有趣的flash,而最近搜索资料的时候,发觉国外日本和美国那边的flash 都很注重数学和物理方面的培养结合,这样创造出来的flash 来讲才会有说服力。效果更加好。这部分知识,自己觉得需要慢慢补上,毕竟物理不是很好需要翻阅资料阅读。所以这部分慢慢努力。
public class Main extends Sprite
{
private var g:Number=1;//重力
private var friction:Number=0.98;//空气阻力
private var contain:Sprite=new Sprite();//容器
private var list:Array=new Array();
public function Main()
{
init();
}
private function init():void
{
addChild(contain);
creatBalls(20);//创建20个小球
addEventListener(Event.ENTER_FRAME,Run);
var btn:MyButton=new MyButton();//创建按钮
btn.x=400;
btn.y=50;
btn.addEventListener(MouseEvent.MOUSE_DOWN,onDownHandler);
addChild(btn);
}
private function onDownHandler(event:MouseEvent):void
{
while(list.length>0)list.pop();
while(contain.numChildren>0)contain.removeChildAt(0);
creatBalls(20);//创建小球
}
//创建球体
private function creatBalls(num:int):void
{
for (var i:int=0; i<num; i++)
{
var ball:Ball=new Ball(Math.random()*30+10,0xffffff *Math.random());
ball.x=Math.random()*500;
ball.y=0;
ball.vy=Math.random()*10;//不同的初速度
contain.addChild(ball);
list.push(ball);
}
}
private function Run(event:Event):void
{
for (var i:int=0; i<list.length; i++)
{
list[i].vy+=g;//加速度加上向下的垂直速度
list[i].vy*=friction;//阻力
list[i].y+=list[i].vy;// s=vt;
if (list[i].y+list[i].height/2>stage.stageHeight)
{
list[i].y=stage.stageHeight-list[i].height/2;
list[i].vy*=-1;
}
}
}
}
}
//模拟的小球
import flash.display.Sprite;
class Ball extends Sprite
{
public var vy:Number=0;
public var vx:Number=0;
function Ball(r:int,color:uint)
{
this.graphics.lineStyle(1);
this.graphics.beginFill(color);
this.graphics.drawCircle(0,0,r);
this.graphics.endFill();
this.x=-this.width/2;
this.y=-this.height/2;
}
}
import flash.display.Sprite;
import flash.text.TextField;
//按钮
class MyButton extends Sprite
{
function MyButton()
{
this.graphics.lineStyle(1);
this.graphics.beginFill(0xffff00);
this.graphics.drawRect(0,0,60,20);
this.graphics.endFill();
var txt:TextField=new TextField();
txt.text="RePlay";
txt.x=10;
txt.y=2;
txt.mouseEnabled=false;
addChild(txt);
}
}