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

返回“Flash基础理论课 - 目录”

优化代码

前面我们已经看过一些代码优化的例子。通常是使用一次执行代替多次执行,或干脆不执行。

我们前面写的那段代码只是为了看得比较清楚。其中有一些代码实际上并不需要执行。多数代码只有在 ball与line 产生接触时才执行。因此,多数时间只需要执行基本的运动代码。换句话讲,我们要将代码放到 if 语句中去:

if(y2 > -ball.height / 2)

所以我们只需知道变量y2。为了得到它需要x1和y1以及sin和cos。但是如果ball没有碰到 line,就不需要知道 x2 或 vx1和vy1。因此,这些都可以只在 if 语句中出现。同样,如果没有产生碰撞,就不需要对任何物体进行旋转或设置 ball的位置。因此,所有 if 语句后面的内容都可以放在 if 语句里面执行。于是就得出了优化版的onEnterFrame方法(见 AngleBounceOpt.as):

private function onEnterFrame(event:Event):void {
    // 普通的运动代码
    ball.vy += gravity;
    ball.x += ball.vx;
    ball.y += ball.vy;
    // 获得角度及正余弦值
    var angle:Number = line.rotation * Math.PI / 180;
    var cos:Number = Math.cos(angle);
    var sin:Number = Math.sin(angle);
    // 获得 ball与line的相对位置
    var x1:Number = ball.x - line.x;
    var y1:Number = ball.y - line.y;
    // 旋转坐标
    var y2:Number = cos * y1 - sin * x1;
    // 实现反弹
    if(y2 > -ball.height / 2) {
       // 旋转坐标
       var x2:Number = cos * x1 + sin * y1;
       // 旋转速度向量
       var vx1:Number = cos * ball.vx + sin * ball.vy;
       var vy1:Number = cos * ball.vy - sin * ball.vx;
        y2 = -ball.height / 2;
        vy1 *= bounce;
       // 将一切旋转回去
       x1 = cos * x2 - sin * y2;
       y1 = cos * y2 + sin * x2;
       ball.vx = cos * vx1 - sin * vy1;
       ball.vy = cos * vy1 + sin * vx1;
       ball.x = line.x + x1;
       ball.y = line.y + y1;
    }
}

所有粗体的内容都是从 if 语句外面移到里面去的,所以只有产生碰撞时它们才会执行,这样做比每一帧都执行要好很多。可以想象我们节省了多少 CPU 资源吗?这样的考虑是非常重要的,尤其是当影片变得越来越多,代码变得越来越复杂时。

动态效果

现在我们可以将这个程序变得更加动态些,实时地改变 line的角度。只需要一行代码即可搞定,在 onEnterFrame方法的第一行写入:

line.rotation = (stage.stageWidth/ 2 - mouseX) * .1;

现在我们只要前后移动鼠标,line 就会随之倾斜,小球也会立即进行调整。完整的代码可见文档类 AngleBounceRotate.as。

时间: 2024-11-01 20:33:06

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

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

返回"Flash基础理论课 - 目录" 本章介绍了一项特殊技术,著名的坐标旋转.如同其名,它是物体指绕着某点旋转其坐标,在制作一些非常有趣的效果时,坐标旋转是必不可少的.其中就包括在Flash 界讨论了很多年的问题:"如何在斜面上进行反弹?",本章我会给大家一一解答. 另一个用坐标旋转完成的程序是两物体之间的交互反弹效果.我们会在下一章讨论动量守衡时进行讲解.而本章的坐标旋转,我们之前也已经接触过了.如果大家想跳过这章的话,我劝您还是先坐下来,浏览一遍为好. 简单的

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" 第四个文