2012-03-31 57 views
1

阅读了很多关于球物理学的知识后,请观看一些示例和尝试使用位图制作弹球的几天,我需要帮助。我使用简单(易于使用)和快速性能物理AS3引擎的位图http://coreyoneil.com/portfolio/index.php?project=5,但仍然无法解决以下问题:如果球移动太快而对象路径太小,则不会有碰撞检测(代码只能完美工作与更大的物体或如果球移动较慢)。我不善于物理和数学。下面是功能代码,这使得物理的球上的各帧速率(但也许它能够更好地将其更改为的setTimeout):Flash AS3 - 球物理学(快速移动和路径上的小物体)

function showFrame(e:Event) // onEnterFrame 
    { 
     var collisions:Array = collisionlist.checkCollisions(); 
     if(collisions.length) // if collision 
     { 
      var collision:Object = collisions[0]; // get collision information 
      var angle:Number = collision.angle; // get collision angle 
      var overlap:int = collision.overlapping.length; // get collision overlap 
      var sin:Number = Math.sin(angle); 
      var cos:Number = Math.cos(angle); 
      var vx0:Number = vx * cos + vy * sin; 
      var vy0:Number = vy * cos - vx * sin; 
      vx0 = ((mass - immovable) * vx0)/(mass + immovable); // var immovable:Number=10000; var mass:Number=immovable*2; 
      vx = vx0 * cos - vy0 * sin; 
      vy = vy0 * cos + vx0 * sin; 
      vx -= cos * overlap/radius; // radius=Math.round(ball.width/2); 
      vy -= sin * overlap/radius; 
      vx += speed; // var speed:Number=0; 
     }   
     vy += gravity; // var gravity:Number=0.75; 
     vy *= friction; // var friction:Number=0.981; 
     vx *= friction; 
     ball.x += vx; 
     ball.y += vy; 
     //setTimeout(showFrame, 20); 
    } 

回答

0

您可以使用子步骤。

它很简单,但工作很好,基本上你可以根据你想要的步数来划分你的速度,然后有一个for循环来测试这些增量的冲突。

这是一个很好的例子/教程:http://www.samclifton.com/tutorials.php?tut=2

+0

非常有用。我应该把质量变成价值1,导致球有时会卡住(现在它反弹得更多)。我需要更好地测试它,但是现在的代码现在可以在任何移动时与1个像素对象发生碰撞。我将发布当前代码更改与信贷。 – speedy 2012-04-01 07:18:07

+0

太棒了,唯一要记住的是,在为一个游戏世界(5至20个以上的对象)做这些之后,它可能需要一点点的表现。因此,如果您有10个碰撞对象,并且您需要5个步骤,则每帧将进行50次碰撞测试。 – 2012-04-02 01:23:58

0

耶这样的问题可能是,你的计算允许它超越的地步当你提高速度时它会发生碰撞。所以你可以做的是增加帧率或者像你说的那样用一个计时器在后台执行这个逻辑并且允许帧率保持不变,然后降低你的速度或者重力或者你需要做的任何事情来让它在合理的速度并且不允许部件跳过彼此。