11.6.使用三角定理

问题
我想做一些高级动画,如旋转,循环运动或摆动
解决办法
使用内建的函数:Math.sin( ),Math.cos( ),和Math.atan2( ).
讨论
11.2节和11.4节已经使用了正弦和余弦函数,除此它们还被用来产生更有用的效果,比如围绕一个中心或沿着直线做运动,旋转等效果。Math.sin( )和Math.cos( )函数都是基于正三角形(有一个角等于90度)。当增大函数的参数数值时,函数的返回值从-1到0, 1, 0, 回到-1, 如下代码所示:
+展开
-ActionScript
for(var i:Number = 0; i < 10; i += 0.1) {
trace(Math.sin(i));
}

上面的代码输出一串数字,从0开始,到0.999,再到-0.999,再试着增大这个数字,比如40,那就会输出-40到40。利用正弦我们就能做出摆动效果,如下例子:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.events.Event;
public class Oscillation extends Sprite {
private var _sprite:Sprite;
private var _angle:Number = 0;
private var _radius:Number = 100;
public function AS3CB( ) {
_sprite = new Sprite( );
_sprite.graphics.beginFill(0x0000ff, 100);
_sprite.graphics.drawCircle(0, 0, 25);
_sprite.graphics.endFill( );
_sprite.x = 0;
_sprite.y = 100;
addChild(_sprite);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
_sprite.x = 200 + Math.sin(_angle) * _radius;
_angle += .05;
}
}
}

这里的_angle变量保持增大,然后作为Math.sin( )的参数,输出结果在乘以_radius变量,它被设为100,这样结果就是物体向左右摆动100像素。

Math.cos( )也能达到同样的效果,两个叠加形成圆周运动:
+展开
-ActionScript
public function onEnterFrame(event:Event):void {
_sprite.x = 200 + Math.sin(_angle) * _radius;
_sprite.y = 200 + Math.cos(_angle) * _radius;
_angle += .05;
}

如果要形成椭圆形运动,这设置不同的弧度值,如设置_xRadius为100,_yRadius为50:
+展开
-ActionScript
public function onEnterFrame(event:Event):void {
_sprite.x = 200 + Math.sin(_angle) * _xRadius;
_sprite.y = 200 + Math.cos(_angle) * _yRadius;
_angle += .05;
}

如果要实现看似随即的运动轨迹的话,可独立设置每个轴的相关变量:
+展开
-ActionScript
private var _xAngle:Number = 0;
private var _yAngle:Number = 0;
private var _xSpeed:Number = .13;
private var _ySpeed:Number = .09;
private var _xRadius:Number = 100;
private var _yRadius:Number = 50;
Then apply those to the motion code:
public function onEnterFrame(event:Event):void {
_sprite.x = 200 + Math.sin(_xAngle) * _xRadius;
_sprite.y = 200 + Math.cos(_yAngle) * _yRadius;
_xAngle += _xSpeed;
_yAngle += _ySpeed;
}

另一个有用的函数是Math.atan2( )。主要用它来计算出两点的夹角,它接受两个参数,两点在y轴上的距离和在x轴上的距离,然会返回角度值。

下面的例子创建了“跟随眼睛”效果,桌面的小工具,它会一直看着鼠标:
+展开
-ActionScript
package {
import flash.display.Sprite;
import flash.events.Event;
public class FollowingEye extends Sprite {
private var _sprite:Sprite;
public function AS3CB( ) {
_sprite = new Sprite( );
_sprite.graphics.beginFill(0xffffff, 100);
_sprite.graphics.drawCircle(0, 0, 25);
_sprite.graphics.endFill( );
_sprite.graphics.beginFill(0x000000, 100);
_sprite.graphics.drawCircle(20, 0, 5);
_sprite.graphics.endFill( );
_sprite.x = 100;
_sprite.y = 100;
addChild(_sprite);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
var dx:Number = mouseX - _sprite.x;
var dy:Number = mouseY - _sprite.y;
var radians:Number = Math.atan2(dy, dx);
_sprite.rotation = radians * 180 / Math.PI;
}
}
}

加支付宝好友偷能量挖...


评论(0)网络
阅读(89)喜欢(0)flash/flex/fcs/AIR