Flash 与物理笔记:简单的小球重力模拟
?? 物理是一個(gè)很有趣的東西,flash 結(jié)合物理是其中一個(gè)很重要的方向,也是學(xué)習(xí)flash技術(shù)一個(gè)很重要的門。最近翻閱一些資料,復(fù)習(xí)了一下物理和flash技術(shù),雖然是一點(diǎn)皮毛的東西,不過(guò)先把他記錄下來(lái)。為日后需要作一個(gè)基礎(chǔ),下面我們采用小球模擬重力,但是本身沒(méi)有涉及到質(zhì)量,沒(méi)有涉及到球與球之間的碰撞,這樣可操作性會(huì)簡(jiǎn)單一些,容易掌握,重力結(jié)合當(dāng)中。在Make thing move 一書當(dāng)中,這本書已經(jīng)講解得很深入,它有碰撞,和能量損失等模擬??梢詤⒖歼@本書,不過(guò)既然初學(xué)的,先簡(jiǎn)單的一些好。自己本身物理知識(shí)還在惡補(bǔ)當(dāng)中。只能一點(diǎn)一點(diǎn)來(lái)。
重力模擬,只要技巧在于加速度和位移是怎樣結(jié)合起來(lái)。我們知道在每一幀刷新的時(shí)候,不斷執(zhí)行
(物體.y+=值)。物體就會(huì)一直向下移動(dòng)。
(物體的垂直速度vy+=g)加上一個(gè)重力加速度,使物體在vy垂直方向的速度有了一個(gè)額外的遞增值,因此vy值會(huì)不斷增加
從而物體.y 的值會(huì)發(fā)生變化,其實(shí)flash 里面隱含了一個(gè)時(shí)間概念。每一幀其實(shí)有一個(gè)時(shí)間間隔,這樣這個(gè)隱含的時(shí)候就會(huì)無(wú)形加上去了
速度公式:vt=v0+at(其中v0為初始速度,t為時(shí)間)
位移的公式:s=v0t + 1/2at^2 (其中v0為初始速度,a為加速度,t為時(shí)間);
這樣的組合方式
vy+=a;
物體.y+=vy;
就能夠產(chǎn)生位移變化。(該公式可以在make thing move 找到)
下面就是模擬出一些小球進(jìn)行,小球采用繪圖api來(lái)模擬出來(lái)。
private function creatBalls(num:int):void 創(chuàng)建一系列的小球
其中:我們加入了阻力去模擬,效果會(huì)更加好,小球受到空氣阻力,因此落體的時(shí)候會(huì)發(fā)生速度遞減。
??? list[i].vy+=g;//加速度加上向下的垂直速度
????list[i].vy*=friction;//阻力
????list[i].y+=list[i].vy;// s=vt;
這里就是關(guān)鍵的地方,不是很難,因?yàn)闆](méi)有涉及到質(zhì)量和球與球之間碰撞,這部分資料很多,可以去找找。我發(fā)現(xiàn)到這部分知識(shí),對(duì)一個(gè)flash 愛好者來(lái)講,是需要去了解和掌握的。這樣就能夠創(chuàng)造很多有趣的flash,而最近搜索資料的時(shí)候,發(fā)覺國(guó)外日本和美國(guó)那邊的flash 都很注重?cái)?shù)學(xué)和物理方面的培養(yǎng)結(jié)合,這樣創(chuàng)造出來(lái)的flash 來(lái)講才會(huì)有說(shuō)服力。效果更加好。這部分知識(shí),自己覺得需要慢慢補(bǔ)上,畢竟物理不是很好需要翻閱資料閱讀。所以這部分慢慢努力。
package { //簡(jiǎn)單小球重力模擬 import flash.display.Sprite; import flash.events.*; 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);//創(chuàng)建20個(gè)小球 addEventListener(Event.ENTER_FRAME,Run); var btn:MyButton=new MyButton();//創(chuàng)建按鈕 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);//創(chuàng)建小球 } //創(chuàng)建球體 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); } }
轉(zhuǎn)載于:https://www.cnblogs.com/guoyiqi/archive/2010/02/20/2069211.html
總結(jié)
以上是生活随笔為你收集整理的Flash 与物理笔记:简单的小球重力模拟的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C#中父子窗口之间实现控件互操作
- 下一篇: 调驱动 一定注意 cache 表的