追蹤系統
物件會追蹤目標物移動,
這就是追蹤系統的作用。
這系統是基於慣性運動及加速模擬系統伸延的,
所以請先去看看該教學。
好了,現在說一說思路。
我們先要取得物件和目標物的角度,
再找物件和目標物的角度與物件面向角度的相差,
從而找出物件要轉的角度和方向。
#==============================================================================
# ■ Main
#------------------------------------------------------------------------------
# 各定義結束後、從這裡開始實際處理。
#==============================================================================
begin
BASEACCELERATION = 1.4
MAX_ACC = 5
MAX_ANGLE = 5
PI = 3.141592654
Ball = Sprite.new
Ball.bitmap = Bitmap.new("Graphics/Pictures/Ball")
Ball.ox = Ball.bitmap.width/2
Ball.oy = Ball.bitmap.height/2
Ball.x = 320
Ball.y = 240
Fire = Sprite.new
Fire.bitmap = Bitmap.new("Graphics/Pictures/fire")
Fire.ox = Fire.bitmap.width/2
Fire.oy = Fire.bitmap.height/2
Fire.zoom_y = 1.5
Fire.x = 600
Fire.y = 240
speed_x = 0
speed_y = 0
Turnspeed = 0
#在這裡初始所需的變數
loop do
if Input.press?(Input::UP)
Ball.y -= 10
end
if Input.press?(Input::DOWN)
Ball.y += 10
end
if Input.press?(Input::LEFT)
Ball.x -= 10
end
if Input.press?(Input::RIGHT)
Ball.x += 10
end
if Input.press?(Input::A)
break
end
#目標物控制設定
ACCELERATION = BASEACCELERATION
targetx = Fire.x - Ball.x
targety = Fire.y - Ball.y
#計算目標與追蹤物距離
target_angle = Math.atan2( targetx, targety) / PI * 180
#用Math.atan2計算目標與追蹤物角度差
target_angle = (target_angle- Fire.angle) % 360
#把角度限在360內,其實不做也行,
#不過角度會太大,不好控制和使用
if target_angle > 180
target_angle = -(target_angle% 180)
end
#把角度控制在180 ~ -180
target_angle = [[target_angle , MAX_ANGLE].min , MAX_ANGLE *
-1].max
#控制轉向在MAX_ANGLE之間
ACCELERATION /= [target_angle.abs/ MAX_ANGLE * 1.3 , 1].max
#設定轉向時減速
Fire.angle += target_angle
#轉向控制
angle = Fire.angle / 180 * PI
#把角度轉成Radian
speed_x -= Math.sin(angle) * ACCELERATION
speed_y -= Math.cos(angle) * ACCELERATION
#設定xy移動
speed_x /= 1.1
speed_y /= 1.1
if speed_x < 0.07 and speed_x > -0.07
speed_x = 0
end
if speed_y < 0.07 and speed_y > -0.07
speed_y = 0
end
#摩擦力的模擬減速
Fire.angle %= 360
#把角度限在360內,其實不做也行,
#不過角度會太大,不好控制和使用
Fire.x += speed_x
Fire.y += speed_y
#xy座標的改變
Turnspeed = [[Turnspeed / 1.07 , 5].min , -5].max
#最大轉向限制,和餘轉的設定
Fire.angle += Turnspeed
#角度改變
Graphics.update
Input.update
end
end
另外,關於判斷是否命中的方法,很簡單,
判斷Fire的xy與Ball的xy是否在一定的距離就行了 。