ラケットとボールの反射

前回のラケットはボールの垂直速度を反転させただけでした。あれではゲームとして面白くありません。
自分でブロックを狙う事ができず、ただボールがブロックに当たるまでボールを落とさないようにするという消極的なゲームになってしまいます。

そこで今回は、ボールがラケットに当たる位置によってボールの反射方向を変える事にします。
ラケットの中央に当たったときはそのまま反射し、左端に当たればボールの運動方向に関係なく左の方に反射します。
下のソースでは仰角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