include DXOpal Image.register(:body, 'images/body.png') Image.register(:foot, 'images/foot.png') module WalkEnemy2 $angadd = 2 # 足先の座標を求めるクラス class Foot attr_accessor :x, :y def initialize(start_ang) @ang = start_ang @x = 0 @y = 0 self.update end def update # 円運動をさせてみる。 # 本当は放物線運動のほうがいいと思う…けど # 面倒臭いから今回は安直に円運動 ang = @ang * Math::PI / 180.0 @x = -128 * Math.cos(ang) @y = 96 * Math.sin(ang) @y = 0 if @y >= 0 @ang += $angadd end # 棒状の部分を1枚のスプライトを回転させて描く def draw_foot_sub(bx, by, tx, ty, img) cx = (tx + bx) / 2 - img.width / 2 cy = (ty + by) / 2 - img.height / 2 dw = tx - bx dh = ty - by ang = Math.atan2(dh, dw) * 180.0 / Math::PI Window.draw_rot(cx, cy, img, ang) end # 足を一本分描画する def draw_foot(bx, by, tx, ty, img, flen) dw = tx - bx dh = ty - by # 腰から足の先までの長さ、の半分を求める # 三平方の定理(ピタゴラスの定理)を使ってる l = Math.sqrt(dw * dw + dh * dh) / 2 # 膝までの距離を求める。これも、三平方の定理を使ってる nl = flen * flen - l * l n = (nl <= 0)? 0 : Math.sqrt(nl) # 腰と足先の中間点を求める cx = (bx + tx) / 2 cy = (by + ty) / 2 # 膝があるはずの方向(角度)を求める # 腰と足先の座標から角度を求めて、それに90度足せばいい ang = Math.atan2(dh, dw) + Math::PI / 2 # 膝の場所を求める lx = cx + n * Math.cos(ang) ly = cy + n * Math.sin(ang) # 腰から膝までと、膝から足先までを描く draw_foot_sub(bx, by, lx, ly, img) draw_foot_sub(lx, ly, tx, ty, img) # 分かりやすくするために線を引いてみる # Window.drawLine(cx, cy, lx, ly, [255, 0, 0]) end # 足を描画 def draw(right_foot, n, bx, by, gy, img, flen) if right_foot # 右足の根元と先っぽの座標を求める fbx = bx - n fby = by ftx = bx + @x - n fty = @y + gy else # 左足の根元と先っぽの座標を求める fbx = bx + n fby = by ftx = bx + @x + n fty = @y + gy end self.draw_foot(fbx, fby, ftx, fty, img, flen) end end by = 130 # 腰の高さ gy = 420 # 地面の高さ # 足半分の長さ flen = (gy - by) / 2 + 20 footl = Foot.new(0) footr = Foot.new(180) Window.load_resources do bodyimg = Image[:body] img = Image[:foot] # メインループ Window.loop do # マウスカーソルのy座標で足先の移動速度を変えてみる $angadd = 20.0 * Input.mouse_y / Window.height - 10.0 # マウスカーソルのx座標で横方向の表示位置を設定 bx = Input.mouse_x # 右足を描く footr.draw(true, 0, bx, by, gy, img, flen) # 腰を描く Window.draw(bx - 170, by - 100, bodyimg) # 左足を描く footl.draw(false, 16, bx, by, gy, img, flen) # 足先の座標を更新 footl.update footr.update # 分かりやすくするために線を引いてみる # Window.drawLine(frbx, frby, frtx, frty, [0, 255, 255]) # Window.drawLine(flbx, flby, fltx, flty, [0, 255, 255]) end end end