ActionScript3学习记录 - 边界反弹平行轴位移

Keith Peters的<<Foundation ActionScript 3.0 Animation - Making Things Move>>一书中谈舞台边界反弹时,讲的方法主要是当对象超出边界时,简单的将目标与边界垂直的那个轴位移回来,调整到紧贴边界,如图1。

作者也详细的解释了这种处理方式存在的问题。因为真实情况下目标不可能到达图中虚线球的位置,所以实际上目标与边界平行的那个轴坐标也需要调整,那么应该位移多少呢?请看图2。我们把球沿着它来的方向轨迹往回拉,如图所示,绿球才是实际上正确的与边界接触的位置。

正如作者所说,这个小瑕疵在实际的应用当中基本可以忽略,只有当目标速度较快、每一帧的移动幅度较大或入射角度较小时才可能有视觉上的影响。作者也告诉了大家这个问题可以用三角函数解决。来看一下的已知数:图3。

我们知道球半径、当前位置(虚线球)和角度(用atan函数速度求出),要算出yd的值。大家看一下我的解决方法(数学初中水平,请见谅,完全是后来自己可汗学院补的)。

角度 = atan(y轴速度, x轴速度)

再算出xd这条边的值,xd = ball的半径 - (舞台宽度 - ball.x)

然后,斜边 = xd / cosθ

最后,yd = 斜边 * sinθ,再把这个值从y轴上减去就可以了。

最后附上实际的actionscript3的代码:

 1 var left:Number = 0;
 2 var top:Number = 0;
 3 var right:Number = stage.stageWidth;
 4 var bottom:Number = stage.stageHeight;
 5
 6 var angle:Number = Math.atan2(ball.vy, ball.vx);
 7 var dist:Number = 0;
 8 if (ball.x - ball.radius < left)
 9 {
10     dist = (ball.x - ball.radius) / Math.cos(angle);
11     ball.y -= Math.sin(angle) * dist;
12     ball.x = ball.radius;
13     ball.vx *= bounce;
14 }
15 else if (ball.x + ball.radius > right)
16 {
17     dist = (ball.radius - (right - ball.x)) / Math.cos(angle);
18     ball.y -= Math.sin(angle) * dist;
19     ball.x = right - ball.radius;
20     ball.vx *= bounce;
21 }
22
23 if (ball.y - ball.radius < top)
24 {
25     dist = (ball.y - ball.radius) / Math.sin(angle);
26     ball.x -= Math.cos(angle) * dist;
27     ball.y = ball.radius;
28     ball.vy *= bounce;
29 }
30 else if (ball.y + ball.radius > bottom)
31 {
32     dist = (ball.radius - (bottom - ball.y)) / Math.sin(angle);
33     ball.x -= Math.cos(angle) * dist;
34     ball.y = bottom - ball.radius;
35     ball.vy *= bounce;
36 }

时间: 2024-10-12 15:32:56

ActionScript3学习记录 - 边界反弹平行轴位移的相关文章

Windows API 编程学习记录&lt;三&gt;

恩,开始写API编程的第三节,其实马上要考试了,但是不把这节写完,心里总感觉不舒服啊.写完赶紧去复习啊       在前两节中,我们介绍了Windows API 编程的一些基本概念和一个最基本API函数 MessageBox的使用,在这节中,我们就来正式编写一个Windows的窗口程序. 在具体编写代码之前,我们必须先要了解一下API 编写窗口程序具体的三个基本步骤:             1. 注册窗口类:             2.创建窗口:             3.显示窗口: 恩,

学习记录jQuery的animate函数

很久之前就对jQuery animate的实现非常感兴趣,不过前段时间很忙,直到前几天端午假期才有时间去研究. jQuery.animate的每种动画过渡效果都是通过easing函数实现的.jQuery1.4.2中就预置了两个这样的函数: easing: {linear: function( p, n, firstNum, diff ) {return firstNum + diff * p;},swing: function( p, n, firstNum, diff ) {return ((

HTML5与CSS3权威指南之CSS3学习记录

title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) 官方网站: 华章图书 书中所有代码下载链接: 链接:http://pan.baidu.com/s/1c0oGMn2 密码:f7zt 选择器 属性选择器 [att=val]选择器--选择属性att值为val的元素 [att*=val]选择器--选择属性att值包含val的元素 [att^=val]选择器--选

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]

Objc基础学习记录5

NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendingFormat:可以添加多个类型的字符串. int,chat float,double等 3.stringWithString 创建字符串, 4.rangeOfString 返回str1在另一个字符串中的位置. 5.NSMakeRange(0,3) 字符串0位到3位. 6.deleteCharac

Windows API 编程学习记录&lt;二&gt;

恩,开始写Windows API编程第二节吧. 上次介绍了几个关于Windows API编程最基本的概念,但是如果只是看这些概念,估计还是对Windows API不是很了解.这节我们就使用Windows API 让大家来了解下Windows API的用法. 第一个介绍的Windows API 当然是最经典的MessageBox,这个API 的作用就是在电脑上显示一个对话框,我们先来看看这个API的定义吧: int WINAPI MessageBox(HWND hWnd, LPCTSTR lpTe

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr

Python学习记录-2016-11-29

今日学习记录: 心灵鸡汤: 要有合适自己的目标,一个目标一个目标实现,切忌好高骛远: 最好的投资就是投资自己: 实现梦想 学习,学习,再学习: Talk is cheap. 从本身而言,余三十而立之年,从事测试行业7七年有余,一年半华为外包路由器,两年无线wifi测试,一年半网管软件测试,一年自动化测试经理,推行公司自动化测试进程,从开始的TCL,到现在的python,工欲善其事必先利其器,所以自己来学习,总体我认为我的目标是一直前进的,不断变化的,但是方向并没有大的错误,有些累,所以近期有些懈

程序的机械级表示学习记录

程序的机械级表示学习记录 X86的三代寻址方式 DOS时代的平坦模式,不区分用户空间和内核空间,很不安全. 8086的分段模式. IA32的带保护模式的平坦模式. 对于机械级编程的两种重要抽象 ISA:机械级程序的格式和行为,定义为指令集体系结构,它定义了处理器状态.指令的格式,以及每条指令对状态的影响. 虚拟地址:机器级程序使用的存储器地址,提供的存储器模型看上去是一个非常大的数组.存储器系统的实际实现是将多个硬件存储器和操作系统软件组合起来的. 在GCC中获得汇编代码与反汇编 获得汇编代码: