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

时间:2019-05-28 02:58:25

标签: lance

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

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

方法1 :按下某个键时,直接调整播放器的位置。在我的GameEngine类中:

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

虽然这对于单人游戏效果很好,但不适用于多人游戏。玩家A移动时,他们的位置不会在玩家B的屏幕上更新。

方法2 :设置按键时玩家的状态:

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

然后在通用GameEngine类中添加一个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演示是我项目的基础,因此我的项目使用相同的弯曲,物理引擎等。

1 个答案:

答案 0 :(得分:2)

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

中查看BrawlerGameEngine.js代码

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