flash中物体运动基础之七---------碰撞处理
碰撞处理这是个很大的话题,要研究的东西太多了,就我所知,就as3而言它提供了三种方法来检测碰撞,它们是:
hitTestPoint,hitTestObject,hitTest
前两个方法是应用于显示对象上的,后面一个用于位图像素级的碰撞检测,具体使用方法帮助文档中有详细介绍的。
关于位图的碰撞检测和更高级的碰撞检测在《Flash Actionscript 3.0 动画高级教程》中有详细介绍,有兴趣的可以看一下,这里只讨论规则形状的hitTestPoint方法。
启动FlashDevelop,新建一个FlashIDE工程,新建一个Fla文件,创建一个MC,里面画上两根线条,线条要粗一些(原因稍后),将新建的MC拖入舞台,定义一个实例名称_roadBlock;
再新建一个Ball类,定义vx,vy分别表示Ball的x,y方向的速度,再在Fla文件的库中新建一个Ball类的实例。
新建一个Main类,作为Fla的文档类
一。简单的碰撞检测
简单碰撞检测,这里只是调用了hitTestPoint方法,主要代码如下:
_ball.vy += GRAVITY;
if (_roadBlock.hitTestPoint(_ball.x,_ball.y,true))
{
_ball.vy = 0;
}
_ball.y += _ball.vy;
在EnterFrame事件中检测_roadBlock是否碰到_ball,_ball的注册点在其几何中心,这样检测时在球体速度为0之前实际上球体早已碰到了线条。如上。
二。复杂一点的检测,精确一点的检测
上面是检测的球体的中心不能满足需求,而现在要检测球体边缘的点。效果如下:
要检测圆周上的点与障碍物的碰撞,先要取得圆周上的点,现在一直圆的半径和圆的坐标,则能取得圆周上的点。
半径:r = _ball.width/2;
圆周上的点:px=r*Math.cos(angle);py=r*Math.sin(angle);
angle取值范围为0~2*Math.PI,当angle为0时,px=r,py=0;当angle=90时,px=0,py=r;......
现在的问题是,究竟取圆周上的哪些点?
实际上要取所有的点,关键是取点的精度,即angle的增量,设dt为angle增量:
设dt=90,那么每一个EnterFrame需要做碰撞检测的只有圆周上的四个点,四个点中任一个碰到障碍物,即碰撞发生,设球体速度为0。
设dt=30,那么每一个EnterFrame需要做碰撞检测的就有360/30=12个点,12个点种任意一个碰到障碍物,即碰撞发生,比前面检测的点更多了。
设dt=1,那么每一个EnterFrame需要做碰撞检测的就有360个点。。。。。。
测试中,虽然360个点,但对于准确的检测还是很大误差,那将dt设为更小如:0.001,0.00001那么这样点数为36000,3600000或更大,但dt越小会导致检测一周的点的时间变长,导致占用的cup时间会更多,要取一个适当的数才行。
//每一个EnterFrame中要检测碰撞的次数
private var precision:Number = 20;
_ball.vy += GRAVITY;
for (var i:int = 0; i < precision;i++ )
{
var x:Number = _ball.x+radius * Math.cos(360*i/precision);
var y:Number = _ball.y+radius * Math.sin(360*i/precision);
if (_roadBlock.hitTestPoint(x,y,true))
{
_ball.vy = 0;
}
}
_ball.y += _ball.vy;
同样是上面的代码,现在将障碍物中水平的那根线去掉,然后再检测会有不准确了,如下:
这个原因何在?或许还得寻找更加准确的碰撞检测方法。
三。检测碰撞的次数
在每一次EnterFrame中调用下面的代码,这样能显示每一次EnterFrame发生时有多少个点被检测到已经碰撞了。调整precision的值,_count的值会变化。
_count = 0;
_ball.vy += GRAVITY;
for (var i:int = 0; i < precision;i++ )
{
var x:Number = _ball.x+radius * Math.cos(360*i/precision);
var y:Number = _ball.y+radius * Math.sin(360*i/precision);
if (_roadBlock.hitTestPoint(x,y,true))
{
_ball.vy = 0;
_count++;
}
}
textField.text = "" + _count;
_ball.y += _ball.vy;
_ball.x += _ball.vx;
为了更直观的看到碰撞的点,现在在每次碰撞时,根据所碰撞的点求出一个平均位置,来绘制一条线条,代码如下:
_count = 0;
var sumX:Number = 0;
var sumY:Number = 0;
_ball.vy += GRAVITY;
for (var i:int = 0; i < precision;i++ )
{
var x:Number = _ball.x+radius * Math.cos(360*i/precision);
var y:Number = _ball.y+radius * Math.sin(360*i/precision);
if (_roadBlock.hitTestPoint(x,y,true))
{
_ball.vy = 0;
sumX += x;
sumY += y;
_count++;
}
}
if (_count>0)
{
x = sumX / _count;
y = sumY / _count;
lineMC.graphics.clear();
lineMC.graphics.lineStyle(1);
lineMC.graphics.moveTo(x, y);
lineMC.graphics.lineTo(_ball.x, _ball.y);
}
textField.text = "" + _count;
_ball.y += _ball.vy;
_ball.x += _ball.vx;
lineMC是Main类中新定义的一个MC,当有碰撞发生时用来绘制线条。效果如下:
转载于:https://www.cnblogs.com/ywxgod/archive/2010/07/31/1789335.html
flash中物体运动基础之七---------碰撞处理相关推荐
- flash中物体运动基础之三---------摩擦力,重力,风力,推力,旋转
模拟真实的运动效果,加入摩擦力,重力,风力等. private function update(e:Event):void {vx += ax;vy += ay;vx *= _friction;vy ...
- 计算机游戏物体运动代码,Flash游戏教程:控制物体运动三法 -电脑资料
教程|控制 现在用Flash开发的游戏是越来越多了, 方法一:通过单击按钮实现物体的单位运动 这种方法一般在需要按键的游戏中使用.你也可以给某个实体加上这段代码,然后通过单击这个实体达到某种游戏效果. ...
- Flash游戏教程:控制物体运动三法
现在用Flash开发的游戏是越来越多了.很多朋友也很想学习用Flash制作游戏的方法.大家知道,不管在什么游戏中,实现物体的运动是游戏的前提,而不同的游戏里物体移动的方式又不尽相同.所以,想学习制作F ...
- 游戏中的物理与数学(一):物体运动算法的实现
(看了<游戏开发的数学与物理>,感觉很不错,记下点东西. 这是本"图灵程序丛书",对于这个系列的书,我一直是蛮喜欢的,感觉书的内容.排版等,都让人看着很舒服.) 1.1 ...
- 物体运动到一个点停止_大颗粒搭建中常见的结构运动
今天,给大家带来大颗粒搭建中常见的结构 家长们可以带孩子一起将原理编程实践 举一反三,创造创新! 1齿轮传动 齿轮传动是指用主.从动轮的齿轮进行动力传递,从而达到使物体运动的作用. ① 减速传动 当 ...
- JavaScriptDay08:js运动基础,单物体运动框架,多物体运动框架,改变单一任意值运动框架,改变多值运动框架,完美运动框架
目录 0x00 js的运动基础 0x01 单物体运动框架 0x02 多物体运动框架 0x03 改变单一任意值运动框架 0x04 链式运动框架 0x05 改变多值运动框架 0x06 完美运动框架 0x0 ...
- pygame里面物体闪烁运动_Pygame-游戏中的运动
本来,在上一次pygame的教程中,我只是顺手拿了微信"打飞机"里的图来演示用鼠标控制图片位置的操作.后来觉得,这个游戏还算比较适合用来做例子,也有朋友反馈说想做这个游戏,那不如就 ...
- 如何消除摄影中的运动模糊?
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|计算机视觉life 如果你试过去拍摄一些运动场景,例如拍 ...
- 中职计算机应用基础每章知识点,[定稿]中职计算机应用基础教案_1-5章V3.1
<[定稿]中职计算机应用基础教案_1-5章.doc>由会员分享,可免费在线阅读全文,更多与<[定稿]中职计算机应用基础教案_1-5章(V3.1)>相关文档资源请在帮帮文库(ww ...
最新文章
- 哈佛大学通过百度搜索的数据写了篇论文:新冠病毒起源于去年8月的武汉...
- 人工智能的价值地图:AI产业增强革命的模式与路径
- DeepEarth中的拖放行为(DragBehavior)
- php读文阻塞,php socket编程 读完成后写阻塞
- Solaris、Mac OS系统日志分析工具
- Angular 自动编译部署 Tomcat Jboss
- R语言实现混频数据分析实例----midas回归预测
- TCMPC进阶之路——accumulate函数应用
- eova、easyui及普通DOM表单元素操作
- PCB生产工艺流程博大精深
- Windows安装本地组策略编辑器
- 硬盘的结构和介绍,硬盘MBR详细介绍(超详细彩图)
- Adobe Photoshop CC制作简单的个人Logo
- java跳转kotlin页面_Kotlin:return与跳转
- monit 内存 监控_mac系统监控软件Monity for Mac
- 如何了解用户和需求?
- OAuth2 logout
- Java中内存溢出和内存泄露详解
- 【嵌入式04.2】STM32F103C8T6的简易流水灯仿真(寄存器实现+STM32CubeMX实现)
- 小甲鱼python课后题百度云盘_【小甲鱼python课后题.doc】下载 - 面包树