使用 Lance 游戏引擎进行基于图块的运动?

Tile-based movement with Lance game engine?

我将 Lance 用于游戏区域是平铺地图的游戏。当玩家按下左箭头键时,他们的角色应该向左移动一个方块,依此类推。我尝试了两种方法,见下文,但都没有用。

是否可以修改这两种方法以适用于基于图块的移动?或者是否需要第三种方法?还是兰斯不适合这种游戏?

方法一: 按下按键时直接调整播放器的位置。来自我的 GameEngine class:

if (inputData.input == 'left') {
  player.position.x -= 32;
  player.angle = 180;
}

虽然这对单人游戏很有效,但在多人游戏中却行不通。当玩家 A 移动时,他们的位置不会在玩家 B 的屏幕上更新。

方法二:设置按键按下时播放器的状态:

if (inputData.input == 'left') {
  player.state = 'walkLeft';
}

然后在通用GameEngineclass中添加一个postStep处理程序。 (将其添加到 Player 无效)。此代码将玩家(经过许多步)转向 180 度,然后朝该方向加速玩家:

onPostStep(event) {
  let players = this.world.queryObjects({instanceType: Player});
  players.forEach(player => {
    if (player.state == 'walkLeft') {
      if (Math.abs(player.angle - 180) > 2)
        player.turnLeft(2);
      }
      else {
        player.accelerate(1);
        player.state = '';
      }
    }
  })
}

使用这种方法,如果玩家按下左箭头键,他们的角度一开始会按预期改变,但加速度和移动不稳定。此外,玩家 A 的位置在他们的屏幕上与玩家 B 的屏幕上显示不同。

Spaaace 演示是我项目的基础,所以我的项目使用相同的弯曲、物理引擎等。

第一种方法更好。示例集合中的 Brawler 游戏完全符合您的描述。您可以查看https://github.com/lance-gg/tinygames/tree/master/brawler

中的BrawlerGameEngine.js代码

确保动作在方法中被处理 GameEngine::processInput(inputData, playerId)