Home > Tutorial

追蹤系統

物件會追蹤目標物移動,
這就是追蹤系統的作用。
這系統是基於慣性運動及加速模擬系統伸延的,
所以請先去看看該教學。
好了,現在說一說思路。

我們先要取得物件和目標物的角度,
再找物件和目標物的角度與物件面向角度的相差,
從而找出物件要轉的角度和方向。

 

#==============================================================================
# ■ 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是否在一定的距離就行了 。
 

回前頁

Hosted by www.Geocities.ws

1