碰撞处理这是个很大的话题,要研究的东西太多了,就我所知,就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中物体运动基础之七---------碰撞处理相关推荐

  1. flash中物体运动基础之三---------摩擦力,重力,风力,推力,旋转

    模拟真实的运动效果,加入摩擦力,重力,风力等. private function update(e:Event):void {vx += ax;vy += ay;vx *= _friction;vy ...

  2. 计算机游戏物体运动代码,Flash游戏教程:控制物体运动三法 -电脑资料

    教程|控制 现在用Flash开发的游戏是越来越多了, 方法一:通过单击按钮实现物体的单位运动 这种方法一般在需要按键的游戏中使用.你也可以给某个实体加上这段代码,然后通过单击这个实体达到某种游戏效果. ...

  3. Flash游戏教程:控制物体运动三法

    现在用Flash开发的游戏是越来越多了.很多朋友也很想学习用Flash制作游戏的方法.大家知道,不管在什么游戏中,实现物体的运动是游戏的前提,而不同的游戏里物体移动的方式又不尽相同.所以,想学习制作F ...

  4. 游戏中的物理与数学(一):物体运动算法的实现

    (看了<游戏开发的数学与物理>,感觉很不错,记下点东西. 这是本"图灵程序丛书",对于这个系列的书,我一直是蛮喜欢的,感觉书的内容.排版等,都让人看着很舒服.) 1.1 ...

  5. 物体运动到一个点停止_大颗粒搭建中常见的结构运动

    今天,给大家带来大颗粒搭建中常见的结构 家长们可以带孩子一起将原理编程实践 举一反三,创造创新! 1齿轮传动 齿轮传动是指用主.从动轮的齿轮进行动力传递,从而达到使物体运动的作用. ①  减速传动 当 ...

  6. JavaScriptDay08:js运动基础,单物体运动框架,多物体运动框架,改变单一任意值运动框架,改变多值运动框架,完美运动框架

    目录 0x00 js的运动基础 0x01 单物体运动框架 0x02 多物体运动框架 0x03 改变单一任意值运动框架 0x04 链式运动框架 0x05 改变多值运动框架 0x06 完美运动框架 0x0 ...

  7. pygame里面物体闪烁运动_Pygame-游戏中的运动

    本来,在上一次pygame的教程中,我只是顺手拿了微信"打飞机"里的图来演示用鼠标控制图片位置的操作.后来觉得,这个游戏还算比较适合用来做例子,也有朋友反馈说想做这个游戏,那不如就 ...

  8. 如何消除摄影中的运动模糊?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|计算机视觉life 如果你试过去拍摄一些运动场景,例如拍 ...

  9. 中职计算机应用基础每章知识点,[定稿]中职计算机应用基础教案_1-5章V3.1

    <[定稿]中职计算机应用基础教案_1-5章.doc>由会员分享,可免费在线阅读全文,更多与<[定稿]中职计算机应用基础教案_1-5章(V3.1)>相关文档资源请在帮帮文库(ww ...

最新文章

  1. 哈佛大学通过百度搜索的数据写了篇论文:新冠病毒起源于去年8月的武汉...
  2. 人工智能的价值地图:AI产业增强革命的模式与路径
  3. DeepEarth中的拖放行为(DragBehavior)
  4. php读文阻塞,php socket编程 读完成后写阻塞
  5. Solaris、Mac OS系统日志分析工具
  6. Angular 自动编译部署 Tomcat Jboss
  7. R语言实现混频数据分析实例----midas回归预测
  8. TCMPC进阶之路——accumulate函数应用
  9. eova、easyui及普通DOM表单元素操作
  10. PCB生产工艺流程博大精深
  11. Windows安装本地组策略编辑器
  12. 硬盘的结构和介绍,硬盘MBR详细介绍(超详细彩图)
  13. Adobe Photoshop CC制作简单的个人Logo
  14. java跳转kotlin页面_Kotlin:return与跳转
  15. monit 内存 监控_mac系统监控软件Monity for Mac
  16. 如何了解用户和需求?
  17. OAuth2 logout
  18. Java中内存溢出和内存泄露详解
  19. 【嵌入式04.2】STM32F103C8T6的简易流水灯仿真(寄存器实现+STM32CubeMX实现)
  20. 小甲鱼python课后题百度云盘_【小甲鱼python课后题.doc】下载 - 面包树

热门文章

  1. PHP童鞋改JAVA代码怎么处理
  2. [LeetCode] NO. 242 Valid Anagram
  3. Solr安装及集成javaWeb
  4. 语义化标签——HTML
  5. 2021-01-26数据治理具备哪些优势
  6. 常见的大数据技术类型有哪些
  7. 物联卡可以持续使用的时间有多久?
  8. 手机号归属地区编码_Excel隐藏手机号中间4位的6种方法,你见过几种?
  9. Java对象的两大特征_科学网—Java 面向对象的四个特征 - 李玖栋的博文
  10. 蓝桥训练之前缀和与差分