open-mgl-dev (開発バージョン) (0.7.9.80) | 2009-11-02 22:25 |
open-mgl (DirectX9, VC++2008) (0.7.9) | 2009-09-27 20:32 |
roast-dev (開発バージョン) (0.0.1.40-dev) | 2009-11-02 23:09 |
>Wikiトップ>August Framework>AF_チュートリアル3
(本項で説明する機能は ver 0.7.0 以降でのみ使えます。)
>前回
今回はキーボードイベントをハンドルしてみます。
・・・キーボードイベントのハンドルに関してなのですが、「OnLButtonDown()」みたいのは今回予め用意されていません。
流石に OnKeyboardA(), OnKeyboardB(), OnKeyboardC(), ... とか作ってくのは大変ですからね・・・。
キーボードイベントの場合には、MFC方式で、メソッドは自分で適当な名前で適当に用意して、スーパークラスのイベント・ハンドラ・リストへと登録する形をとります。
- #include "stdafx.h"
- // メインフレームクラス
- class CMglTestFrame : public CMglguiWindow
- {
- public:
- void OnInit(){
- RegistKbHandler(
- MGL_KB_EVT_HANDLER_EVTTYPE_ON_PRESS,
- DIK_A,
- (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::OnKbA);
- }
- bool OnKbA(){
- ::MessageBox(NULL,"test","test",NULL);
- return true;
- }
- };
- CMglTestFrame g_frame;
- // WinMain
- int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow )
- {
- g_frame.Start();
- return 0;
- }
「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_~ で指定する必要がありますが・・・)
以上の事を踏まえて、もうちょっと凝ったプログラムを作るとすると、例えばこんな感じですかね。
- #include "stdafx.h"
- class CMglTestFrame : public CMglguiWindow
- {
- private:
- CMglAghImage m_img;
- public:
- void OnInit(){
- m_img.Load("test.jpg");
- CMglguiWindow::RegistControl(&m_img);
- // キーボードイベントハンドラ登録(左)- 押している間移動
- RegistKbHandler(
- MGL_KB_EVT_HANDLER_EVTTYPE_ON_PRESS,
- DIK_LEFT,
- (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::MoveLeft);
- // キーボードイベントハンドラ登録(右)- 押している間移動
- RegistKbHandler(
- MGL_KB_EVT_HANDLER_EVTTYPE_ON_PRESS,
- DIK_RIGHT,
- (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::MoveRight);
- // キーボードイベントハンドラ登録(上)- 離した瞬間だけ移動
- RegistKbHandler(
- MGL_KB_EVT_HANDLER_EVTTYPE_ON_KEYUP,
- DIK_UP,
- (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::MoveUp);
- // キーボードイベントハンドラ登録(下)- 押した瞬間だけ移動
- RegistKbHandler(
- MGL_KB_EVT_HANDLER_EVTTYPE_ON_KEYDOWN,
- DIK_DOWN,
- (MGL_KB_EVT_HANDLER_CALLBACK)&CMglTestFrame::MoveDown);
- }
- bool MoveLeft(){
- m_img.Move(-1,0);
- return true;
- }
- bool MoveRight(){
- m_img.Move(1,0);
- return true;
- }
- bool MoveUp(){
- m_img.Move(0,-10);
- return true;
- }
- bool MoveDown(){
- m_img.Move(0,10);
- return true;
- }
- };
- CMglTestFrame g_frame;
- // WinMain
- int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lpCmdLine,
- int nCmdShow )
- {
- g_frame.Start();
- return 0;
- }
キーボードの十字キーにて左とか右とか下とか上とか押すと test.jpg がそれに合わせて動くプログラム。
左右は押している間ずっと移動、下には下キーを押した瞬間、上には上キーを離した瞬間に動きます。
って言うか CMglAghImage::Move() とか、しれっと、さりげなーく使っているわけですが・・・んまぁ、こんな機能もあります、と言うことで・・・。(何