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