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