摘要:該文的研究內容將用到編程,數學,物理等技術。在例子中將運用Flash中強大的腳本語言ActionScript讓物體運動起來,這些都是補間動畫無法比擬的。
關鍵詞:腳本;運動;編程
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)35-2493-02
Research on Programing physics Motion Based on the Actionscript
CHEN Jue
(Suzhou Art Design Technology Institute,Suzhou 215014,China)
Abstract: This research covers programming, math, and physics techniques.The projects based on the powerful language in Flash ,called ActionScript,and used to make things move with ActionScript that you could never hope to match with tweening.
Key words:actionscript; motion; programing
從 Flash 最早的版本開始,就支持補間動畫,然后讓 Flash 自動創建補間動畫即可。這里我們將研究如何運用Flash 中的一種強大的語言ActionScript,并結合編程,數學,物理等技術,實現物體運動中關于速度,加速度,彈性,緩動等內容的實現。
1 勻速運動(Velocity)
物體運動的最基本屬性就是速度。要使物體以一個恒定的速度運動,就要在每一幀不斷的累加恒定的速度。這里可以使用幀的循環的方式,來使物體不斷的累加恒定的速度,以達到目的地。你可以新建一個Flash文檔,并在舞臺上放置一個mc(例如球)命名為ball,做以下的實驗。
vx=n;//n為初始值
onEnterFrame=function(){
ball._x+=vx;//vx為累加的恒定速度值。
}
2 加速運動(Acceleration)
我們假定加速度為ax,那么在x軸上速度就為vx=vx+ax,若初速度設為0;代碼為:
ax=n;
vx=0;
onEnterframe=function(){
vx+=ax;
ball._x+=vx;
}
這是小球在水平方向上的加速運動。現在我們假想一下,如果小球運動時的方向有一定的角度,那要如何實現呢?解決的辦法是,小球在每一個軸上都有了加速度,我們可以刷新每個軸上的速度向量,并更新為物體的位置。
force= 10;
angle = 45; // 45度角運動
r= angle * 180 / Math.PI;
ax= Math.cos(r) * force;
ay= Math.sin(r) * force;
vx += ax;
vy += ay;
ball.x += vx;
ball .y += vy;
3 彈性(Spring)
彈性運動是 ActionScript 動畫中最強大和最有用的物理學概念。幾乎所有的物體都可以使用彈性運動。下面就來看看什么是彈性運動以及在 Flash 編程中的應用。
彈性的加速度與物體到目標點的距離成正比例。
這里我們仍然使用可以拖拽的小球作為主體。默認位置還是 x 軸的 0 點,使它具有運動到中心點的彈性。我們需要做的是設置好邊界,以及物體回彈的方向。我們設定一個邊界,當小球超出邊界時小球回彈,也就是方向改變了。以x軸為例應為:vx*=-1; 實際上你可能發現它實際上就是 vx=-vx。
但小球在回彈時要有一定的能量損失,其中還要有重力加速度的影響,當回彈速度設為1時無能量損失,其中的負號代表方向,當小于1時會產生能量損失,也就是摩擦,如:vx*=-0.1;同時不要忘了在現實生活小球還會受重力加速度的影響。
top=0;
left=0;
right=400;
bottom=300;
sping=-0.1 //彈性系數
garv=.5; //重力加速度
vx = 10;
vy = 10;
onEnterFrame = function () {
vy+=garv;
ball._x += vx;
ball._y += vy;
if(ball._x+ball._width/2>right){
ball._x=right-ball._width/2;
vx*=spring;
}
if(ball._x-ball._width/2 ball._x=left+ball._width/2; vx*=spring; } if(ball._y-ball._height/2 ball._y=top+ball._height/2; vy*=spring; } if(ball._y+ball._height/2>bottom){ ball._y=bottom-ball._height/2; vy*=spring; } }; 4 緩動(easing) 首先說明緩動的種類不只有一種。在 Flash IDE 中,就可以用 “緩動輸入”和 “緩動輸出”。下面所討論的緩動類型與運動補間的“緩動輸出”相似,即簡單的easing方式,即物體以摩擦的形式達到目的點。如果想要更復雜的easing方式,可以參看www.robertpenner.com,當然你也可以使用使用transition類或是tween類。 簡單緩動是個非常基礎概念,就是將一個物體移到別處去。問題在于物體沿著固定的速度和方向運動,到達目標點后,立即停止,顯得不夠自然。當物體向著目標有計劃地前進時,起初運動的速度很快,而臨近目標點時,速度就開始慢下來了,即它的速度向量與目標點的距離應該成比例的。下面是緩動的實現策略: a) 確定一個數字作為運動比例系數,這是個小于 1 的分數; b) 確定目標點; c) 計算物體與目標點的距離; d) 用距離乘以比例系數,得出速度向量; e) 將速度向量加到當前物體坐標上; f) 重復 c 到 e,直到小球到達終點。 targetx = 400; targety = 250; easing = .2; onEnterFrame = function () { dx=targetx-ball._x; dy=targety-ball._y; ball._x+=dx*easing; ball._y+=dy*easing; }; 5 總結 以上的關鍵代碼雖然比較簡單,但它確是實現物體運動編程的基礎框架,你可盡情地發揮你的想象和創意,只要在這個框架之中添加一些元素或是代碼,就能制作出各種酷炫的動畫效果。 參考文獻: [1] Peters K.Flash ActionScript 3.0 動畫教程[M].北京:人民郵電出版社,2008. [2] 王汝義.Flash網站建設技術精粹[M].北京:人民郵電出版社,2008. [3] 孫穎.Flash ActionScript3殿堂之路[M].北京:電子工業出版社,2007.