2013-04-20 74 views
1

我正在构建一款JavaScript砖块以打破游戏乐趣。演示可以播放here。但是,您会看到所有冲突都没有处理。在砖头破碎游戏中找到最接近砖头的砖块

在试图通过直接计算来处理碰撞(而不是遍历整个砖块阵列)时,我需要在每个刻度处找到距离我球最近的砖块,以便比较它的边界和我的球的边界并找出是否有碰撞。

我有一个2D bricksArray,我这样做是为了找到最接近的砖:

var col = Math.floor((_ballX + _ballDirX * Breakoid.BALL_SIZE)/(_brickWidth + Breakoid.EMPTY_SPACE)) 
var row = Math.floor((_ballY + _ballDirY * Breakoid.BALL_SIZE)/(Breakoid.BRICK_HEIGHT + Breakoid.EMPTY_SPACE)) 

我建议你see the code in its context清楚地了解什么,我试图做的。 (我承诺我的试验和调试的东西让你看,也许比我更了解我的问题,这些混乱发生在第208行和第246行之间)。

其实这两个Math.floor都很奇怪(因为我没有正确使用它们)。它通常会找到比实际最近的砖块向上或向下的值1,这导致了像bricksArray[1][-1]这样的东西当然不存在并且会抛出错误。或者bricksArray[1][2],当最近的砖块实际上是[1][1],这不是很好,因为我生气了。

那么,我怎样才能找到最接近我的球的砖?(希望这是做的最好的方式)

另外:我的球,目前在只有4方向移动,因为_ballDirX_ballDirY只能采取1-1。我知道三角形圈的东西,但然后我想知道如果碰撞仍然是“那么简单”...

回答

1

你需要检查rowcol值的每个方向的球。通过这种方式,您可以根据其方向确定球会碰撞哪些砖。

// Bricks collision stuff 
if (topBall <= Breakoid.NBROWS * (Breakoid.BRICK_HEIGHT + Breakoid.EMPTY_SPACE) {    

    // find the closest brick based on direction of ball 
    if(_ballDirX==1 && _ballDirY==1) { 
     var col = Math.floor((rightBall + _brickWidth)/(_brickWidth + Breakoid.EMPTY_SPACE))-1 
     var row = Math.floor((bottomBall)/(Breakoid.BRICK_HEIGHT + Breakoid.EMPTY_SPACE)) 
    } 
    else if(_ballDirX==1 && _ballDirY==-1) { 
     var col = Math.floor((rightBall + _brickWidth)/(_brickWidth + Breakoid.EMPTY_SPACE)) -1 
     var row = Math.floor((topBall + Breakoid.BRICK_HEIGHT)/(Breakoid.BRICK_HEIGHT + Breakoid.EMPTY_SPACE)) - 1 
    } 
    else if(_ballDirX==-1 && _ballDirY==1) { 
     var col = Math.floor((leftBall + _brickWidth)/(_brickWidth + Breakoid.EMPTY_SPACE))-1 
     var row = Math.floor((bottomBall)/(Breakoid.BRICK_HEIGHT + Breakoid.EMPTY_SPACE)) 
    } 
    else if(_ballDirX==-1 && _ballDirY==-1) { 
     var col = Math.floor((leftBall + _brickWidth)/(_brickWidth + Breakoid.EMPTY_SPACE))-1 
     var row = Math.floor((topBall + Breakoid.BRICK_HEIGHT)/(Breakoid.BRICK_HEIGHT + Breakoid.EMPTY_SPACE)) - 1 
    } 

    // avoid wrong values of row and col 
    // when the player is over the game borders.  
    try{ 
     var brick = _bricksArray[row][col] 

     // check for collision 
     if (_bricksArray[row][col].present) { 
      if (topBall == brick.bottomBorder) { 
       console.log("top hit") 
       _ballDirY = 1 
       _bricksArray[row][col].present = false 
      } else if (rightBall == brick.leftBorder) { 
       console.log("right hit") 
       _ballDirX = -1 
       _bricksArray[row][col].present = false 
      } else if (bottomBall == brick.topBorder) { 
       console.log("bottom hit") 
       _ballDirY = -1 
       _bricksArray[row][col].present = false 
      } else if (leftBall == brick.rightBorder) { 
       console.log("left hit") 
       _ballDirX = 1 
       _bricksArray[row][col].present = false 
      } 
     } 

    }catch(e){ 
     // console.log("row: " + row + " col: " + col) 
    } 
} 

也许你会发现这个代码中的一些问题,因为它没有完全测试。不过,希望你明白这个主意。

我强烈推荐这个“突破”教程从杰克·戈登:
http://codeincomplete.com/posts/2011/6/11/javascript_breakout/

它涵盖全面推行使用HTML5画布“突围”的游戏。

他把冲突以及其问题本especific文章:http://codeincomplete.com/posts/2011/6/12/collision_detection_in_breakout/

上面提到的文章可能不适合您的需求,但你可以有关于如何实现在游戏中的几个特点很好的见解。