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 让自己变得更好——所以对我来说放轻松,好吧。

4

3 回答 3

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,即单元格的边缘。

于 2013-06-27T08:54:18.203 回答
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.
 }
于 2013-06-27T10:03:58.523 回答
0

您最好创建一个 Grid 并将精灵添加到其中。这很有帮助,而且速度更快。这是我关于 Java-Gaming.Org 的文章

实现语言是 Java,但您可以轻松地将其翻译成 JavaScript。

于 2013-06-27T08:59:14.290 回答