ボールを画面内で弾ませよう!

2005年度ゲームプログラミング
ゲームプログラミング
第4回:ボールを画面内で弾ませよ
う!
(オブジェクトの移動、二次元)
2005年度ゲームプログラミング
物体を上下左右に移動(1)


前回
変数y,dyを使ってボールを縦方向に移動
今回
変数x,dxを使ってボールを横方向にも移動
x ボールの横の位置を示す変数
dx ボールがどれだけ横に移動するか、
変化する量を示す変数
2005年度ゲームプログラミング
物体を上下左右に移動(2)




メソッドの最初で宣言、使う前に初期化
int x, dx;
x=1;dx=1;
xの値をdxだけ変化させる
x=x+dx;
跳ね返り処理
if(x>120){ dx= -dx; } //右の壁
xをつかって表示
gc.drawImage(0,x,y);
2005年度ゲームプログラミング
枠の表示

塗りつぶさない四角形を描くメソッドを使う。
gc.drawRect(x,y,w,h);
(x,y) 左上の座標
(w+1) 幅
(h+1) 高さ
g.setColor(0x000000);//描画色を黒に
g.drawRect(0,0,143,146); //枠を描く
2005年度ゲームプログラミング
枠の中でボールを動かそう
 枠のところで跳ね返るように、
跳ね返りの条件を変更
 枠の幅は1
→判定を1づつ内側に
2005年度ゲームプログラミング
残像を表示させてチェック

背景の表示を切って、残像を出してみよう

壁と残像に隙間があく
→当たり判定が手前すぎる

壁にボールがめり込む
→当たり判定が奥すぎる、または、
→壁際まで戻す処理を入れていない
2005年度ゲームプログラミング
枠の色を変えよう

描画色はgc.setColor()で変更する
g.setColor(0xRRGGBB);
RR,GG,BBに赤(Red)、緑(Green)、青
(Blue)の強さを16進数で入れる
00(最小) → 80(中くらい) → FF(最大)
2005年度ゲームプログラミング
枠の色を変えよう
gc.setColor(0xFF0000);
→赤い要素のみ→赤
gc.setColor(0x00FF00);
→緑の要素のみ→緑
gc.setColor(0xFF00FF);
→赤い光と青の光のブレンド→紫
2005年度ゲームプログラミング
枠に当たるたびに色を変える



枠に何回当たったかを数えて、当たった回数
で色を変える
→何回当たったかを保存する変数が必要
宣言と初期化
int point;
point=0;
枠に当たった時に回数を増やす
point++;
2005年度ゲームプログラミング
回数に応じて色を変える

演算子%
A%B AをBで割った余り
(0~B-1)の範囲の値になる
if(point%3==0) gc.setColor(色1);
if(point%3==1) gc.setColor(色2);
if(point%3==2) gc.setColor(色3);
gc.drawRect();//枠を描く
2005年度ゲームプログラミング
ボールが当たると消える的(1)

ボールが当たったら消える(=表示しない)
→表示するかしないかの判断が必要
→的の有無を示すのに変数を使用
値が1の時:的がある(的を表示)
値が0の時:的がない(的を表示しない)

このような何かの有無、可否を示す変数を
フラッグと言う
2005年度ゲームプログラミング
ボールが当たると消える的(2)



変数の宣言
int blockflag;
変数の初期化
→最初は的がある状態なので、初期値は1
blockflag=1;
的の表示
→blockflagが1の時のみ表示する
if (blockflag==1) gc.drawImage(…);
2005年度ゲームプログラミング
ボールが当たると消える的(3)

ボールが的に当たったら、ボールを消す
→blockflagを0にする
if(ボールと的が重なっている){
blockflag=0;
}

ボールと的が重なったかは、座標を比較して
判断。
2005年度ゲームプログラミング
ボールが当たると消える的(4)



ボール、的の大きさは縦12、横12とする
ボールと的が接触している時、ボールと的の
x座標の差、y座標の差がそれぞれ12未満
→引き算の結果が-12と12の間
y-50 > -12 かつ y-50 < 12 かつ
x-50 > -12 かつ x-50 < 12
(的を(50,50)に表示した場合)
複数の条件を両方とも満たす必要がある時
は「&&」でつなぐ