ボールの場所にバーがあったら

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からここに飛ぶ