前回のラケットはボールの垂直速度を反転させただけでした。あれではゲームとして面白くありません。
自分でブロックを狙う事ができず、ただボールがブロックに当たるまでボールを落とさないようにするという消極的なゲームになってしまいます。
そこで今回は、ボールがラケットに当たる位置によってボールの反射方向を変える事にします。
ラケットの中央に当たったときはそのまま反射し、左端に当たればボールの運動方向に関係なく左の方に反射します。
下のソースでは仰角30度〜60度の方向にランダムで打ち返します。右端も同じです
//画面の大きさ #define wx 360 #define wy 400 //ボールの位置 x = 40.0 y = 200.0 //ボールの速度 vx = 2.0 vy = 4.0 racketsize = 60 //ラケットの大きさ ballsize = 8 //ボールの大きさ randomize screen 0,360,400 repeat rx = mousex - racketsize/2 x += vx y += vy if x < 0 | x > (wx-ballsize) : vx = vx * -1 if y < 0 : vy = vy * -1 //ラケットの中央で打ち返す if (y >= wy-ballsize) & (x+ballsize > rx+20) & (x < rx+racketsize-20):vy = vy * -1 //ラケットの左側で打ち返す if (y >= wy-ballsize) & (x+ballsize > rx) & (x+ballsize <= rx+20) { v = vx*vx + vy*vy //ボールの速度を求める rad = (5236.0 + rnd(5237)) / 10000 //ボールを打ち返す角度を決める vx = sqrt(v) * cos(rad) * -1 vy = sqrt(v) * sin(rad) * -1 } //ラケットの右側で打ち返す if (y >= wy-ballsize) & (x >= rx+racketsize-20) & (x < rx+racketsize) { v = vx*vx + vy*vy rad = (5236.0 + rnd(5237)) / 10000 vx = sqrt(v) * cos(rad) vy = sqrt(v) * sin(rad) * -1 } if y > wy :y = 0 color 0,0,0 boxf color 255,0,0 boxf rx,wy-5,rx+racketsize,wy color 255,255,0 circle x,y,x+ballsize,y+ballsize redraw 1 wait 1 redraw 0 loop