LoginSignup
0
0

More than 1 year has passed since last update.

Commandパターンの利用:1つのボタンで複数の機能を使えるようにする

Posted at

目的

1つのボタン(機能を割り当てる対象であれば何でもよい)に複数の機能を割り当てることの出来るような柔軟性を持たせるためにはどのように実装すればよいかを知る。

参考 : Game Programing Patterns

要求仕様

ボタンA,B,Cがある時に、ユーザーはそれぞれのボタンにキック、パンチ、ジャンプの機能を自由に割り当てる、実行できること。

image.png

完成動作

ezgif.com-gif-maker.gif

実現方法

お試しコード

Commandクラスを仮想クラスとして、Jump,Punch,Kickそれぞれのクラスが継承し、独自のメソッドを実装しコマンド動作を実現します。
image.png

ボタンA,B,Cにはユーザーが指定したコマンドをAssignButtonCommand()で割り当てます。
ButtonStringでどのボタンに、CommadStringで何のコマンドを割り当てるか指定します。

InputHandler.cs
 public void AssignButtonCommand(string ButtonString, string CommadString)
        {
            //C#の参照はこれでよいのか良く知らない
            ref Command Button = ref GetButtonInstance(ButtonString);

            if (IsKick(CommadString))
            {
                Button = new KickCommand();
            }
            else if (IsJump(CommadString))
            {
                Button = new JumpCommand();
            }
            else if (IsPanch(CommadString))
            {
                Button = new PunchCommand();
            }
            else
            {
                //TODO デフォルト割り当て 各ボタンのデフォルトがセットされるようにする
                Button = new KickCommand();
            }

        } 

実行ボタンが押されると、実行コマンドに選択されているコマンドのインスタンスが取得され、対応するコマンドが実行されます。

Form1.cs
        //実行
        private void checkBox13_CheckedChanged(object sender, EventArgs e)
        {
            Command command = GetActiveButtonCommand();
            label8.Text = command.Execute();

        }

C#は普段使わないので、文法的に間違っている可能性があるので、コアの考え方だけ

Sample.cpp
 class Sample
    {
        //Button_Aにコマンドを割り当てる処理
        //Button_Bにコマンドを割り当てる処理

        //実行
        void func()
        {
            if (//ボタンAが押されたら)
            {
                Button_A.execute();
            }
            else if (//ボタンBが押されたら)
            {
                Button_B.execute();
            }
            else { };
        }
    }

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0