250 likes | 373 Views
ゲームプログラミング. 第7回:ボールとバーを同時に動かそう (複数の物体の移動). ボールとバーを動かそう. 前々回の課題 =ボールを動かす 前回の課題 =バーを動かす 前回と前々回の課題を組み合わせる →ボールとバーが動く. 処理の流れ. main() { 変数の宣言 キー、画像の準備 while(){ バーの移動 ボールの移動 ボールとバーの表示 } }. 変数の宣言. ボールの座標を示す x,y; ボールの移動量を示す dx,dy; バーの座標を示す barx;
E N D
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座標を比較して判断 barxbarx+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からここに飛ぶ