2017-11-06 10 views
0

私はopentk経由でopenglを使用しており、エンティティ用のコントロールコンポーネントを実装する必要があります。 opentkが入力を処理する方法は、キーボードキーとマウスボタンを異なる列挙型で格納することです。理想的には、私は私の入力このような何かしたいのですが:キーが押された場合、私は容易に判断できるように、それを通して、私はリストにそれを置くことができるように構造化入力管理

class Control 
{ 
    ActionsEnum Action; 
    KeyClass Key; 
} 

と「foreachのを」、そしてもしどのアクションを実行する必要があるか(moveX、ジャンプ、攻撃など)

私はそれを動作させる方法を理解できないので、異なるコントロールタイプの複数のリストを格納するクラスしか考えられません

class Controls 
    { 
     public List<KeyboardInput>   KeyboardInputs   { get; private set; } 
     public List<KeyboardRangeInput>  KeyboardRangeInputs  { get; private set; } 
     public List<MouseInput>    MouseInputs    { get; private set; } 
     public List<MouseRangeInput>  MouseRangeInputs  { get; private set; } 
     public List<MouseMoveRangeInput> MouseMoveRangeInputs { get; private set; } 

     public Controls 
     { 
      //don't initialize lists since that would take up memory 
     } 

     public void AddKeyboardInput(KeyboardInput keyInput) 
     { 
      if(KeyboardInputs == null) 
      { 
       KeyboardInputs = new List<KeyboardInput>(); 
      } 
      KeyboardInputs.Add(keyInput); 
     } 

     public void AddKeyboardRangeInput(KeyboardRangeInput keyInput) 
     { 
      if(KeyboardRangeInputs == null) 
      { 
       KeyboardRangeInputs = new List<KeyboardRangeInput>(); 
      } 
      KeyboardRangeInputs.Add(keyInput); 
     } 

     //and so on 
    } 

誰もがこのような問題に取り組んでいたら、shあなたの経験は、任意のアドバイスは非常に有用だろう:)

+0

抽象基本クラスを持ち、 'KeyboardInput'、' KeyboardRangeInput' ...をそのサブクラスにすることができます。 –

+0

この質問をhttps://codereview.stackexchange.com/に移動することをお勧めします。 –

+0

関数を返すことで抽象クラスを返そうとしましたが、関数が別の変数型を返すことはできません。 この質問を移動するにはどうすればよいですか?私はフラグを立てて報告しますか? –

答えて

0

私はあなたがマウスかどうかに関係なく入力事が押されているかどうかをチェックすることができますカスタム "isactivated"メソッドを実装することでしたキーボードの入力は、将来誰のためのコードです。

私はControlInputをリストに保存し、 "IsActivated"関数を呼び出すことでforeachを行い、アクティブ化されている場合、どのアクションをトリガして処理するのかを読みます。

public enum ControlAction 
{ 
    MoveXPos, MoveXNeg, 
    MoveYPos, MoveYNeg, 
    MoveZPos, MoveZNeg, 
    ScaleXPos, ScaleXNeg, 
    ScaleYPos, ScaleYNeg, 
    ScaleZPos, ScaleZNeg, 
    RotateXPos, RotateXNeg, 
    RotateYPos, RotateYNeg, 
    RotateZPos, RotateZNeg 
} 
abstract public class ControlInput 
{ 
    public ControlAction Action { get; private set; } 
    public ControlInput(ControlAction action) 
    { 
     this.Action = action; 
    } 
    abstract public bool IsActivated(); 
} 

public class KeyboardInput : ControlInput 
{ 
    private Key keyToActivate; 
    public KeyboardInput(Key key, ControlAction action) : base(action) 
    { 
     keyToActivate = key; 
    } 
    public override bool IsActivated() 
    { 
     return Input.KeyboardKeys.IsKeyDown(keyToActivate); 
    } 
} 
public class MouseButtonInput : ControlInput 
{ 
    private MouseButton buttonToActivate; 
    public MouseButtonInput(MouseButton button, ControlAction action) : base(action) 
    { 
     this.buttonToActivate = button; 
    } 
    public override bool IsActivated() 
    { 
     return Input.MouseButtons.IsButtonDown(buttonToActivate); 
    } 
}