« GW中に読んでいた本、「レベルアップ」のゲームデザイン ―実戦で使えるゲーム作りのテクニック | トップページ | マップ作成の効率を上げたくて2 »

2013.05.12

マップ作成の効率を上げたくて1

| |コメント (0)|トラックバック (0)

 このエントリーをはてなブックマークに追加

何度か書いているけど「初音ミク冒険記」は
14歳からはじめるC言語わくわくゲームプログラミング
という本をベースにして作っている。

この本の接地判定や壁の判定用のマップデータは、
始点X座標, 始点Y座標, 終点X座標, 終点Y座標
という形式で作られている。

しかし、初音ミク冒険記では、
2Dゲームなんだけど、3Dのベクトル計算関数VAddなどを使うために
ゲーム内部ではZ座標を持っていたり
飛び降りや天井の判定ができるようにマップデータを拡張している。
このため、上記の本に付属のマップエディタを使えない。
(しかも、このツールは、ソースがないので修正できない・・・orz)

これまでどうしてたかというと、
1.テキストエディタで座標を打ち込む
2.ちゃんとミクがジャンプして届くかなどを
  初音ミク冒険記を起動してチェックする
というのを繰り返し行なっていた。

初音ミク冒険記でマップデータを再読み込みするには
マップの初期処理を行う必要があるので
そのマップでセーブしたデータをロードするという手順になる
一応、毎回初音ミク冒険記を起動し直す必要がないのは良いのだが
ロードし直すのも面倒だったりする。

ずーっと前から、さすがにこれでは、作業がしづらい
と思っていたのだが、
ゲーム中の毎フレームでマップデータが更新されていないかチェックする
というのもなんだし
マップデータが更新されていないかチェックするスレッドを立てるのも
微妙な気がしていた。

まず、テキストエディタでデータを打つ時に
今編集しているのが何のデータか分からなくなったり
「,」の数を間違えたりしてた。
対策としては、データ自体はCSV形式なんで表計算ソフトで作る方法がある。

こっちはまだ何とかなりそうだが、
チェックの都度、セーブデータをロードするのは何とかできないか・・・

初音ミク冒険記にマップ編集モードとかを付けるのが無難?

Astlibraでは、ソースでマップ編集モードにすると
マップを編集できるので、これがいいのかなぁと考えたりもした。

こんな感じで、ずーと悶々としてたのだけど
解決方法を思いついた。

結局、マップ用のファイルが更新された通知を
初音ミク冒険記本体が受け取れたら良いのだ。

問題は、どうやって、その通知が受け取れるかだ。

Spy++とかを使ったことがある人は分かると思うけど
Windowsの内部では、Windowsメッセージという通知がバンバン行われている。
例えば、マウスを移動するとMOUSE_MOVEが飛ぶ。

この通知のユーザ定義版としてWM_USERというのがある。
マップ用ファイル編集ツールは、この通知を飛ばし
初音ミク冒険記本体がこの通知を受け取れれば良い。

DXライブラリを使っているのでWindowsメッセージの処理は
あらかたDXライブラリが処理してしまう。
なんか、Windowsメッセージをフックする方法はあるのかな?

と思って「DXライブラリ3.10a 関数プロトタイプ宣言」調べてみると
DXライブラリの非公開関数でSetHookWinProcというのを見つけた。

DXライブラリのソースを見るとSetHookWinProcの後で
処理されなかったWindowsメッセージをWindowsに任せる処理があったので
処理したいWindowsメッセージだけを純粋にフックする
Windowプロシージャを記載にすればOKそうなことが分かった。

■DxLib_Initの後でメインループに入る前


SetHookWinProc(HookWinProc);

という記述をする

■実際のHookWinProc


//*******************************************************
// ウィンドウズへ渡すメッセージに割り込むフック関数
//
// ※基本的に初音ミク冒険記関連の開発ツールから
//  初音ミク冒険記本体へアクセスするために使う予定
//  例えば、初音ミク冒険記のマップデータ作成ツールで
//  作成したマップデータを再読み込みさせるなど
//
// ※昔の感覚で当初はWM_USER+αの実装を指定たが、
//  現在は、EM_XXXX などで WM_USER+αが使われているため
//  WM_APP+αが推奨されている(α:0~0x3FFFまでの整数)
//*******************************************************
LRESULT CALLBACK HookWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
int returnMsgFlgMapCreator = FALSE;
switch(msg){
case WM_APP://WM_APP受信時
printfDx("WM_APP受信\n");
break;
case WM_APP + 1://WM_APP+ 1() 受信時
//printfDx("WM_APP+1受信\n");
// クリップボードへ現在ロード中のフルパスのマップファイル名を格納
SetClipboardText(lastLoadMapFullPathFileName);
returnMsgFlgMapCreator = TRUE;
break;
case WM_APP + 2://WM_APP+ 2() 受信時
//printfDx("WM_APP+2受信\n");
gameMode = GAME_MODE_GAME_INIT;
saveDataLoadedFlg = SAVEDATA_LOADED_ON;
break;
// ここで処理されないウィンドウズメッセージは
// DXライブラリのメッセージ処理後に
// DefWindowProcを呼び出して処理される
}
// 初音ミク冒険記マップクリエーターへメッセージを送信
if(returnMsgFlgMapCreator == TRUE){
HWND hWndMapCreator = FindWindow(NULL, "初音ミク冒険記マップクリエーター");
if(hWndMapCreator != NULL){
SendMessage(hWndMapCreator, msg, 0, 0);
CloseHandle(hWndMapCreator);
}
}
return 0;
}

これで初音ミク冒険記本体側の処理はOKだ。


 このエントリーをはてなブックマークに追加

| |コメント (0)|トラックバック (0)

このエントリーへのリンク

このエントリーのリンクを入れるHTML:

トラックバック

この記事へのトラックバックの一覧です: マップ作成の効率を上げたくて1:

コメント

このブログの新着コメントをRSSリーダに登録する為のxml




←名前とメールアドレスは必須です。
URLも記入すれば、URLのみが公開されます。
メールアドレスのみですと、メールアドレスが公開されてしまいますので、御注意ください。

↓コメント本文では、「a href」「b」「i」「br/」「p」「strong」「em」「ul」「ol」「li」「blockquote」「pre」のタグが使えます。絵文字をクリックすると、本文にタグを挿入できます。