class RPG::Tileset
#--------------------------------------------------------------------------
# ● 獲取腳印類型
#--------------------------------------------------------------------------
def get_footprint_type(tag_id)
return false unless tag_id.is_a?(Integer)
self.note.split(/[\r\n]+/).each { |line|
if line =~ /\[fp_type #{tag_id} (\S+)\]/
return $1.to_sym
end
}
return :none
end
#--------------------------------------------------------------------------
# ● 獲取腳印音效
#--------------------------------------------------------------------------
def get_footprint_sound(tag_id)
return false unless tag_id.is_a?(Integer)
self.note.split(/[\r\n]+/).each { |line|
if line =~ /\[fp_sound #{tag_id} (\S+)\]/
return $1
end
}
return ""
end
#--------------------------------------------------------------------------
# ● 獲取腳印淡出速度
#--------------------------------------------------------------------------
def get_footprint_fade
self.note.split(/[\r\n]+/).each { |line|
if line =~ /\[fp_fade (\d+)\]/
return $1.to_i
end
}
return 5
end
end
class Game_Footprint < Game_CharacterBase
attr_reader :type
attr_accessor :pattern
attr_accessor :character_name
attr_accessor :direction
attr_accessor :direction_fix
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
def initialize(t)
super()
return unless $game_player
@direction = $game_player.direction
self.type = t
@move_speed = 4
@move_frequency = 6
@priority_type = 0
@through = true
@transparent = true
moveto($game_player.x, $game_player.y)
end
#--------------------------------------------------------------------------
# ● 設置類型
#--------------------------------------------------------------------------
def type=(t)
@type = t
@character_name = "$footprint"
if @type != :normal
@character_name += "_" + @type.to_s
end
case @type
when :ripple
@step_anime = true
@stop_count = 8
end
end
#--------------------------------------------------------------------------
# ● 腳印更新
#--------------------------------------------------------------------------
def update
super
return if pos?($game_player.x, $game_player.y)
fadespeed = $game_map.tileset.get_footprint_fade
return if fadespeed == 0
if Graphics.frame_count % fadespeed == 0
@opacity -= 10
end
end
end
class Game_Footprints
#--------------------------------------------------------------------------
# ● 初始化
#--------------------------------------------------------------------------
def initialize
[url=home.php?mod=space&uid=2653549]@data[/url] = []
end
#--------------------------------------------------------------------------
# ● 加入腳印
#--------------------------------------------------------------------------
def push_fp(t=:normal)
footp = Game_Footprint.new(t)
footp.moveto($game_player.x, $game_player.y)
footp.set_direction($game_player.direction)
@data.push(footp)
end
#--------------------------------------------------------------------------
# ● 設置類型
#--------------------------------------------------------------------------
def type=(t)
@data.each{ |ft|
ft.type = t
}
end
attr_reader :data
end
class Game_Player < Game_Character
#--------------------------------------------------------------------------
# ● 清除移動資訊
#--------------------------------------------------------------------------
alias footprint_clear_transfer_info clear_transfer_info
def clear_transfer_info
footprint_clear_transfer_info
@footprint = Game_Footprints.new
end
#--------------------------------------------------------------------------
# ● 返回腳印列表
#--------------------------------------------------------------------------
def footprints
return @footprint.data
end
#alias footprint_moveto moveto
#def moveto(x, y)
# footprint_moveto(x, y)
#push_footprint
#end
#--------------------------------------------------------------------------
# ● 直線移動
#--------------------------------------------------------------------------
alias footprint_move_straight move_straight
def move_straight(d, turn_ok = true)
previous_direction = @direction
footprint_move_straight(d, turn_ok)
if @move_succeed
push_footprint(previous_direction)
end
end
#--------------------------------------------------------------------------
# ● 新增腳印
#--------------------------------------------------------------------------
def push_footprint(prev_dir=2)
return unless SceneManager.scene_is?(Scene_Map)
if @footprint.data.size > 0
adjust_diagonal_footprint(prev_dir, $game_player.direction)
@footprint.data[-1].transparent = false
end
type = check_terrain?
return unless type
@footprint.push_fp(type)
SceneManager.scene.add_footprint_sprite(@footprint.data[-1])
end
def adjust_diagonal_footprint(last_dir, curr_dir)
return if last_dir == curr_dir
footprint = @footprint.data[-1]
name = footprint.character_name + "_dia"
return unless FileTest.exist?("Graphics/Characters/#{name}.png")
footprint.character_name = name
case last_dir+curr_dir
when 6
footprint.direction = 8
when 8
footprint.direction = 4
when 12
footprint.direction = 6
when 14
footprint.direction = 2
end
end
#--------------------------------------------------------------------------
# ● 檢查地形
#--------------------------------------------------------------------------
def check_terrain?
terrain = $game_map.terrain_tag($game_player.x, $game_player.y)
type = $game_map.tileset.get_footprint_type(terrain)
sound = $game_map.tileset.get_footprint_sound(terrain)
RPG::SE.new(sound).play if sound != ""
if type == :none
return false
else
return type
end
end
end
class Spriteset_Map
#--------------------------------------------------------------------------
# ● 增加腳印精靈
#--------------------------------------------------------------------------
def add_footprint(footprint)
@character_sprites.push(Sprite_Character.new(@viewport1, footprint))
end
#--------------------------------------------------------------------------
# ● 更新角色精靈
#--------------------------------------------------------------------------
alias footprint_update_characters update_characters
def update_characters
footprint_update_characters # 調用原有方法
update_footsteps # 更新腳印
end
#--------------------------------------------------------------------------
# ● 更新腳印精靈
#--------------------------------------------------------------------------
def update_footsteps
@character_sprites.each {|sprite|
if sprite.character.is_a?(Game_Footprint)
sprite.character.update
if sprite.opacity <= 0 # 不透明度為0時
@character_sprites.delete(sprite) # 移除精靈
sprite.dispose # 釋放腳印精靈
end
end
}
end
end
class Scene_Map < Scene_Base
#--------------------------------------------------------------------------
# ● 加入腳印精靈
#--------------------------------------------------------------------------
def add_footprint_sprite(footprint)
@spriteset.add_footprint(footprint)
end
#--------------------------------------------------------------------------
# ● 創建地圖精靈組
#--------------------------------------------------------------------------
alias footprint_create_spriteset create_spriteset
def create_spriteset
footprint_create_spriteset
$game_player.push_footprint
end
end