2002年度ゲームプログラミング ゲームプログラミング 第7回:ボールとバーを同時に動かそう (複数の物体の移動) 2002年度ゲームプログラミング ボールとバーを動かそう 前々回の課題 =ボールを動かす 前回の課題 =バーを動かす 前回と前々回の課題を組み合わせる →ボールとバーが動く 2002年度ゲームプログラミング 処理の流れ main() { 変数の宣言 キー、画像の準備 while(){ バーの移動 ボールの移動 ボールとバーの表示 } } 2002年度ゲームプログラミング 変数の宣言 ボールの座標を示すx,y; ボールの移動量を示すdx,dy; バーの座標を示すbarx; バーの移動量を示すbardx; スプライトの識別に使うsp,bg; for文で使うi; その他(p,message等) 2002年度ゲームプログラミング キー入力と画像表示の準備 スプライトを読むload_bmp() キャラの設定def_char() ボール、バー、壁、背景の設定が必要 キー入力の設定joy_keymap() その他(def_trans()等) 2002年度ゲームプログラミング ボールとバーの移動 バー(操作できるものを先に) キー入力に応じてbardxを変化 barxをbardxだけ増やす 左右の壁の処理 ボール xをdxだけ増やす yをdyだけ増やす 上下左右の壁の処理 2002年度ゲームプログラミング ボールとバーの表示 背景の表示 枠の表示 →バーと重ならないよう下辺をなくす ボールの表示 バーの表示 その他(文字等) 2002年度ゲームプログラミング ボールをバーで跳ね返そう(1) 画面下の跳ね返り処理の条件を変える 旧:ボールが画面下に来たら 跳ね返り ↓ 新:ボールが画面下に来た時に、 ボールのある場所にバーがあったら 跳ね返り 2002年度ゲームプログラミング ボールをバーで跳ね返そう(2) 重なりはx座標を比較して判断 barx barx+96 ↓ ↓ ■■■ ←―→ この範囲内にボールがあるか xがbarxより大きくbarx+96より小さかったら 跳ね返り処理を行う ボールの大きさも考慮しよう 2002年度ゲームプログラミング ボールをバーで跳ね返そう(3) 処理の流れ if(ボールが画面下まで来た){ if(ボールの場所にバーがある){ 跳ね返り処理 } } 2002年度ゲームプログラミング バーで受けられなかったら ボールが画面の下に来た時に、 ボールの場所にバーがあったら、 →跳ね返り処理 それ以外の場合 →終了処理 もし○○ならA、そうでなければBという 処理には、 if とelse を使う 2002年度ゲームプログラミング if文の文法(追加) if ( 条件 ) { 命令A; } else { 命令B; } 条件を満たしている場合は命令Aを、満たして いない場合は命令Bを実行する 2002年度ゲームプログラミング プログラムを終わらせる プログラム実行中はwhile文の中を 無限に繰り返している プログラムを終了させるにはwhile文の ループから脱出することが必要 ループからの脱出にはbreak;を使う break; 直前のfor,while文のループから脱出 2002年度ゲームプログラミング 処理の流れ if(ボールが画面下に){ if(ボールの場所にバーが){ 跳ね返り処理 } else { break; //while脱出 } } 2002年度ゲームプログラミング while文を抜けた後の処理 whileを抜けると抜けた直後の命令 prog_end();が実行され、 プログラム終了へ ウインドウが一瞬で閉じてしまうので、 キー入力を待って、キーが押されたら 終了するよう手を加える 2002年度ゲームプログラミング キー入力待ちループ whileを抜けた直後、prog_endの前に置く while(…){ // ()内の条件は前と同じ if(joy_bt(1,1))break; sp_update(); wait(10); } Zキーが押されたらループ脱出→終了 2002年度ゲームプログラミング 終了条件の見直し(1) 受け逃した瞬間はまだボールがバーの 高さにある →ボールが画面の底についたら ゲームが終わるようにしてみよう ● ←跳ね返る高さ __■■■__●_ ←終了する高さ 2002年度ゲームプログラミング 終了条件の見直し(2) 跳ね返りの条件 if ( y>= 416 ){ if(ボールとバーが重なる)跳ね返り } 終了の条件 if( y >= 448 ) break; //ループ脱出 2002年度ゲームプログラミング 複数のボールを動かそう ボールの座標を示す変数x,y、動く量を示す 変数dx,dyが、ボールの数だけ必要 複数個分の情報の保存に配列変数を使う 変数:値を入れておく箱 int x; □ 配列変数:箱の集まり int x[3]; □□□ 何番目の箱かは[ ]の中の数値で区別する [0][1][2] ←3個だと0~2まで 2002年度ゲームプログラミング 配列変数の使い方(1) 宣言 型 名前 [ 個数 ] ; int x[3]; これで、x[0],x[1],x[2]の3個の変数が 使えるようになる 初期値を入れたい場合 int x[3]= {100,200,300}; //{ }でくくる x[0]=100,x[1]=200,x[2]=300になる。 2002年度ゲームプログラミング 配列変数の使い方(2) 値の代入等 名前 [ 番号 ] のように、[ ]の中に数値を 入れて何番目の変数かを特定する それ以外は普通の変数と一緒 x[0]=100; // x[0]に100を代入 x[1]++; // x[1]=x[1]+1; if(x[2]<32) // もしx[2]が32未満なら 2002年度ゲームプログラミング 配列変数の使い方(3) for文と組み合わせる for(i=0;i<3;i++){ //3回繰り返し x[i]=x[i]+dx[i]; // xにdxを足す } 3回くり返す間に i が1ずつ増えていく。 1回目はx[0]の移動処理、2回目はx[1]、 3回目はx[2]についての移動処理になる 2002年度ゲームプログラミング 配列変数の使い方(4) 宣言 int x[3]={100,200,300}; //(y,dx,dyも) 移動 for(i=0;i<3;i++){ //3回繰り返し x[i]にdx[i]を足す y[i]にdy[i]を足す 跳ね返りの処理 } 登録 for(i=0;i<3;i++)sp_set(sp,0,x[i],y[i],1); 2002年度ゲームプログラミング 配列を用いた場合の終了処理(1) breakは一番内側のループしか抜けない →終了処理でbreakを置いてもfor文から抜け るだけでwhileからは出ない while(){ for(i=0;i<3;i++){ if(…)break; } A; // ←breakからここに飛ぶ } 2002年度ゲームプログラミング 配列を用いた場合の終了処理(2) ミスした回数を記憶する変数を宣言して、for 文を抜けてからミスを判断してbreakする。 while(){ for(I=0;I<3;I++){ if(…)miss++; } if(miss>=1)break; } A; // ←breakからここに飛ぶ
© Copyright 2025 ExpyDoc