● NPCとの会話 ●マップの中をキャラクターが自由に移動できるようになりました次はNPCとの会話に挑戦です会話はRPGゲームを作る作業の中で最も自由度が高い作業です思い描いたストーリーに合わせたセリフや会話による様々な分岐など会話の骨組みのプログラムを作ってしまえばわりと気軽に設定できますまずはNPCと会話するにはどうすれば良いのかを考えていきましょうNPCが居ることを判断する条件式 前章でキャラクターが移動する時に進む先の地形が何かを判断する条件式を組みましたその条件式に進んだ先がNPCという条件を追加するという方法が一番楽だと思います 進んだ先は人(15)の場合とカウンター(2)の場合に会話が発生するので平地ではなかった場合の条件式として加えていきましょう 会話の部分に、その結果を入れるようにしますここに会話を表示するプログラムを組みたいところですが重要な注意点がありますWM_LBUTTONDOWNが発生した後にはWM_PAINTが呼び出されますWM_PAINT内にはマップを表示させるプログラムがあるためここ(LBUTTONDOWN)で会話を表示させてもすぐにマップを表示させるプログラムに上書きされてしまいますなので、マップを表示させるプログラムが終了した後に会話のプログラムを作る必要があるのです会話の内容表示関数 WM_PAINT内のマップやキャラクターの表示処理が終わった後にKaiwa()という関数を作りましょうこの関数の内訳ですが会話が成立しなかった可能性が考えられるので念のため戻り値を取れるint型で定義以下の関数をグローバルで定義してくださいint Kaiwa(HDC kdc, int kx, int ky);引数はHDC型と、int型が2つ理由は後ほど説明していきます そして関数の中身ですまず、青枠表示された部分でキャラクターの現在位置を判断しています会話窓を表示させる時、キャラクターと会話窓が被ってしまわないように会話窓を表示させる場所をマップに対してキャラクター位置の逆側になるよう調整しています文字を表示させるのはTextOut()という関数です第1引数 HDC(デバイスコンテキスト)第2引数 文字の先頭を表示させるx座標第3引数 文字の先頭を表示させるy座標第4引数 文字列第5引数 文字数描画にはWM_PAINTで使用しているデバイスコンテキストを使用するためKaiwa()第1引数にはWM_PAINTで作成されているHDCを受け渡していますそしてSetBkMode()SetTextColor()という関数は文字を表示させる上でのオプション関数と考えて良いと思いますSetBkMode()にはTRANSPARENT(文字の背景透過、指定しないと四角い枠が付きます)を指定SetTextColor()では文字色をRGB(赤、緑、青)で1~255の数値によって指定できます xx=0;yy=0;(グローバル変数int型 で定義してください)の部分ですがこの2つにはキャラクターの現在位置ではなく会話座標(人・カウンター)の座標を格納しますそして、Kaiwa()関数にその座標を受け渡し、受け取ったら即、座標をリセットしています 何故そんな面倒な処理が必要になるのか説明すると会話の条件式があるWM_LBUTTONDOWNとKaiwa()関数を実行するWM_PAINTには相関関係は無く、windowからメッセージが送られた際には個々に命令を実行するからですん・・?でもWM_LBUTTONDOWNの中にWM_PAINTを呼び出す命令があるじゃん確かに、マウスクリックが発生した際はWM_PAINTが呼ばれるようにしていますですが、WM_PAINTは「再描画が必要な時」にwindowから呼ばれるのでプログラムを組む人が想定していない時にKaiwa()関数を実行する可能性があります何故組んだコードが 思ったとおりに動かないのか分からない場合の大きな原因のひとつとしてこうしたウインドウメッセージによるトラップが挙げられますそれに対してのバグ対策だと思ってください試しにこの1行を消して実行してみるとウインドウメッセージというものが何か分かり易くなるかもしれませんkx、kyにはxx、yyからそれぞれ受け取った会話をする人がいる場所が入っていますのでそれを条件式にしてその場所にいる人との会話の内容を作ります仕上げ 会話の枠のビットマップをキャラクターの位置の反対側に表示しその上に文字を表示するKaiwa()関数が出来ましたこれで準備は全て整ったので再度NPCが居るかどうか判断する条件式に戻りましょう 条件式の//会話//の部分は上のようになりますKaiwa()関数に受け渡すためxx,yyに会話座標を設定しますクリックで進んだ座標(実際には進まない)が入る形になります実行結果 x=2、y=1の場所にいる人との会話ですあとはNPCのいる場所を元にKaiwa()関数内に条件式を追加していきましょう 会話の内容は自由です好きなように入力していってみてください マップ下方にいる人と会話した時は会話は上方に表示されます会話による分岐ここまで出来たら会話が発生した時の分岐は非常に簡単ですKaiwa()関数の中で会話を表示させた時にイベントを発生させるだけです例えば、●話したら通れるようになる所がある●↓指定した座標のマップチップを別なものに変える人(15)を(0)にすればその人はいなくなります ●アイテムが手に入る HPが回復する● ↓それぞれに該当する変数の値を変える●状態によって会話の内容が変わる●↓フラグの変数を用意してフラグが立っていれば表示する会話の内容を条件式で変更するといった感じでとても楽に、様々なアクションを起こすことができます準備は大変ですがこの自由度の高さがゲームプログラミングの魅力ですNPCとの会話時に自分のホームページやSNSYouTubeチャンネルを表示させることなども出来てしまいます発想次第で何でも出来ます 次章はRPGで戦闘に突入するための「エンカウント」と、戦闘に突入して画面を表示させるところまで解説したいと思いますお楽しみに!