【问题标题】:When I change the position of a sprite, it continues moving on its own当我更改精灵的位置时,它会继续自行移动
【发布时间】: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


【解决方案1】:

不要自己设置 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 forums 上提问。

【讨论】:

  • 所以我想没有办法使用速度呢?我这样做的问题是,当我向蛇添加另一个段时,该段必须“复制”每个其他段所做的运动,这在使用速度时并非易事。我仍然很好奇我的代码为什么会这样。
  • 嗯,速度是恒定的,它总是2。只取决于你知道的方向,然后计算速度。自己设置位置是在绕过物理。你可以做到,但要知道你绕过了物理学。
  • 很公平。如果手动设置位置是我不应该做的事情,那么我的问题的答案几乎是“不要那样做”。我可以接受这一点并找到不同的方法。干杯。
  • FWIW 这就是我想要做的(显然闪烁更少):ivarni.github.io/snake。我最终使用补间而不是手动设置位置。
  • Phaser 示例中有一个 Snake 示例 (examples.phaser.io/debug.php?f=arcade%20physics/snake.js) - 我个人只会使用物理来移动头部,然后可以根据头部位置手动定位身体。无论如何,这就是我链接到的代码示例所做的。
猜你喜欢
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多