サンプルコードのダウンロード
では、まずサンプルコードをダウンロードし、解凍してください。
私はVisual C++6.0でコンパイルしているので、お持ちの方はVisual C++でプロジェクトファイルを開いてください(「game_03.dsw」をダブルクリックすれば開けます)。
圧縮ファイルに含まれる「game_03.exe」をダブルクリックし、実行してみてください。
どうでしょう?画面が切り替わり、スライムが2個表示されると思います。
というわけで今回は、キー入力により複数のキャラを動かす処理ついて解説したいと思います。
複数キャラの扱い
今回は、こいつら(slime.bmp 64×32)を使用して複数のキャラクタを表示、移動させてみたいと思います。
というわけでサンプルコードを見てみます。
//----------[ メイン関数 ]---------------------------------------------------------------------- int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow){ <略> //座標 int cx[2]={160-16,480-16},cy[2]={240-16,240-16}; //キーテーブル unsigned char key_up[2]={38,104},key_down[2]={40,98}, key_left[2]={37,100},key_right[2]={39,102}; //その他の変数 int i,mv=3; //メインループ while(1){ WaitSet(); //現在の時間(単位:ミリ秒)取得 ClearScreen(lpBack); //バックバッファ初期化 DdTextOut(lpBack,0,0,"カーソルキー、テンキー(4,6,8,2)で移動 pauseキーで終了",255); for(i=0;i<2;i++){ //キャラクター移動 if(keyg[key_up[i]]) //↑ cy[i]-=mv; else if(keyg[key_down[i]]) //↓ cy[i]+=mv; else if(keyg[key_left[i]]) //← cx[i]-=mv; else if(keyg[key_right[i]]) //→ cx[i]+=mv; //キャラクタ表示 BltClip(lpBack,cx[i],cy[i],32,32,lpWork,32*i,0,1); } Flip(); //フィリップ Wait(1000/60); //メッセージループへ }
初心者だと、つい1キャラづつ変数用意(例えば int,cx1,cx2,cx3・・・)し、処理も1キャラづつ用意しそうですが、そんな必要はありません。
座標等の変数を配列(もしくはクラス・構造体の配列)で用意する事により、ループ処理で複数のキャラを処理できるというわけです。
キーボードのお話
今回は2つのキャラクターを同時に表示し、キー入力も4方向×2キャラという事で8つのキーを扱っているのですが、AT互換機(DOS/V)でキーボードを一気にたくさん押すと、一部のキーの反応が無くなる場合があります(PC-9821シリーズでは大丈夫なようですが)。
スペースソルジャーでも、2人で同時に遊んでいると、どちらかの機体が左上に行けなくなるという現象が起きました。
これはハードウェアの仕様という事でプログラマーにはどうする事も出来ないようです。
そういった場合にはジョイパッドに逃げるしかありませんね(^^;