なお、ラケットのy座標は、rty=550と固定しますが、x座標はシステム変数mouseXを使います。
ソースリスト
ラケットを描くプログラム
//ウインドウの大きさ
int yoko=400,tate=600;
//ボールの半径を5
int r=5;
//ボールの座標
float x=r,y=100;
//移動方向の初期値
float dx=2,dy=2;
//ラケットの半分の長さ
float rtw=25;
float rtx,rty=550;
void setup()
{
size(yoko,tate);
//カラーモードの設定
//RGBの各色を256まで使えるようにする
colorMode(RGB,255);
//背景色を黒にする
smooth();
frameRate(120);
}
void draw()
{
background(0,0,0);
fill(248,252,13);/*黄色で塗りつぶす*/
stroke(248,252,13);/*線も黄色で*/
ellipse(x,y,2*r,2*r);/*ボールを描く*/
fill(255,255,255);
rtx = mouseX;
//ラケットを描く
stroke(255,255,255);/*線を白く*/
line(rtx - rtw,rty,rtx + rtw,rty);/*ラケットを描く*/
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;
}
システム変数
mouseX
mouseY
説明
マウスカーソルの水平方向の位置
マウスカーソルの垂直方向の位置
疑問
ちょっと、見栄えがよくありませんが、マウスで操作できるラケットが表示できました。でも、ボールが跳ね返りません!どうしてでしょうか?
答え
それは、ラケットにぶつかったら跳ね返るという処理を入れていないからです。
ポイント
ボールがラケットにあたったかの判定は、次のように行っています。
ちょっと、難しかったでしょうか?プログラム中の次の部分が上の4つの条件をif文で表しています。
ラケットとボールのあたり判定
//ラケットの上面あたり判定
if( y+r >= rty && y+r <= rty+dy && x>=rtx - rtw && x<=rtx+ rtw){
dy = -dy;
}
ラケットにあたったら跳ね返る
//ウインドウの大きさ
int yoko=400,tate=600;
//ボールの半径を5
int r=5;
//ボールの座標
float x=r,y=100;
//移動方向の初期値
float dx=2,dy=2;
//ラケットの半分の長さ
float rtw=25;
float rtx,rty=550;
void setup()
{
size(yoko,tate);
//カラーモードの設定
//RGBの各色を256まで使えるようにする
colorMode(RGB,255);
//背景色を黒にする
smooth();
frameRate(120);
}
void draw()
{
background(0,0,0);
fill(248,252,13);/*黄色で塗りつぶす*/
stroke(248,252,13);/*線も黄色で*/
ellipse(x,y,2*r,2*r);/*ボールを描く*/
fill(255,255,255);
rtx = mouseX;
//ラケットを描く
stroke(255,255,255);/*線を白く*/
line(rtx - rtw,rty,rtx + rtw,rty);/*ラケットを描く*/
//壁あたり判定
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;
//ラケットの上面あたり判定
if( y+r >= rty && y+r <= rty+dy && x>=rtx - rtw && x<=rtx+ rtw){
dy = -dy;
}
x +=dx;
y +=dy;
}
次回は、ブロックを表示してみましょう。