突破Flash:我需要帮助来改善我的Brick n Ball碰撞

时间:2013-04-25 16:56:48

标签: actionscript-3 flash collision breakout

我已经在很长一段时间里一直坚持这个问题,我已经搜索了很多东西并尝试了一些东西,但没有任何效果。有些解释对我来说很难理解,因为我对整体编程很新,并且有很多东西需要学习。

我有两个问题

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++;
  }
}

谢谢你,抱歉我的英语不好,不是我的母语。

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

您可以根据球的速度,球与球拍的距离(A)以及手动触发B来确定每个球的移动距离(A > B)框架碰撞。

您基本上检查每个砖块XY坐标到球XY坐标,因此如果砖块存储在数组中,则变为: 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