2008年9月24日星期三

《making things move》笔记(第三章)(2)

双角波形


一种思想:

设置两套数值 angle1 和 angle2,

为它们各自增加一个中心点(center)和速度(speed)值。

用一个正弦波作为一种属性,另一个正弦波作为另一种属性,比如位置或缩放。

从 Random.as 文档类开始,这里面拥有两个角度(angle),两个速度(speed)和两个中心点(center),将其中一个角(angle1)作为小球的X坐标,另一个角(angle2)作为Y坐标。运行程序时,就像只虫子在房间里飞


将ball替换成点。可以画出轨迹。

xpos=centerX+Math.sin(angleX)*range;

ypos=centerY+Math.sin(angleY)*range;

angleX+=xspeed;

angleY+=yspeed;

graphics.lineTo(xpos,ypos)


轨迹图――





圆形运动


在执行物体移动的动画时,完全可以使用余弦来代替正弦。

实际上,余弦和正弦协同工作时,才能形成一个更加有用的功能:使物体沿圆形运动

记住用正弦函数计算 y ,用余弦函数计算 x。

ball.x = centerX + Math.cos(angle) * radius;

ball.y = centerY + Math.sin(angle) * radius;

angle += speed;





椭圆运动


。如果让x和y运动的大小相同,那么就得到一个圆。如果想得到一个椭圆形,我们只需要在计算x和y位置时使用不同的半径值: radiusX 和 radiusY 。

ball.x = centerX + Math.cos(angle) * radiusX;

ball.y = centerY + Math.sin(angle) * radiusY;

angle += speed;




勾股定理


在 Flash 中,最常见的情况是我们只知道两条直角边的长度要求出斜边的长度。比如,求出两点间的距离。

dx = x2 – x1;

dy = y2 – y1;

dist = Math.sqrt(dx*dx + dy*dy);


在学到碰撞检测时,我们会发现内置的碰撞检测(hit testing)方法存在着先天不足,然后会看到使用勾股定理公式完成基于距离(distance-based)碰撞检测方法。它还非常适合用于计算重力或弹力等,因为这些力的大小与两个物体之间的距离成正比。



===========================================


本章重要公式


基本三角函数的计算:

角的正弦值 = 对边 / 斜边

角的余弦值 = 邻边 / 斜边

角的正切值 = 对边 / 邻边


角度制与弧度制的相互转换:

弧度 = 角度 * Math.PI / 180

角度 = 弧度 * 180 / Math.PI


向鼠标旋转(或向某点旋转):

// substitute mouseX, mouseY with the x, y point to rotate to

dx = mouseX - sprite.x;

dy = mouseY - sprite.y;

sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;


创建波形:

// assign value to x, y or other property of sprite or movie clip,

// use as drawing coordinates, etc.

public function onEnterFrame(event:Event){

value = center + Math.sin(angle) * range;

angle += speed; }


创建圆形:

// assign position to x and y of sprite or movie clip,

// use as drawing coordinates, etc.

public function onEnterFrame(event:Event){

xposition = centerX + Math.cos(angle) * radius;

yposition = centerY + Math.sin(angle) * radius;

angle += speed; }


创建椭圆:

// assign position to x and y of sprite or movie clip,

// use as drawing coordinates, etc.

public function onEnterFrame(event:Event){

xposition = centerX + Math.cos(angle) * radiusX;

yposition = centerY + Math.sin(angle) * radiusY;

angle += speed; }


计算两点间距离:

// points are x1, y1 and x2, y2

// can be sprite / movie clip positions, mouse coordinates, etc.

dx = x2 – x1;

dy = y2 – y1;

dist = Math.sqrt(dx*dx + dy*dy);

没有评论: