【发布时间】:2016-02-01 02:48:08
【问题描述】:
我正在尝试使用 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 坐标会自行改变,而不仅仅是在我明确设置时。
【问题讨论】:
-
您直接修改了
moveSnake中的 x 和 y 位置,而不是对它们应用速度。它应该更像snake.x += snake.body.velocity.x。 -
@MikeC 我不希望它有速度。我想将精灵移动给定数量的像素,然后我希望它保持静止,直到我告诉它再次移动。
-
速度可以是移动的像素数。问题是你告诉它“每帧向某个方向移动 2 个像素”。当您在
moveSnake中不断更新位置时,为什么希望它保持静止? -
@MikeC 我不会不断地更新位置,
moveSnake在演示中只会在精灵移出屏幕之前被调用 3 次。它仅在计数器模 50 等于 0 时调用,这发生在每 50 次执行update时。我希望它在其他 49 次update被调用时保持静止。
标签: javascript phaser-framework