flash 动画制作基础知识

来源:互联网 发布:阿里云开放80端口 编辑:程序博客网 时间:2024/05/07 08:18

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