返回“Flash基础理论课 - 目录”
本章介绍了一项特殊技术,著名的坐标旋转。如同其名,它是物体指绕着某点旋转其坐标,在制作一些非常有趣的效果时,坐标旋转是必不可少的。其中就包括在Flash 界讨论了很多年的问题:“如何在斜面上进行反弹?”,本章我会给大家一一解答。
另一个用坐标旋转完成的程序是两物体之间的交互反弹效果。我们会在下一章讨论动量守衡时进行讲解。而本章的坐标旋转,我们之前也已经接触过了。如果大家想跳过这章的话,我劝您还是先坐下来,浏览一遍为好。
简单的坐标旋转
虽然我们在第三章讲三角学的时候介绍过计算的坐标旋转的方法,但还是先来做一下回顾。假设知道一个中心点,一个物体,一个半径和一个角度。通过不断地增加或减少角度,并运用基本的三角学知识让物体绕着中心点旋转。我们可将变量设为 vr (旋转速度)来控制角度的增加或减少。还有,不要忘记角度应用弧度制来表示。代码的结构如下所示:
vr = 0.1;
angle = 0;
radius = 100;
centerX = 250;
centerY = 200;
// 在enterFrame 处理函数中:
sprite.x = centerX + cos(angle) * radius;
sprite.y = centerY + sin(angle) * radius;
angle += vr;
根据角度与半径使用简单的三角函数设置物体的x,y属性,并在每帧中改变角度。我们用Flash 动画演示一下。下面是第一个例子,文档类 Rotate1.as:
package {
import flash.display.Sprite;
import flash.events.Event;
public class Rotate1 extends Sprite {
private var ball:Ball;
private var angle:Number = 0;
private var radius:Number = 150;
private var vr:Number = .05;
public function Rotate1() {
init();
}
private function init():void {
ball = new Ball();
addChild(ball);
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
private function onEnterFrame(event:Event):void {
ball.x = stage.stageWidth / 2 + Math.cos(angle) * radius;
ball.y = stage.stageHeight / 2 + Math.sin(angle) * radius;
angle += vr;
}
}
}
这段代码中没有什么新的知识点。大家可以改变一下角度与半径,试验运行结果。但是如果我们只知道物体与中心点的位置又该怎么办呢?用x,y 坐标计算出当前的角度(angle)与半径(radius)也并非难事。代码如下:
var dx:Number = ball.x - centerX;
var dy:Number = ball.y - centerY;
var angle:Number = Math.atan2(dy, dx);
var radius:Number = Math.sqrt(dx * dx + dy * dy);
这种基于坐标的旋转只对单个物体的旋转效果比较好,尤其是一次性就可确定角度和半径的情况下。但是在动态的程序中,有时需要旋转多个物体,而它们与中心点的相对位置可能会发生改变。因此,对于每个物体来说,都需要计算距离,角度和半径,还要用vr 来增加角度,最后才能算出新的x,y 坐标,每帧都如此。这就显得太麻烦了,并且效率也不会很高。没关系,我们还有更好的办法。