我有一个基于街机游戏的基于网格的自上而下游戏,我希望我的玩家在网格位置之间精确移动。但是我该怎么办?
我现在使用速度在按下键盘上移动播放器,然后在update
上将速度重置为0,这样就没有惯性了。
function update(){
this.player.body.velocity.x = 0
this.player.body.velocity.y = 0
if(this.keyIsLeft){
this.player.body.velocity.x -= 200
}
else if(this.keyIsRight){
this.player.body.velocity.x += 200
}
else if(this.keyIsUp){
this.player.body.velocity.y -= 200
}
else if(this.keyIsDown){
this.player.body.velocity.y += 200
}
但是如何让玩家一次只能移动一个正方形(或半个正方形)?
此Lolo游戏中显示了理想的动作,在任何给定时间,玩家都处于网格或半网格空间:https://www.youtube.com/watch?v=QQKScIJYUxU&t=5m30s
我不能只设置x和y位置或使用补间,因为我需要保持街机物理,并且这些调整会干扰它们。
答案 0 :(得分:0)
更新: 这是我为解决这种情况而更新的答案。 我基于Phaser提供的示例实现了此方法。 进行此固定移动的关键部分是在移动项目时禁用键盘输入。
比方说,如果您按下left
键,那么player
就会向左移动。 player
开始移动时,将变量notMoving
设置为false,这会通知update
函数不接受任何光标输入。超时后,假设为1000毫秒,您可以将变量notMoving
设置为true。然后update
函数将继续获取光标输入。
以下是示例代码段:
function create ()
{
cursors = this.input.keyboard.createCursorKeys();
player = this.physics.add.image(400, 300, 'block');
player.setCollideWorldBounds(true);
player.setData('notMoving', true);
}
function setfixedMovement(velocity, direction) {
if (direction === 'up') {
player.setVelocityY(-velocity);
} else if (direction === 'down') {
player.setVelocityY(velocity);
} else if (direction === 'left') {
player.setVelocityX(-velocity);
} else {
player.setVelocityX(velocity);
}
player.setData('notMoving', false);
setTimeout(() => {
player.setData('notMoving', true);
}, 1000);
}
function update () {
if (player.getData('notMoving')) {
player.setVelocity(0);
if (cursors.left.isDown) {
setfixedMovement(300, 'left');
} else if (cursors.right.isDown) {
setfixedMovement(300, 'right');
}
if (cursors.up.isDown) {
setfixedMovement(300, 'up');
} else if (cursors.down.isDown) {
setfixedMovement(300, 'down');
}
}
}
我将移相器示例链接放在上一个答案中。如果您编辑示例并将示例代码的一部分替换为我上面提供的代码段,则可以看到它按预期工作。
上一个答案:
我认为此移相器示例完全可以完成您想做的事情
简而言之, 在每次更新中,将速度设置为0, 然后检测检查光标键状态并相应地设置速度 以下代码是从Official Phaser 3 Example复制的
function update ()
{ player.setVelocity(0);
if (cursors.left.isDown)
{
player.setVelocityX(-300);
}
else if (cursors.right.isDown)
{
player.setVelocityX(300);
}
if (cursors.up.isDown)
{
player.setVelocityY(-300);
}
else if (cursors.down.isDown)
{
player.setVelocityY(300);
}
}
这里是示例的链接 https://labs.phaser.io/view.html?src=src\input\keyboard\cursor%20keys.js