libgdx ashley - 如何以正确的方式控制玩家(ECS框架)?

ron*_*ipt 0 java 2d amazon-ecs libgdx

我尝试过 在选项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) {

     }

} 
Run Code Online (Sandbox Code Playgroud)

选项1和2都经过测试和工作,选项3只是一个想法.

  • 哪个选项是控制播放器的正确方法?
  • 是否有其他选项可以使用ECS框架控制播放器?

Tom*_*mes 6

我使用三层方法:(伪代码)

第1层:

一些处理来自InputProcessor libgdx类的原始输入的类,如下所示:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,所有的原始输入从libgdx框架来进行处理并转换为像一个实际的游戏命令:步行,射击,castSpell等,这层允许以前被传递给你过滤输入InputHandlerIFS:在本地多铁控制器编号玩家游戏.

第2层:

然后我有一种接收命令的命令处理程序系统:

public class InputHandlerSystem extends EntitySystem implements InputHandlerIF {
    public walk(int playerId, Vector2 direction) {
        positionComponents.getForPlayer(playerId).direction = direction;
    }
}
Run Code Online (Sandbox Code Playgroud)

系统知道播放器的所有positionComponents并相应地更新值.

第3层:

PlayerMovementSystem也知道positionComponents并根据时间增量和positionComponent.direction值更新玩家位置(x和y).

class PlayerMovementSystem extends IteratingSystem {
    update(float delta) {
        ... update player position
    }
}
Run Code Online (Sandbox Code Playgroud)

安装程序如下所示:

Engine engine = new Engine();
InputHandlerSystem ihs = new InputHandlerSystem();
RawInputHandler rih = RawInputHandler();
rih.registerListener(ihs);
engine.addSystem(ihs);
enigne.addSystem(new PlayerMovementSystem());
Run Code Online (Sandbox Code Playgroud)