WikiトップAugust Framework 2.0>AF2_tutorial6

August Framework 2.0 : チュートリアル 6 ~ 入力イベントに関係なく実行する処理

いざゲームを作ろうとしてみると、単純な入力操作に対してだけでなく
何も入力されていない状態にも、なんらかの処理を行う必要が出てきます。

  1. #include "mglaugust2.h"
  2. class CMyFrame : public CAugustWindowFrame2
  3. {
  4. private:
  5. CAugustImage2 m_img;
  6. CAugustKeyboardInput m_kb;
  7. // 今回新たに追加
  8. int m_moveX;
  9. int m_moveY;
  10. public:
  11. // 初期化時に呼ばれる
  12. bool OnGraphicInitEnded()
  13. {
  14. RegistControl(&m_img);
  15. RegistControl(&m_kb);
  16. m_img.Load("test.jpg");
  17. // キーボードイベントハンドラ登録(左)
  18. m_kb.RegistHandler(
  19. CAugustKeyboardInput::ON_PRESS,
  20. AGH_KEYCODE_LEFT,
  21. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::MoveLeft,
  22. this);
  23. // キーボードイベントハンドラ登録(右)
  24. m_kb.RegistHandler(
  25. CAugustKeyboardInput::ON_PRESS,
  26. AGH_KEYCODE_RIGHT,
  27. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::MoveRight,
  28. this);
  29. // キーボードイベントハンドラ登録(上)
  30. m_kb.RegistHandler(
  31. CAugustKeyboardInput::ON_PRESS,
  32. AGH_KEYCODE_UP,
  33. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::MoveUp,
  34. this);
  35. // キーボードイベントハンドラ登録(下)
  36. m_kb.RegistHandler(
  37. CAugustKeyboardInput::ON_PRESS,
  38. AGH_KEYCODE_DOWN,
  39. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::MoveDown,
  40. this);
  41. // キーボードイベントハンドラ登録(スペースキー)
  42. m_kb.RegistHandler(
  43. CAugustKeyboardInput::ON_PRESS,
  44. ' ',
  45. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::MoveStop,
  46. this);
  47. // キーボードイベントハンドラ登録(Zキー)
  48. m_kb.RegistHandler(
  49. CAugustKeyboardInput::ON_PRESS,
  50. 'Z',
  51. (CAugustKeyboardInput::CALLBACK_TYPE_MI)&CMyFrame::MoveToInitial,
  52. this);
  53. // move変数の初期化
  54. m_moveX = 0;
  55. m_moveY = 0;
  56. return true;
  57. }
  58. // 各ハンドラメソッド
  59. bool MoveLeft(){
  60. m_moveX = -1;
  61. m_moveY = 0;
  62. return true;
  63. }
  64. bool MoveRight(){
  65. m_moveX = 1;
  66. m_moveY = 0;
  67. return true;
  68. }
  69. bool MoveUp(){
  70. m_moveX = 0;
  71. m_moveY = -1;
  72. return true;
  73. }
  74. bool MoveDown(){
  75. m_moveX = 0;
  76. m_moveY = 1;
  77. return true;
  78. }
  79. // 今回は以下を追加
  80. bool MoveStop(){
  81. m_moveX = 0;
  82. m_moveY = 0;
  83. return true;
  84. }
  85. bool MoveToInitial(){
  86. m_img.SetPos(0,0);
  87. MoveStop();
  88. return true;
  89. }
  90. bool OnFrameDoUser(){
  91. m_img.Move(m_moveX, m_moveY);
  92. return true;
  93. }
  94. };
  95. // WinMain
  96. int APIENTRY WinMain(HINSTANCE hInstance,
  97. HINSTANCE hPrevInstance,
  98. LPSTR lpCmdLine,
  99. int nCmdShow )
  100. {
  101. CMyFrame frame;
  102. frame.Start();
  103. return 0;
  104. }

今回新たに、「OnFrameDoUser()」と言うメソッドをオーバーライドし、記述しています。
このメソッドが、入力イベントに関係なく、一定間隔(デフォルト1/60秒間隔)で呼ばれます。

上記サンプルコードでは、この OnFrameDoUser() にて、m_img.Move() を呼び出し、画像を移動させています。
移動量は、新たに定義した変数 m_moveX、m_moveY で、これらの値は、キーボード入力(十字キー)により、変化します。
・・・まぁ百聞は一見にしかず、です。実際に動かしてみた方が一発で分かる事でしょう。

また、新たにキーボードハンドラを二つ追加しています。スペースキーと、Zキーです。
スペースキーを押す事により、移動が停止し、Zキーを押す事により、画像の位置が初期位置(0,0)に戻るようになっています。
(SetPos()メソッドは、指定されたX,Yの位置にコントロールを移動させる)


補足

今回のサンプルでは、変数 m_moveX、m_moveY を OnGraphicInitEnded() 内にて初期化していますが、
プログラミング一般的に礼儀正しくは、コンストラクタ内にて初期化するのがベストかも知れません。

ただ、コントロール関連の初期化は OnGraphicInitEnded() で行う必要があるため、
初期化処理がコンストラクタと OnGraphicInitEnded() で分かれるのは若干の混乱を招きます。
不注意によりコントロール関連の初期化処理を誤ってコンストラクタに記述してしまうかも知れません。

m_moveX、m_moveY のようなプリミティブな変数をコンストラクタで初期化するように記述しても構いませんが、
その場合、上記のようなミスを起こさないように気をつけてください。