使用 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)
我将 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)