WikiトップAugust Framework>AF_チュートリアル3

August Framework : チュートリアル 3 ~ もうちょっと動きのあるプログラムを作ってみる(キーボードイベント編)

(本項で説明する機能は ver 0.7.0 以降でのみ使えます。)

前回

今回はキーボードイベントをハンドルしてみます。

・・・キーボードイベントのハンドルに関してなのですが、「OnLButtonDown()」みたいのは今回予め用意されていません
流石に OnKeyboardA(), OnKeyboardB(), OnKeyboardC(), ... とか作ってくのは大変ですからね・・・。

キーボードイベントの場合には、MFC方式で、メソッドは自分で適当な名前で適当に用意して、スーパークラスのイベント・ハンドラ・リストへと登録する形をとります。

  1. #include "stdafx.h"
  2. // メインフレームクラス
  3. class CMglTestFrame : public CMglguiWindow
  4. {
  5. public:
  6. void OnInit(){
  7. RegistKbHandler(
  8. MGL_KB_EVT_HANDLER_EVTTYPE_ON_PRESS,
  9. DIK_A,
  10. (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::OnKbA);
  11. }
  12. bool OnKbA(){
  13. ::MessageBox(NULL,"test","test",NULL);
  14. return true;
  15. }
  16. };
  17. CMglTestFrame g_frame;
  18. // WinMain
  19. int APIENTRY WinMain(HINSTANCE hInstance,
  20. HINSTANCE hPrevInstance,
  21. LPSTR lpCmdLine,
  22. int nCmdShow )
  23. {
  24. g_frame.Start();
  25. return 0;
  26. }

「A」のキーが押されると OnKbA() が呼び出されるように、OnInit() 内にて RegistKbHandler() を使ってハンドラを登録しています。
第一引数の「MGL_KB_HANDLER_EVTTYPE_ON_PRESS」は「キーが押されている間」の意味です。
他にも MGL_KB_EVT_HANDLER_EVTTYPE_ON_KEYDOWN と MGL_KB_EVT_HANDLER_EVTTYPE_ON_KEYUP があります。これらはそれぞれ押された瞬間、
及び離された瞬間のみそのメソッドを呼び出す、と言うもの。

ハンドラメソッドは「bool Hoge()」な宣言の形を取ります(メソッド名は任意)。復帰値のbool型には、処理を続行するか否かを返します。
プログラムを続行する場合にはtrueを、終了させる場合にはfalseを返します。

第二引数には「どのキーを押したとき」と言うのを指定します。この場合は先の通り「A」。
DirectXの方のヘッダ「dinput.h」に定義されている DIK_~ と言う定数を指定します。 他のキーの場合はどんな風に指定すればいいのかは、まぁ、dinput.h 内の DIK_~ の所を見てもらうか、MSDNのここらへんとか。 他にも「キーボード デバイス定数」でぐぐると有志の人のサイトが幾つか出てきたりします。

あとは、CMglKeyboardInput::AsciiToDik() にて、ASCIIコードからDIKコードへ変換が出来るので、それを使っても良いかも知れません。(まぁ勿論、ASCIIコードとして無い十字キーとかは直接 DIK_~ で指定する必要がありますが・・・)

以上の事を踏まえて、もうちょっと凝ったプログラムを作るとすると、例えばこんな感じですかね。

  1. #include "stdafx.h"
  2. class CMglTestFrame : public CMglguiWindow
  3. {
  4. private:
  5. CMglAghImage m_img;
  6. public:
  7. void OnInit(){
  8. m_img.Load("test.jpg");
  9. CMglguiWindow::RegistControl(&m_img);
  10. // キーボードイベントハンドラ登録(左)- 押している間移動
  11. RegistKbHandler(
  12. MGL_KB_EVT_HANDLER_EVTTYPE_ON_PRESS,
  13. DIK_LEFT,
  14. (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::MoveLeft);
  15. // キーボードイベントハンドラ登録(右)- 押している間移動
  16. RegistKbHandler(
  17. MGL_KB_EVT_HANDLER_EVTTYPE_ON_PRESS,
  18. DIK_RIGHT,
  19. (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::MoveRight);
  20. // キーボードイベントハンドラ登録(上)- 離した瞬間だけ移動
  21. RegistKbHandler(
  22. MGL_KB_EVT_HANDLER_EVTTYPE_ON_KEYUP,
  23. DIK_UP,
  24. (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::MoveUp);
  25. // キーボードイベントハンドラ登録(下)- 押した瞬間だけ移動
  26. RegistKbHandler(
  27. MGL_KB_EVT_HANDLER_EVTTYPE_ON_KEYDOWN,
  28. DIK_DOWN,
  29. (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::MoveDown);
  30. }
  31. bool MoveLeft(){
  32. m_img.Move(-1,0);
  33. return true;
  34. }
  35. bool MoveRight(){
  36. m_img.Move(1,0);
  37. return true;
  38. }
  39. bool MoveUp(){
  40. m_img.Move(0,-10);
  41. return true;
  42. }
  43. bool MoveDown(){
  44. m_img.Move(0,10);
  45. return true;
  46. }
  47. };
  48. CMglTestFrame g_frame;
  49. // WinMain
  50. int APIENTRY WinMain(HINSTANCE hInstance,
  51. HINSTANCE hPrevInstance,
  52. LPSTR lpCmdLine,
  53. int nCmdShow )
  54. {
  55. g_frame.Start();
  56. return 0;
  57. }

キーボードの十字キーにて左とか右とか下とか上とか押すと test.jpg がそれに合わせて動くプログラム。
左右は押している間ずっと移動、下には下キーを押した瞬間、上には上キーを離した瞬間に動きます。

って言うか CMglAghImage::Move() とか、しれっと、さりげなーく使っているわけですが・・・んまぁ、こんな機能もあります、と言うことで・・・。(何