0

我已经被这个问题困扰了很长时间,我已经搜索了很多东西并尝试了一些东西,但没有任何效果。有些解释对我来说很难理解,因为我对整体编程很陌生,还有很多东西要学。

我有两个问题

1:速度太快时,球有时不会撞到砖块。

2:球能够击中2块砖。这两个问题都与 60 fps 不足以让我的碰撞检测类型正常工作有关。

我只需要有人以尽可能简单的方式解释我需要做些什么来进行碰撞检测以防止这种情况发生。

这是我当前的碰撞代码:

private function checkCollision(): void {
  grdx = Math.floor((ball.x) / 28);
  grdy = Math.floor((ball.y) / 14);
  ngrdx = Math.floor((ball.x + dx) / 28);
  ngrdy = Math.floor((ball.y + dy) / 14);
  var flipX: Boolean = false;
  var flipY: Boolean = false;
  if ((grdy <= level.length - 1) && 
      (ngrdy <= level.length - 1) && 
      (grdy >= 0 && ngrdy >= 0)) {
    if (testBlock(grdx, ngrdy)) {
      flipY = true;
      paddleFlag = 1;
    }
    if (testBlock(ngrdx, grdy)) {
      flipX = true;
      paddleFlag = 1;
    }
    if (testBlock(ngrdx, ngrdy)) {
      flipX = true;
      flipY = true;
      paddleFlag = 1;
    }
    dx *= flipX ? -1 : 1;
    dy *= flipY ? -1 : 1;
  }
}
private function testBlock(xPos: int, yPos: int): Boolean {
  if (level[yPos][xPos] > 0 && level[yPos][xPos] != 13) {
    trace("hit on X,Y");
    level[yPos][xPos] = 0;
    breakBlock("Block_" + yPos + "_" + xPos);
    trace("Block: " + totalBreaks + " / " + totalBlocks);
    return true;
  }
  return false;
}
private function breakBlock(blockName: String): void {
  if (this.getChildByName(blockName)) {
    this.removeChild(this.getChildByName(blockName));
    totalBreaks++;
  }
}

谢谢你,对不起我的英语不好,它不是我的母语。

4

2 回答 2

1

一种解决方案是以较小的迭代移动球,在给定的帧中多次移动。

例如,我给出的解决方案是假设您根据上一帧经过的时间移动球。

假设自上次帧更新以来已经过去了 30 毫秒。在这种情况下,您将在该帧中更新移动/碰撞两次,使用 15 毫秒作为您的时间流逝。

你想要的碰撞分辨率越高,你要做的迭代就越多。

这是一个例子:

 // class declarations
 var lastFrame:Number;
 var iterationsPerFrame:int;

function startGame():void
{
     // lets specify 3 updates per frame
     iterationsPerFrame = 3;

     // save initial time
     lastFrame = getTimer();

     // create your listener
     addEventListener(Event.ENTER_FRAME, update);
}

function update(e:Event):void
{
     var currentFrame:Number = getTimer();
     var deltaTime:Number = (currentFrame - lastFrame)/1000;

     var iterationDelta:Number = deltaTime/iterationsPerFrame;

     for (var index:int = 0;index < iterationsPerFrame;index++)
     {
          // I'm assuming dx,dy are the velocity of the ball, in pixels per second
          ball.x += dx * iterationDelta;
          ball.y += dy * iterationDelta;
         // check collision
     }


     // set lastFrame to the currentFrame time, preparing for next frame
     lastFrame = currentFrame;

     // after this, your frame is going to render
}
于 2013-04-25T17:10:42.383 回答
0

您可以根据球A的速度计算出每帧球的行进距离 ( )、球与桨的距离 ( B) 以及是否A > B手动触发该帧的碰撞。

您实际上是在检查每个积木XY与球X和坐标进行Y坐标,因此如果积木存储在数组中,则变为: Sqrt( Sqrd(p2.x - p1.x) + Sqrd(p2.y - p1.y) )

for(var i=0; i<brickArray.length; i++)
{
    var distance:Number = Math.sqrt((brickArray[i].x - ball.x) * (brickArray[i].x - ball.x) +
                                    (brickArray[i].y - ball.y) * (brickArray[i].y - ball.y));
}

这是一个非常好的高速碰撞检测教程:http: //www.newgrounds.com/bbs/topic/1072673

于 2013-04-25T16:59:40.970 回答