三角學(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;