Flash基础理论课 第十章 坐标旋转及角度反弹Ⅰ

返回“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 坐标,每帧都如此。这就显得太麻烦了,并且效率也不会很高。没关系,我们还有更好的办法。

时间: 2025-01-20 10:59:36

Flash基础理论课 第十章 坐标旋转及角度反弹Ⅰ的相关文章

Flash基础理论课 第十章 坐标旋转及角度反弹Ⅱ

返回"Flash基础理论课 - 目录" 优化代码 前面我们已经看过一些代码优化的例子.通常是使用一次执行代替多次执行,或干脆不执行. 我们前面写的那段代码只是为了看得比较清楚.其中有一些代码实际上并不需要执行.多数代码只有在 ball与line 产生接触时才执行.因此,多数时间只需要执行基本的运动代码.换句话讲,我们要将代码放到 if 语句中去: if(y2 > -ball.height / 2) 所以我们只需知道变量y2.为了得到它需要x1和y1以及sin和cos.但是如果ba

Flash基础理论课

Flash基础理论课 第一章 基础动画概念 Flash基础理论课 第二章 ActionScript 3.0 动画基础Ⅰ Flash基础理论课 第二章 ActionScript 3.0 动画基础Ⅱ Flash基础理论课 第三章 三角学应用Ⅰ Flash基础理论课 第三章 三角学应用Ⅱ Flash基础理论课 第四章 渲染技术Ⅰ Flash基础理论课 第四章 渲染技术Ⅱ Flash基础理论课 第四章 渲染技术Ⅲ Flash基础理论课 第五章 速度与加速度Ⅰ Flash基础理论课 第五章 速度与加速度Ⅱ

[Flash基础理论课08]旋转花朵[for...in]

返回"Flash基础理论课 - 目录" 思路:1.使用for...in语句遍历整个主场景(_root)中所有的对象; 2.找到他们(如_root[k]),并为他们的不同方法指定不同函数; 步骤1: 在主场景放入若干个影片剪辑,不需要为他们起实例名. 步骤2: 加入AS代码: var F1:Function = function () { this.startDrag(true); }; var F2:Function = function () { this.stopDrag(); }

Flash基础理论课 第十九章 实用技巧 Ⅲ

返回"Flash基础理论课 - 目录" 实用公式 统领全书,我们已经有了各种运动和效果的公式.我已经提取出了最实用和最常用的公式.方程.以及代码的摘录,并将它们列在本章的最后.我认为将它们放到同一个地方应该对大家非常有帮助,因此我将这些我认为最需要的内容放到一起作为整体的一个参考资料.我将会在这一页夹上书签. 第三章 基础三角函数的计算: 角的正弦值 = 对边 / 斜边 角的余弦值 = 邻边 / 斜边 角的正切值 = 对边 / 邻边 弧度转换为角度以及角度转换为弧度: 弧度 = 角度

Flash基础理论课 第十七章 背面剔除与3D灯光Ⅰ

返回"Flash基础理论课 - 目录" 第十六章介绍了所有建立 3D 立体模型的基础包括:如何创建点,线,用多边形组成各种形状,以及如何为每个多边形设置颜色.但是,我们只能让颜色的透明度为50%,才能看到正确的效果.虽然制作出的 3D 立体模型也不差,但是这样做在真实度上还是有所欠缺. 本章,通过介绍背面剔除(不绘制背面的多边形),深度排序(第十五章作了一点介绍,但这次要从多边形的角度重新审视它),以及 3D 灯光,来修正这个问题. 我想应用了这三种技术所得到的 3D 模型一定会让大家

Flash基础理论课 第十五章 3D基础Ⅰ

返回"Flash基础理论课 - 目录" 前面我们做的一切都是二维的(有时只有一维),但是已经可以做出非常酷的东东了.现在,将它们带入到下一个等级. 创建 3D 图形总是那么另人兴奋.新加入的这个维度似乎将物体真正地带入到了生活中.如何在Flash 中实现 3D 在无数的书籍和教学软件中都有介绍.但是我不打算跳过这些内容,我们会很快地将所有基础的知识讲完.随后,将前面章节中讨论的运动效果放到三维空间中.说得详细些,将给大家介绍速度,加速度,摩擦力,反弹,屏幕环绕,缓动,弹性运动,坐标旋转

Flash基础理论课 第十一章 撞球物理Ⅰ

返回"Flash基础理论课 - 目录" 我们都希望技术性的书籍,可以潜入深,由简单到复杂.本章内容的复杂度达到了顶点.并不是说接下来的章节会越来越容易,但是希望大家在学习本章内容时不要偷工减料.我会带大家一步步地学习本章的概念,如果到现在为止大家都能很好地跟上我的步伐,那就再好不过了. 本章我们要关注动量:两个物体发生碰撞后动量会发生什么样的变化,动量的守恒,以及如何在ActionScript中应用动量. 在本章的例子中使用的对象,都本这简单直接的原则,这个学科通常是指"撞球

[Flash基础理论课15] 绚酷鼠标[目标移动]

返回"Flash基础理论课 - 目录" 在学习之前,我们先复习一下前面(功能代码07<百变图>)曾用过的 目标移动公式: mc.当前坐标 += (mc.目标坐标 - mc.当前坐标) * A 缓动常量( 0 < A < 1 ) 例如: 舞台上有一个影片剪辑,实例名为 mc,使其移动到 x=400, y=300 的位置 mc.Tox = 400; mc.Toy = 300; mc.onEnterFrame = function() { this._x += (th

[Flash基础理论课11] AS文本计算器[文本类]

返回"Flash基础理论课 - 目录" 通过这个实例介绍函数在程序中的应用 思路: 1.用AS创建四个文本框第一个用于输入数字,第二个用于输入运算符,第三个还用于输入数字,最后一个用于输出结果. 2.设置一个按钮(count_btn),按下后跟据第二个文本框给出的运算符将第一个和第三个文本内容进行运算,并在最后一个文本框内输出. 3.第一个文本框名为"in1" 第二个文本框名为"sign" 第三个文本框名为"in2" 第四个文