キー入力で自分位置が移動するようにする
大改造はいります。まずプレイヤー構造体を作ります。構造体定義は新しくヘッダーファイルstruct.hをつくり、そこに記述します。メンバ変数はx座標、y座標とします。座標系は左上を(0,0)とし、右方向がxの正方向、下方向がyの正方向とします。また、(0,0)のときしっかりボードの上にプレイヤーがいる状態になるよう描画位置を修正します。また、その構造体をグローバルにします。本体はgame.cppに記述します。構造体の外部変数宣言も他の変数と同じように記述します。なお、構造体の宣言はC++がサポートしている方法で行います(宣言するときにstructをつけない)。
とりあえず構造体をつくり、左上のマスにプレイヤーを表示するところまで作ります。
- struct.hを追加、構造体の定義を記述
- main.hにPlayer構造体を外部変数宣言する。struct.hを読み込ませる。読み込ませないとコンパイラは未定義の構造体を宣言されたと判断する。
- game.cppにボードの左上に画像を描画するように書き換える、構造体の本体を宣言する。デバッグ用に座標を表示させる
struct.h
struct SPlayer{ int x,y; };
main.h
... void Clear(); // クリアの関数 void Retire(); // リタイアの関数 #include"struct.h" // 構造体定義のヘッダーを読み込む extern SPlayer Player; // プレイヤー構造体
game.cpp
... int PlayerGraphic; SPlayer Player; // プレイヤー構造体の本体 // ゲームの関数 // 戻り値 なし 引数 なし void Game(){ for(int y=0 ; y<8 ; y++){ for(int x=0 ; x<8 ; x++){ DrawGraph(x*32+50,y*32+100,BordGraphic[0],FALSE); } } DrawGraph(Player.x*32+50,Player.y*32+100,PlayerGraphic,TRUE); // プレイヤーを描画 DrawFormatString(500,10,white,"Player.x:%d",Player.x); //プレイヤーの位置を描画 DrawFormatString(500,30,white,"Player.y:%d",Player.y); //プレイヤーの位置を描画 ...
コンパイルし、実行してみましょう。うまく表示されましたか?ところで、グロバール変数は初期化しないときは0になるという性質を持ちます。ローカル変数は値が不定なので違いに注意しましょう。0になることが保障されていますが、多くの場合初期化を明示してから使用します。このゲームも将来的には初期化を明記しますが今はまだ実装しません。
Game関数の表示位置については説明を割愛します。なんとなく分かりますよね。今度は、プレイヤーを移動させる関数を追加します。
Game関数の表示位置については説明を割愛します。なんとなく分かりますよね。今度は、プレイヤーを移動させる関数を追加します。
- main.hにMovePlayer関数のプロトタイプ宣言を追加
- game.cppにMovePlayer関数を定義、Game関数からその関数を呼び出す。呼び出すタイミングは描画の後とします。ループとしては画面クリア→描画→計算→画面クリア...となります。この順番は地味に重要です。
main.h
... #include"struct.h" // 構造体定義のヘッダーを読み込む extern SPlayer Player; // プレイヤー構造体 void MovePlayer(); // プレイヤーを移動する
game.cpp
... void Game(){ ... DrawString(400,200,"ゲーム画面です",white); DrawString(400,220,"Zでクリア画面",white); DrawString(400,240,"Xでリタイア",white); MovePlayer(); // プレイヤーを移動する ... } // プレイヤーを移動する関数 // 戻り値なし 引数なし void MovePlayer(){ if( Key[KEY_INPUT_RIGHT] == 1 ) // 右が押されたら Player.x++; // x座標を増やす if( Key[KEY_INPUT_LEFT] == 1 ) // 左が押されたら Player.x--; // x座標を減らす if( Key[KEY_INPUT_DOWN] == 1 ) // 下が押されたら Player.y++; // y座標を減らす if( Key[KEY_INPUT_UP] == 1 ) // 上が押されたら Player.y--; // y座標を増やす }
これで移動するようになりました。(0,0)が左上で右方向にxが増え、下方向にyが増えるということを再確認しておきましょう。
しかし、マスの外だろうがどこまでも移動してしまいます。MovePlayer関数に8×8マスを飛び出ないように書き足しましょう。これはPlayerの座標を調べ、飛び出ているのであれば戻してやるという処理をすればいいです。
しかし、マスの外だろうがどこまでも移動してしまいます。MovePlayer関数に8×8マスを飛び出ないように書き足しましょう。これはPlayerの座標を調べ、飛び出ているのであれば戻してやるという処理をすればいいです。
game.cpp
... void MovePlayer(){ if( Key[KEY_INPUT_RIGHT] == 1 ){ // 右が押されたら Player.x++; // x座標を増やす if( Player.x == 8 ){ // 飛び出たら Player.x--; // 戻す printfDx("右に飛び出しそうになりました\n"); } } if( Key[KEY_INPUT_LEFT] == 1 ){ // 左が押されたら Player.x--; // x座標を減らす if( Player.x == -1 ) // 飛び出たら Player.x++; // 戻す } if( Key[KEY_INPUT_DOWN] == 1 ){ // 下が押されたら Player.y++; // y座標を減らす if( Player.y == 8 ) // 飛び出たら Player.y--; // 戻す } if( Key[KEY_INPUT_UP] == 1 ){ // 上が押されたら Player.y--; // y座標を増やす if( Player.y == -1 ) // 飛び出たら Player.y++; // 戻す } }
ここでもまたちょっとしたデバッグ補助を書き足してます。右方向のみですが、飛び出しかけたときに文字を表示するようになってます。しっかりとif文の中身が実行されているかチェックするために使用しました。動作が確認できたら消しましょう。