右の壁にあたって、ボールが跳ね返るようにします。
ボールが右下に移動し、右の壁に跳ね返る時の様子は、図のようになります。
現在の円の中心(x,y)
次に描く円の中心(x+dx,y+dy)
右の壁で跳ね返る
//ボールの半径を10
int r=10;
//ボールの座標
float x=r,y=100;
//ウインドウの大きさ
int yoko=400,tate=600;
//移動方向の初期値
float dx=2,dy=2;
void setup()
{
size(yoko,tate);
frameRate(60);
//カラーモードの設定
//RGBの各色を256まで使えるようにする
colorMode(RGB,256);
//背景色を黒にする
smooth();
noStroke();
frameRate(60);
}
void draw()
{
background(0,0,0);
fill(248,252,13);
ellipse(x,y,2*r,2*r);
if( x+dx+r > yoko)
dx = -dx;
x +=dx;
y +=dy;
}
それでは、実行してみましょう!
疑問
右の壁にあたって跳ね返ったけれど、下の壁は突き抜けちゃいます?!
答え
上のプログラムは、右の壁の跳ね返りだけ処理しています。同じようにして、左、上、下の壁の処理が必要です。次のプログラムのようになります。
すべての壁に跳ね返るボール
//ボールの半径を10
int r=10;
//ボールの座標
float x=r,y=100;
//ウインドウの大きさ
int yoko=400,tate=600;
//移動方向の初期値
float dx=2,dy=2;
void setup()
{
size(yoko,tate);
frameRate(200);
colorMode(RGB,256);
smooth();
noStroke();
frameRate(60);
}
void draw()
{
background(0,0,0);
fill(248,252,13);
ellipse(x,y,2*r,2*r);
if( x+dx+r > yoko)//右の壁の判断
dx = -dx;
if( x+dx-r < 0)//左の壁の判断
dx = -dx;
if( y+dy+r > tate)//下の壁の判断
dy=-dy;
if( y+dy-r < 0)//上の壁の判断
dy=-dy;
x +=dx;
y +=dy;
}