我正在将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演示是我项目的基础,因此我的项目使用相同的弯曲,物理引擎等。
答案 0 :(得分:2)
第一种方法更好。示例集中的 Brawler 游戏完全符合您的描述。您可以在https://github.com/lance-gg/tinygames/tree/master/brawler
中查看BrawlerGameEngine.js
代码
确保操作已在方法中处理
GameEngine::processInput(inputData, playerId)