libgdx ashley - 如何以正确的方式控制播放器(ECS 框架)?
libgdx ashley - How do I control a player the proper way (ECS framework)?
我试过的方法 在选项 1 中,我创建了 PlayerControlled 类 来控制播放器(它工作正常)。但我不想要这样控制球员的方式,我怀疑这不是正确的方式。
// Option 1
class PlayerComponent implements Component {
// player data here
}
class PlayerSystem extends IteratingSystem {
// player logic here
}
class PlayerControlledComponent implements Component{
// Player entity
}
class PlayerControlledSystem extends IteratingSystem {
// Keyboard Input
// Player entity
}
// Option 2
engine.getSystem(PlayerSystem.class).attack()
// Option 3
class PlayerController {
PlayerConroller(Player player) {
}
}
Both option 1 & 2 are tested and working, option 3 is just an idea.
问题
- 哪个选项 is/are 控制播放器的正确方式?
- 是否有任何其他选项可以使用 ECS 框架控制播放器?
我使用三层方法:(伪代码)
第 1 层:
一些 class 处理来自 InputProcessor libgdx class 的原始输入,如下所示:
public interface InputHandlerIF {
void walk(int playerId, Vector2 direction);
void jump();
.....
}
class RawInputHandler implements InputProcessor {
private InputHandlerIF listener;
private Vector2 direction;
onKeyDown(int keycode) {
if(keycode == W) {
direction = valueToWalkForward;
listener.walk(playerId, direction);
}
}
}
因此来自 libgdx 框架的所有原始输入都会被处理并转换为实际的游戏命令,例如:行走、射击、castSpell 等。该层允许您在将输入传递给 InputHandlerIF
s:F.e。本地多人游戏中的控制器编号。
第 2 层:
然后我有这种接收命令的命令处理程序系统:
public class InputHandlerSystem extends EntitySystem implements InputHandlerIF {
public walk(int playerId, Vector2 direction) {
positionComponents.getForPlayer(playerId).direction = direction;
}
}
系统知道玩家的所有 positionComponents 并相应地更新值。
第 3 层:
PlayerMovementSystem 也知道 positionComponents 并根据时间增量和 positionComponent.direction
值更新玩家位置(x 和 y)。
class PlayerMovementSystem extends IteratingSystem {
update(float delta) {
... update player position
}
}
设置如下所示:
Engine engine = new Engine();
InputHandlerSystem ihs = new InputHandlerSystem();
RawInputHandler rih = RawInputHandler();
rih.registerListener(ihs);
engine.addSystem(ihs);
enigne.addSystem(new PlayerMovementSystem());
我试过的方法 在选项 1 中,我创建了 PlayerControlled 类 来控制播放器(它工作正常)。但我不想要这样控制球员的方式,我怀疑这不是正确的方式。
// Option 1
class PlayerComponent implements Component {
// player data here
}
class PlayerSystem extends IteratingSystem {
// player logic here
}
class PlayerControlledComponent implements Component{
// Player entity
}
class PlayerControlledSystem extends IteratingSystem {
// Keyboard Input
// Player entity
}
// Option 2
engine.getSystem(PlayerSystem.class).attack()
// Option 3
class PlayerController {
PlayerConroller(Player player) {
}
}
Both option 1 & 2 are tested and working, option 3 is just an idea.
问题
- 哪个选项 is/are 控制播放器的正确方式?
- 是否有任何其他选项可以使用 ECS 框架控制播放器?
我使用三层方法:(伪代码)
第 1 层:
一些 class 处理来自 InputProcessor libgdx class 的原始输入,如下所示:
public interface InputHandlerIF {
void walk(int playerId, Vector2 direction);
void jump();
.....
}
class RawInputHandler implements InputProcessor {
private InputHandlerIF listener;
private Vector2 direction;
onKeyDown(int keycode) {
if(keycode == W) {
direction = valueToWalkForward;
listener.walk(playerId, direction);
}
}
}
因此来自 libgdx 框架的所有原始输入都会被处理并转换为实际的游戏命令,例如:行走、射击、castSpell 等。该层允许您在将输入传递给 InputHandlerIF
s:F.e。本地多人游戏中的控制器编号。
第 2 层:
然后我有这种接收命令的命令处理程序系统:
public class InputHandlerSystem extends EntitySystem implements InputHandlerIF {
public walk(int playerId, Vector2 direction) {
positionComponents.getForPlayer(playerId).direction = direction;
}
}
系统知道玩家的所有 positionComponents 并相应地更新值。
第 3 层:
PlayerMovementSystem 也知道 positionComponents 并根据时间增量和 positionComponent.direction
值更新玩家位置(x 和 y)。
class PlayerMovementSystem extends IteratingSystem {
update(float delta) {
... update player position
}
}
设置如下所示:
Engine engine = new Engine();
InputHandlerSystem ihs = new InputHandlerSystem();
RawInputHandler rih = RawInputHandler();
rih.registerListener(ihs);
engine.addSystem(ihs);
enigne.addSystem(new PlayerMovementSystem());