1

我正在尝试使用 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 坐标会自行改变,而不仅仅是当我明确设置它时。

4

1 回答 1

3

不要自己设置 x 和 y,让物理处理它,通过给身体相应的速度。

function moveSnake() {
    snake.body.velocity.x = 0;
    snake.body.velocity.y = 0;

    switch(direction) {
        case 'up': snake.body.velocity.y = -2; break;
        case 'down': snake.body.velocity.y = 2; break;
        case 'left': snake.body.velocity.x = -2; break;
        case 'right': snake.body.velocity.x = 2; break;
    }
}

您也可以在Phaser 论坛上提问。

于 2014-09-05T20:37:29.357 回答