夜明け前

やりたいことがあるだけましと人混みの中で強がる

ruby 課題8

http://ex.osaka-kyoiku.ac.jp/~fujii/JSE/JSE8.html 課題

F.on_activate = proc{
while (count>0) 
if (x0+sx > 600)or(x0+sx < 1) then sx *= -1;beep(1220,45) end
if (y0+sy > 470)or(y0+sy < 1) then sy *= -1;beep(1220,45) end
if col.index(j.canvas[x0+sx,y0+sy])!=nil
xx=((x0+sx)/100)*100; yy=((y0+sy)/50)*50
j.canvas.fill_rect(Rect.new(xx,yy,xx+100,yy+50) ) #消去
#反射の処理を書く
beep(392*5,45); count -= 1 
end

コードからボールがブロックに当たり、当たったブロックを無色で上書きして消していることがわかる。 よって、当たった面によって反射する向きを変える条件分岐を書く。

条件1.上面または底面に当たり、sy=-1; 条件2.側面に当たり、sx=-1; 条件3.角に当たり、sx=-1;sy=-1; 今回は、(x0,y0)の位置で判断する。 ↓書いた

if (x0<xx)or(xx+100<x0) then sy*=-1 end
if (y0<yy)or(yy+50<y0) then sx*=-1 end

追伸 結局ブロック崩し完成させました。動く棒もたしました。ブロックの描画をメソッドにしたほうがよくないですか