我正在尝试使用 Phaser.js 创建一个 Snake 游戏,但是在移动头部时我被卡住了。
为了让自己更轻松,我选择不使用任何速度并通过手动设置精灵的坐标来处理移动,我的理论是一旦蛇长大并且每个部分都需要移动,这将更容易处理移动到它前面的段曾经占据的相同位置。我基本上打算将我的游戏世界视为一个网格,如果一切都有速度,那将不会很容易。
我有一个update
函数应该在每 50 次调用时移动一次我的精灵。
function update() {
snake.body.velocity.x = 0;
snake.body.velocity.y = 0;
if (cursors.up.isDown && direction !== 'down') {
direction = 'up';
} else if (cursors.down.isDown && direction !== 'up') {
direction = 'down';
} else if (cursors.left.isDown && direction !== 'right') {
direction = 'left';
} else if (cursors.right.isDown && direction !== 'left') {
direction = 'right';
}
if (updateCount % 50 === 0) {
moveSnake();
}
updateCount += 1;
}
function moveSnake() {
switch(direction) {
case 'up': snake.y -= 2; break;
case 'down': snake.y += 2; break;
case 'left': snake.x -= 2; break;
case 'right': snake.x += 2; break;
}
}
但这似乎触发了某种速度,即使我明确地将其设置为 0。蛇(让我们假设它看起来像一个)将保持一次移动 2 个像素,直到下一次moveSnake
被调用,此时它将加快步伐并同时移动 4 个像素,直到它到达游戏区域的边缘。
我在create
函数中创建了精灵并启用了街机物理引擎,如下所示:
game.physics.startSystem(Phaser.Physics.ARCADE);
game.world.setBounds(0, 0, 800, 600);
snake = game.add.sprite(400, 300, 'snake-body');
game.physics.enable(snake, Phaser.Physics.ARCADE);
snake.body.collideWorldBounds = true;
我已经验证了节流是update
有效的,moveSnake
并且不会在每个游戏循环中都被调用。
github上的完整源代码(但老实说,这里没有比我刚刚粘贴的更多内容)
编辑
为了消除一些混乱,在我的代码中moveSnake
只被调用了 3 次(尝试添加断点),我预计精灵在这 3 次调用中只移动了 6 个像素,但实际上它移动了 400 个像素。我的问题是为什么精灵的 x 坐标会自行改变,而不仅仅是当我明确设置它时。