[英]When I change the position of a sprite, it continues moving on its own
我正在尝试使用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坐标会自动改变,而不仅是在我明确设置它的时候。
不要自己设置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论坛上提问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.