【问题标题】:libgdx ashley - How do I control a player the proper way (ECS framework)?libgdx ashley - 如何以正确的方式控制播放器(ECS 框架)?
【发布时间】:2016-07-10 15:05:40
【问题描述】:

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

     }

} 

选项 1 和 2 都经过测试并且有效,选项 3 只是一个想法。

问题

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

【问题讨论】:

    标签: java libgdx 2d amazon-ecs


    【解决方案1】:

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

    第 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);
            }
        }
    }
    

    因此,来自 libgdx 框架的所有原始输入都会被处理并转换为实际的游戏命令,例如:walk、shoot、castSpell 等。这一层允许您在输入传递给InputHandlerIFs 之前对其进行过滤:F.e.本地多人游戏中的控制器编号。

    第 2 层:

    然后我有一个接收命令的命令处理系统:

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

    系统知道玩家的所有位置组件并相应地更新值。

    第 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      相关资源
      最近更新 更多