2013-06-27 88 views
0

我正在使用Canvas在JavaScript中使用游戏。所讨论的精灵水平或垂直移动(但不是两个)。游戏区域被划分为16个x16像素单元(与精灵大小相同)以进行碰撞。我从左上角(而不是中心)绘制精灵。我已经研究出如何检测精灵是否跨越了一个新的单元格。精灵碰撞的单元格中心

var modX = sprite.x % 16; 
var modY = sprite.y % 16; 
if (modX == 0 && modY == 0) 
{ 
    // Sprite has entered new cell. Do appropriate functions 
} 

我现在需要制定出来的时候,精灵是在其中让我有点头疼,因为它是不一样的上面,加入半个单元宽度的单元格中间....我希望有人能够用一些伪代码来帮忙。 并记住:我是一个试图更好地使用javascript的艺术家 - 所以对我来说很容易,好吧。

回答

1

你都很近,小区中间是仅仅意味着一个余数是7:

var modX = sprite.x % 16; 
var modY = sprite.y % 16; 
if (modX == 7 || modY == 7) 
{ 
    // in the middle of a cell 
} 

但是,如果我可以有可能是两件事情改变:
1-处理网格偏移量所以你可以决定你的游戏布局。
2-记住你刚刚进来的细胞不要做两次事情的中心

// somewhere in the init of the game ...// 
var gridX = 0, gridY = 0; 
var lastCenterCol = -1, lastCenterRow = -1; 

// in your game loop // 
var modX = (sprite.x - gridX)% 16; 
var modY = (sprite.y - gridY)% 16; 
var column = (sprite.x - gridX - modX)/16; 
var row = (sprite.y- gridY - modY)/16; 

if ((column!=lastCenterCol) && (row!=lastCenterRow) && ((modX == 7) || (modY == 7))) 
{ 
    lastCenterCol=column; 
    lastCenterRow=row; 
    // Sprite just entered this cell center. 
} 
+0

谢谢伙计们。我终于弄清楚自己会错在哪里。这不是我的数学!当精灵在左上方时,他实际上是在24,16而不是以前认为的16,16。所以你可以想象为什么事情不起作用。 –

+0

好的,你发现很好。我想知道你是否有抵消问题,这就是为什么我在我的答复中添加抵消部分。哟! – GameAlchemist

1

从我的头顶,我会做同样的,你

var modX1 = sprite.x%8; 
var modY1 = sprite.y%8; 

var modX2 = sprite.x%16; 
var modY2 = sprite.y%16; 

if ((modX1 == 0) && (modY1 == 0) && (modX2 != 0) && (modY2 != 0)) 
{ 
    //sprite is in the center of the tile... 
} 

简单地检查它是否除以8,这是你的一半,然后确保它不被16是划分你的细胞边缘。

0

您可能会更好地创建一个Grid并将其添加到它。这有助于很多,速度更快。这是我对Java-Gaming.Org

实现语言文章Java,但你可以很容易地把它翻译成JavaScript。