flash 動畫製作基礎知識

三角學(Trigonometry)
弧度(radians) = 角度(degrees) * Math.PI /180
角度(degrees) = 弧度(radians) * 180 / Math.PI

向鼠標旋轉(或向某點旋轉):
dx = mouseX - sprite.x;
dy = mouseY - sprite.y;
sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;

創建波形:
 public function onEnterFrame(event:Event)
{
 value = center + Math.sin(angle) * range;
 angle += speed;
 }

創建圓形:
public function onEnterFrame(event:Event){
 xposition = centerX + Math.cos(angle) * radius;
 yposition = centerY + Math.sin(angle) * radius;
 angle += speed;
}

創建橢圓:
public function onEnterFrame(event:Event){
 xposition = centerX + Math.cos(angle) * radiusX;
 yposition = centerY + Math.sin(angle) * radiusY;
 angle += speed;
}

計算兩點間距離:
 dx = x2 – x1;
 dy = y2 – y1;
 dist = Math.sqrt(dx*dx + dy*dy);

運動學
 var dx:Number = mouseX - arrow.x;
 var dy:Number = mouseY - arrow.y;
 var angle:Number = Math.atan2(dy, dx);
 arrow.rotation = angle * 180 / Math.PI;

角速度轉換爲 x,y 速度向量:
 vx = speed * Math.cos(angle);
 vy = speed * Math.sin(angle);

角加速度(作用於物體上的 force )轉換爲 x,y 加速度:
 ax = force * Math.cos(angle);
 ay = force * Math.sin(angle);

將加速度加入速度向量:
 vx += ax;
 vy += ay;

將速度向量加入座標:
 movieclip._x += vx;
 sprite.y += vy;

摩擦力應用(正確方法):
speed = Math.sqrt(vx * vx + vy * vy);
angle = Math.atan2(vy, vx);
if (speed > friction) { speed -= friction; }
else { speed = 0; }
vx = Math.cos(angle) * speed;
vy = Math.sin(angle) * speed;
摩擦力應用(簡便方法):
vx *= friction;
vy *= friction;

緩動(ease)與彈性(spring)運動
使用緩動運動(Easing),如同讓影片滑動到目標並停止。使用彈性運動(Springing),會產生向前或向後的反彈,最終停止在目標點位。
兩種方法具有一些共同點:
■ 需要一個目標點;
■ 確定到目標點的距離;
■ 成比例地將影片移動到目標點——距離越遠,移動速度越快。
緩動運動(easing)與彈性運動(springing)的不同之處在於移動的比例。
緩動運動時,速度與距離成正比,離目標越遠,物體運動速度越快。當物體與目標點非常非常接近時,就幾乎不動了。
彈性運動時,加速度與距離成正比。如果物體與目標離得很遠,再用上加速度,會使移動速度非常快。當物體接近目標時,加速度會減小,但依然存

在!物體會飛過目標點,隨後再由反向加速度將它拉回來。最終,用摩擦力使其靜止。

簡單緩動:
vx = (targetX - ball.x) * easing;
vy = (targetY - ball.y) * easing;
ball.x += vx; ball.y += vy;

簡單彈性:
 vx += (targetX - sprite.x) * spring;
 vy += (targetY - sprite.y) * spring;
 sprite.x += (vx *= friction);
 sprite.y += (vy *= friction);

距離碰撞檢測:
 var dx:Number = spriteB.x - spriteA.x;
 var dy:Number = spriteB.y - spriteA.y;
 var dist:Number = Math.sqrt(dx * dx + dy * dy);
 if (dist < spriteA.radius + spriteB.radius) { // 處理碰撞 }


座標旋轉及角度反彈


高級座標旋轉

x,y爲初始座標,x2,y2爲旋轉後坐標
var cos:Number=Math.cos(angle);
var sin:Number=Math.sin(angel);
順時針旋轉
x2=xcos-ysin;
y2=ycos+xsin;

逆時針旋轉
x2=xcos+ysin;
y2=ycos-xsin;

用鼠標位置控制多個物體旋轉的速度。如果鼠標在屏幕中心,則不產生旋轉。
如果鼠標向左移動,則物體逆時針旋轉,並且越向左速度越快。如果向右移動,則順時針旋轉
private function onEnterFrame(event:Event):void {

var angle:Number = (mouseX - stage.stageWidth / 2) * .001;

var cos:Number = Math.cos(angle);
var sin:Number = Math.sin(angle);
for (var i:uint = 0; i < numBalls; i++) {
 var ball:Ball = balls[i];
 var x1:Number = ball.x - stage.stageWidth / 2;
 var y1:Number = ball.y - stage.stageHeight / 2;
 var x2:Number = cos * x1 - sin * y1;
 var y2:Number = cos * y1 + sin * x1;
 ball.x = stage.stageWidth / 2 + x2;
 ball.y = stage.stageHeight / 2 + y2;
 } }


解決物體碰撞在障礙物後反彈的問題,總結出如下幾步:
1.確實何時越過邊界。
2.直接在邊界上重置物體的位置。(修正位置)
3.改變碰撞軸上的速度。


動量守恆的數學表達式:
   (m0 – m1) * v0 + 2 * m1 * v1
 v0Final = ----------------------------------------------
   m0 + m1
  (m1 – m0) * v1 + 2 * m0 * v0
 v1Final = ---------------------------------------------
   m0 + m1

 

動量守恆的 ActionScript 表達式:
var vxTotal:Number = vx0 - vx1;
vx0 = ((ball0.mass - ball1.mass) * vx0 + 2 * ball1.mass * vx1) / (ball0.mass + ball1.mass);
vx1 = vxTotal + vx0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了57 篇原創文章 · 獲贊 9 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章