技術文章>ゲーム・パズル関係
チョコットランド:
ハンゲームで遊べるオンラインMMORPG
通称:ちょこらん
みんなでいっしょに冒険
モンスターを倒し、経験値をゲットし、レベルアップ〜
アイテムをゲットし、装備を合成〜
クエストをクリアして、貴重なアイテムをゲット〜
職業:戦士、魔法使い、僧侶、盗賊
それぞれ一長一短がある。
他のプレイヤーと協力してモンスターを倒し・アイテム集めしたり、
装備・アイテム交換したり、装備を合成したり、チャットしたりするのは楽しい
豊富な装備・アクセサリーがあり、一部ではお着替えゲームと化している
不満:
不満を解消するために、補助ツール:チョコリランを開発した。
画面を上図に示す。
以下の機能を持つ
言語:C++、開発環境:VC6、テキストエディタ:ViVi
起動直後またはメニューにより、チョコットランドウィンドウを検索し、メンバ変数に格納しておく。
m_pWnd = CWnd::FindWindow(NULL, "チョコットランド"); if( m_pWnd == NULL ) AfxMessageBox("チョコットランド ウィンドウを発見できませんでした。");
タイマー割り込みにより、1秒に1回簡単な画面認識を行い経験値割合を表示する。
経験値は画面左上に黄色のグラフで表示されるので、その部分を CDC::GetPixel(x, y) により判定する
CDC *pDC = m_pWnd->GetDC(); // 画面デバイスコンテキスト取得 int exp = 0; {for(int x = 0; x < 100; ++x) { COLORREF col = pDC->GetPixel(EXP_X0 + x, EXP_Y0); // EXPグラフ部分の画面色をゲット if( col != COL_EXP ) break; exp += 1; }}
[- +] ボタンは状況により位置が異なるので、そのピクセルパターンを検索する。
チョコットランドウィンドウを順次直接参照すると時間がかかるので、
ビットマップにいったん転送してから単純な線形検索を行っている。
CBitmap bm; bm.CreateCompatibleBitmap(pDC, 800, 450); CDC dcBM; VERIFY(dcBM.CreateCompatibleDC(pDC)); dcBM.SelectObject(bm); dcBM.BitBlt(0, 0, CHOKO_WIN_WD, CHOKO_WIN_HT, pDC, 0, CHOKO_WIN_Y0, SRCCOPY); for(int x = 0; x < CHOKO_WIN_WD; ++x) { for(int y = 0; y < CHOKO_WIN_HT; ++y) { if( isMinusPlus(&dcBM, x, y) ) { // x y 位置に [- +] ボタンがあるかどうかを判定 point.x = x; point.y = y + CHOKO_WIN_Y0; ReleaseDC(pDC); return true; } } } ReleaseDC(pDC); return false;
売る数、捨てる数を増減させる場合は、前節の手順によりその位置を求め、SendMessage で WM_LBUTTONDOWN、WM_LBUTTONUP を送ればよい。
for(int i = 0; i < n; ++i) { // n はボタンを押す回数 m_pWnd->SendMessage(WM_LBUTTONDOWN, 0, MAKELONG(x, y)); m_pWnd->SendMessage(WM_LBUTTONUP, 0, MAKELONG(x, y)); ::Sleep(1000/n); }
チャット入力部分に文字を入力するには、WM_KEYDOWN、WM_KEYUP を送り、フォーカスを設定し、 文字列は WM_CHAR メッセージにより送信する。
m_pWnd->SendMessage(WM_KEYDOWN, VK_RETURN); // [Enter] キー m_pWnd->SendMessage(WM_KEYUP, VK_RETURN); m_pWnd->SendMessage(WM_CHAR, *ptr); // 文字列入力
チョコットランドの操作性の不満を解消するための補助ツール:チョコリラン を開発した。
簡単な画面認識を行い、情報表示を可能にした。
ユーザの指定により Windows メッセージをチョコットランド送ることで、チョコットランドの操作を実現した。
チョコリランにより、ちょこらんが快適により楽しくプレイできるようになった。
ちょこらんのやりすぎに注意しましょう。