# Sion 鼠标系统(SionMouseSystem)v2.31 (2014/2/20) # 需求! 1,白菜组脚本基 (WhiteCabbageBase) v1.0+ # 2,基础鼠标模组 (Sion_MouseBase) v1.0+ # v2.32(2014/6/9) 优化了地图卷动指令、等待指令的衔接过程。 # v2.31(2014/2/20) 事件执行过程中,卷动地图后不会自动跳转到玩家位置了。 =begin 说明 主要功能 1,自动寻路,按住 D 键可以扩大寻路的范围 2,变量输入框改良 3,鼠标启动事件: 在事件中加入“注释”:鼠标启动 该事件将无法用其它方式启动,只能用鼠标左键点击启动 鼠标指针图片 MouseCursor.png 放入 Graphics\System 文件夹 路径点指示图片 $Arrow.png 放入 Graphics\Characters 文件夹 如果未放入会使用RM自带图片代替缺失文件 =end #============================================================================== # ■ 常数设置 #============================================================================== module KsOfSion Clip_Cursor = true # 鼠标锁定在游戏窗口内,需要关闭设置为false Dbclick_Frame = 15 # 双击的最大间隔帧数。在地图画面双击进行奔跑 New_Scroll = true # 更改地图卷动方式,需要关闭设置为false Map_Scroll_Spd = 1.0 # 卷动速度 Menu_Set_Pos = true # 打开菜单时将鼠标移动到光标处 Break_Steps = 30 # 鼠标寻路最大步数,防止路径太长导致卡帧 # “30” 是默认显示格子数 长(17) + 宽(13) Find_Path_Key = :Z # 扩大寻路范围至全地图按键 :Z 对应 D键 # RM几个内置的空键位 (:X = A)(:Y = S)(:Z = D) end # class Move_Sign < Game_Character # ■ 用来显示路径点的类 attr_accessor :direction def init_public_members @character_name = '!$Arrow'# 路径点箭头,置于.\Graphics\Characters文件夹 @character_index = 0 # 图片索引。$开头的行走图设为0 @move_speed = 5 # 踏步速度 @step_anime = true # 踏步动画(如果想使用静态图标就关闭这个) @opacity = 255 # 不透明度 @blend_type = 0 # 图片合成方式,默认为0(正常) @direction = 2 # 朝向,2 4 6 8 分别对应行走图第1 2 3 4 列 @priority_type = 1 # 优先级(默认与人物同级:1) # 如果 $Arrow.png 不在对应的文件夹内,弹出提示,并使用游戏一张内置的行走图 #============================= 参数设置完毕 =================================== unless File.exist?('Graphics/Characters/' + @character_name + '.png') @character_name = '!Flame' @character_index = 6 end @direction_fix = false @move_frequency = 6 @walk_anime = true @pattern = 1 @through = true @bush_depth = 0 @animation_id = 0 @balloon_id = 0 @transparent = true @id = 0 @x = 0 @y = 0 @real_x = 0 @real_y = 0 @tile_id = 0 end end #============================================================================== # ■ SceneManager #============================================================================== class << SceneManager unless self.method_defined?(:sion_mouse_run) alias_method :sion_mouse_run, :run alias_method :sion_mouse_call, :call alias_method :sion_mouse_return, :return end def run Mouse.activate sion_mouse_run end def call(scene_class, *args) $game_map.prepare_reset_mouse_pos if @scene.instance_of?(Scene_Map) sion_mouse_call(scene_class, *args) end def return sion_mouse_return $game_map.reset_mouse_pos if KsOfSion::Menu_Set_Pos && @scene.instance_of?(Scene_Map) end end class << Mouse attr_reader :sprite end class << Input alias_method :sion_mouse_press?, :press? alias_method :sion_mouse_trigger?, :trigger? alias_method :sion_mouse_repeat?, :repeat? unless self.method_defined?(:sion_mouse_update) alias_method :sion_mouse_update, :update end def update Mouse.update sion_mouse_update end def press?(key) return true if sion_mouse_press?(key) return Mouse.press?(:L) if key == :C return Mouse.press?(:R) if key == :B return false end def trigger?(key) return true if sion_mouse_trigger?(key) return Mouse.trigger?(:L) if key == :C return Mouse.trigger?(:R) if key == :B return false end def repeat?(key) return true if sion_mouse_repeat?(key) return Mouse.repeat?(:L) if key == :C return Mouse.repeat?(:R) if key == :B return false end end #============================================================================== # ■ Window_Selectable #------------------------------------------------------------------------------ # 拥有光标移动、滚动功能的窗口 #============================================================================== class Window_Selectable #-------------------------------------------------------------------------- # ● 初始化 #-------------------------------------------------------------------------- alias sion_mouse_initialize initialize def initialize(x, y, width, height) sion_mouse_initialize(x, y, width, height) @move_state = 0 end #-------------------------------------------------------------------------- # ● 更新 #-------------------------------------------------------------------------- alias sion_mouse_update update def update sion_mouse_update update_mouse_cursor end #-------------------------------------------------------------------------- # ● 按下确定键的处理 #-------------------------------------------------------------------------- alias sion_mouse_process_ok process_ok def process_ok return if Mouse.trigger?(:L) && mouse_out_rect? sion_mouse_process_ok end #-------------------------------------------------------------------------- # ● 判断鼠标是位于光标矩形处 #-------------------------------------------------------------------------- def mouse_out_rect? if viewport.nil? vp_x, vp_y = 0, 0 else vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end mouse_rx = ox + Mouse.x - (x + vp_x + standard_padding ) mouse_ry = oy + Mouse.y - (y + vp_y + standard_padding ) return cursor_rect.x > mouse_rx || cursor_rect.y > mouse_ry || cursor_rect.x + cursor_rect.width < mouse_rx || cursor_rect.y + cursor_rect.height< mouse_ry end #-------------------------------------------------------------------------- # ● 启动后设置鼠标到index位置 #-------------------------------------------------------------------------- def activate @need_set_pos = true if KsOfSion::Menu_Set_Pos super end #-------------------------------------------------------------------------- # ● 更新鼠标和光标的位置 #-------------------------------------------------------------------------- def update_mouse_cursor if active if @need_set_pos @need_set_pos = nil set_mouse_pos elsif cursor_movable? Input.dir4.zero? ? set_cursor : set_mouse_pos end end end #-------------------------------------------------------------------------- # ● 将光标设置到鼠标所在的位置,附带卷动菜单的功能 #-------------------------------------------------------------------------- def set_cursor mouse_row, mouse_col = mouse_window_area if mouse_row == -1 @move_state += 1 if need_scroll? cursor_up if (@move_state - 1) % 4 == 0 && !is_horzcommand? elsif mouse_row == -2 @move_state += 1 if need_scroll? cursor_down if (@move_state - 1) % 4 == 0 && !is_horzcommand? elsif mouse_col == -1 @move_state += 1 if need_scroll? cursor_left if (@move_state - 1) % 16 == 0 && is_horzcommand? elsif mouse_col == -2 @move_state += 1 if need_scroll? cursor_right if (@move_state - 1) % 16 == 0 && is_horzcommand? else @move_state = 0 new_index = (top_row + mouse_row) * col_max + mouse_col select(new_index) if new_index < item_max && new_index != @index end end #-------------------------------------------------------------------------- # ● 判断鼠标位于菜单的第几行、第几列 #-------------------------------------------------------------------------- def mouse_window_area if viewport.nil? # necessary! vp_x, vp_y = 0, 0 else vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end mouse_x = Mouse.x mouse_y = Mouse.y item_x1 = vp_x + x + standard_padding item_y1 = vp_y + y + standard_padding item_x2 = vp_x + x - standard_padding + width item_y2 = vp_y + y - standard_padding + height if mouse_x < item_x1 mouse_col = -1 elsif mouse_x > item_x2 mouse_col = -2 else mouse_col = col_max * (mouse_x - item_x1) / (item_x2 - item_x1) end if mouse_y < item_y1 mouse_row = -1 elsif mouse_y > item_y2 mouse_row = -2 else mouse_row = page_row_max * (mouse_y - item_y1 - 1) / (item_y2 - item_y1) end return mouse_row, mouse_col end #-------------------------------------------------------------------------- # ● 方向键移动光标时将鼠标移动到对应的光标位置 #-------------------------------------------------------------------------- def set_mouse_pos if viewport.nil? # necessary! vp_x, vp_y = 0, 0 else vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end item_x1 = vp_x + x + standard_padding item_y1 = vp_y + y + standard_padding get_index = @index < 0 ? 0 : @index row = get_index / col_max - top_row col = get_index % col_max new_x = item_x1 + item_width * (col + 0.5) new_y = item_y1 + item_height * (row + 0.5) Mouse.set_pos(new_x, new_y) end #-------------------------------------------------------------------------- # ● 判断菜单是否需要卷动 #-------------------------------------------------------------------------- def need_scroll? item_max > col_max * page_row_max end #-------------------------------------------------------------------------- # ● 判断是否为水平卷动菜单 #-------------------------------------------------------------------------- def is_horzcommand? return false end end class Window_HorzCommand #-------------------------------------------------------------------------- # ● 判断是否为水平卷动菜单 #-------------------------------------------------------------------------- def is_horzcommand? return true end end #============================================================================== # ■ Window_NameInput #------------------------------------------------------------------------------ # 名字输入画面中,选择文字的窗口。 #============================================================================== class Window_NameInput #-------------------------------------------------------------------------- # ● 设置列数 #-------------------------------------------------------------------------- def col_max return 10 end #-------------------------------------------------------------------------- # ● 设置填充的Item个数 #-------------------------------------------------------------------------- def item_max return 90 end #-------------------------------------------------------------------------- # ● 设置填充的Item个数 #-------------------------------------------------------------------------- def item_width return 32 end #-------------------------------------------------------------------------- # ● 判断鼠标位于菜单的第几行、第几列 #-------------------------------------------------------------------------- def mouse_window_area if viewport.nil? vp_x, vp_y = 0, 0 else vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end mouse_x = Mouse.x mouse_y = Mouse.y item_x1 = vp_x + x + standard_padding item_y1 = vp_y + y + standard_padding item_x2 = vp_x + x - standard_padding + width item_y2 = vp_y + y - standard_padding + height if mouse_x < item_x1 mouse_col = -1 elsif mouse_x > item_x2 mouse_col = -2 elsif mouse_x < item_x1 + 160 mouse_col = (mouse_x - item_x1)/32 elsif mouse_x > item_x2 - 160 mouse_col = 9 - (item_x2 - mouse_x)/32 else mouse_col = mouse_x > x + width/2 ? 5 : 4 end if mouse_y < item_y1 mouse_row = -1 elsif mouse_y > item_y2 mouse_row = -2 else mouse_row = page_row_max * (mouse_y - item_y1 - 1)/(item_y2 - item_y1) end return mouse_row, mouse_col end #-------------------------------------------------------------------------- # ● 方向键移动光标时将鼠标移动到对应的光标位置 #-------------------------------------------------------------------------- def set_mouse_pos if viewport.nil? # necessary! vp_x, vp_y = 0, 0 else vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end item_x1 = vp_x + x + standard_padding item_y1 = vp_y + y + standard_padding get_index = @index < 0 ? 0 : @index row = get_index / col_max - top_row col = get_index % col_max new_x = item_x1 + item_width * (col + 0.5) new_y = item_y1 + item_height * (row + 0.5) new_x += 14 if col > 4 Mouse.set_pos(new_x, new_y) end end #============================================================================== # ■ Window_NumberInput #------------------------------------------------------------------------------ # 重写了数值输入的方法以适应鼠标 #============================================================================== class Window_NumberInput < Window_Base #-------------------------------------------------------------------------- # ● 定义实例变量 #-------------------------------------------------------------------------- attr_reader :extra_window #-------------------------------------------------------------------------- # ● 初始化 #-------------------------------------------------------------------------- alias sion_mouse_initialize initialize def initialize(arg) sion_mouse_initialize(arg) create_extra_window end #-------------------------------------------------------------------------- # ● 启动 #-------------------------------------------------------------------------- alias sion_mouse_start start def start sion_mouse_start deactivate extra_start end #-------------------------------------------------------------------------- # ● 创建新的数值输入窗口 #-------------------------------------------------------------------------- def create_extra_window @extra_window = Window_NumberInput_Ex.new @extra_window.x = (Graphics.width - @extra_window.width) / 2 @extra_window.number_proc = Proc.new {|n| @number = n } @extra_window.index_proc = Proc.new {|n| @index = n } @extra_window.close_proc = Proc.new { close } @extra_window.refresh_proc = Proc.new { refresh } end #-------------------------------------------------------------------------- # ● 激活新窗口 #-------------------------------------------------------------------------- def extra_start case $game_message.position when 0; @extra_window.y = y + height + 4 when 1; @extra_window.y = @message_window.y - @extra_window.height - 8 when 2; @extra_window.y = y - @extra_window.height - 4 else ; @extra_window.y = 8 end @extra_window.variable_id = $game_message.num_input_variable_id @extra_window.digits_max = @digits_max @extra_window.number = @number @extra_window.open @extra_window.activate end #-------------------------------------------------------------------------- # ● 更新 #-------------------------------------------------------------------------- def update super @extra_window.update update_cursor end #-------------------------------------------------------------------------- # ● 关闭窗口 #-------------------------------------------------------------------------- def close super @extra_window.close @extra_window.deactivate end end #============================================================================== # ■ Window_NumberInput_Ex #------------------------------------------------------------------------------ # 新的数值输入窗口(NewClass) #============================================================================== class Window_NumberInput_Ex < Window_Selectable #-------------------------------------------------------------------------- # ● 定义实例变量 #-------------------------------------------------------------------------- attr_accessor :number_proc attr_accessor :index_proc attr_accessor :close_proc attr_accessor :refresh_proc attr_accessor :number attr_accessor :digits_max attr_accessor :variable_id #-------------------------------------------------------------------------- # ● 数字表 #-------------------------------------------------------------------------- TABLE = [ 7, 8, 9, 4, 5, 6, 1, 2, 3, '←',0,'确定',] #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- def initialize super(0, 0, 120, fitting_height(4)) self.openness = 0 @index = 0 @number = 0 @old_window_index = 0 @digits_max = 0 12.times {|i| draw_text(item_rect(i), TABLE[i], 1) } end #-------------------------------------------------------------------------- # ● 获取项目的绘制矩形 #-------------------------------------------------------------------------- def item_rect(index) rect = Rect.new rect.x = index % 3 * 32 rect.y = index / 3 * line_height rect.width = 32 rect.height = line_height return rect end #-------------------------------------------------------------------------- # ● 将光标设置到鼠标所在的位置 #-------------------------------------------------------------------------- def set_cursor mouse_row, mouse_col = mouse_window_area if mouse_row >= 0 && mouse_col >= 0 new_index = mouse_row * 3 + mouse_col select(new_index) if new_index <= 11 end end #-------------------------------------------------------------------------- # ● 判断鼠标位于新数值输入窗口的第几行、第几列 #-------------------------------------------------------------------------- def mouse_window_area if viewport.nil? vp_x, vp_y = 0, 0 else vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end mouse_x = Mouse.x mouse_y = Mouse.y item_x1 = vp_x + x + standard_padding item_y1 = vp_y + y + standard_padding item_x2 = vp_x + x - standard_padding + width item_y2 = vp_y + y - standard_padding + height if mouse_x < item_x1 mouse_col = -1 elsif mouse_x > item_x2 mouse_col = -2 else mouse_col = (mouse_x - item_x1) / 32 end if mouse_y < item_y1 mouse_row = -1 elsif mouse_y > item_y2 mouse_row = -2 else mouse_row = 4 * (mouse_y - item_y1 - 1) / (item_y2 - item_y1) end return mouse_row, mouse_col end #-------------------------------------------------------------------------- # ● 获取文字 #-------------------------------------------------------------------------- def get_number return false if @index == 9 || @index == 11 return TABLE[@index] end #-------------------------------------------------------------------------- # ● 判定光标位置是否在“退格”上 #-------------------------------------------------------------------------- def is_delete? @index == 9 end #-------------------------------------------------------------------------- # ● 判定光标位置是否在“确定”上 #-------------------------------------------------------------------------- def is_ok? @index == 11 end #-------------------------------------------------------------------------- # ● 更新光标 #-------------------------------------------------------------------------- def update_cursor cursor_rect.set(item_rect(@index)) end #-------------------------------------------------------------------------- # ● 判定光标是否可以移动 #-------------------------------------------------------------------------- def cursor_movable? active end #-------------------------------------------------------------------------- # ● 光标向下移动 # wrap : 允许循环 #-------------------------------------------------------------------------- def cursor_down(wrap) if @index < 9 or wrap @index = (index + 3) % 12 end end #-------------------------------------------------------------------------- # ● 光标向上移动 # wrap : 允许循环 #-------------------------------------------------------------------------- def cursor_up(wrap) if @index >= 3 or wrap @index = (index + 9) % 12 end end #-------------------------------------------------------------------------- # ● 光标向右移动 # wrap : 允许循环 #-------------------------------------------------------------------------- def cursor_right(wrap) if @index % 3 < 2 @index += 1 elsif wrap @index -= 2 end end #-------------------------------------------------------------------------- # ● 光标向左移动 # wrap : 允许循环 #-------------------------------------------------------------------------- def cursor_left(wrap) if @index % 3 > 0 @index -= 1 elsif wrap @index += 2 end end #-------------------------------------------------------------------------- # ● 处理光标的移动 #-------------------------------------------------------------------------- def process_cursor_move super update_cursor end #-------------------------------------------------------------------------- # ● “确定”、“删除字符”和“取消输入”的处理 #-------------------------------------------------------------------------- def process_handling return unless open? && active process_jump if Input.trigger?(:A) process_back if Input.repeat?(:B) process_ok if Input.trigger?(:C) end #-------------------------------------------------------------------------- # ● 跳转“确定” #-------------------------------------------------------------------------- def process_jump if @index != 11 @index = 11 Sound.play_cursor end end #-------------------------------------------------------------------------- # ● 后退一个字符 #-------------------------------------------------------------------------- def process_back Sound.play_cancel place = 10 ** (@digits_max - 1 - @old_window_index) n = (@number / place) % 10 @number -= n * place @number_proc.call(@number) @old_window_index -= 1 if @old_window_index > 0 @index_proc.call(@old_window_index) @refresh_proc.call end #-------------------------------------------------------------------------- # ● 按下确定键时的处理 #-------------------------------------------------------------------------- def process_ok return if Mouse.trigger?(:L) && mouse_out_rect? if get_number Sound.play_cursor place = 10 ** (@digits_max - 1 - @old_window_index) n = get_number - (@number / place) % 10 @number += n * place @number_proc.call(@number) @old_window_index += 1 if @old_window_index < @digits_max - 1 @index_proc.call(@old_window_index) @refresh_proc.call elsif is_delete? process_back elsif is_ok? on_input_ok end end #-------------------------------------------------------------------------- # ● 确定 #-------------------------------------------------------------------------- def on_input_ok @index = 0 @old_window_index = 0 $game_variables[@variable_id] = @number Sound.play_ok @close_proc.call end #-------------------------------------------------------------------------- # ● 方向键移动光标时将鼠标移动到对应的光标位置 #-------------------------------------------------------------------------- def set_mouse_pos if viewport.nil? # necessary! vp_x, vp_y = 0, 0 else vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end item_x1 = vp_x + x + standard_padding item_y1 = vp_y + y + standard_padding get_index = @index < 0 ? 0 : @index new_x = item_x1 + 32 * (get_index % 3 + 0.5) new_y = item_y1 + 24 * (get_index / 3 + 0.5) Mouse.set_pos(new_x, new_y) end end #============================================================================== # ■ Window_Message #------------------------------------------------------------------------------ # 显示文字信息的窗口。 #============================================================================== class Window_Message < Window_Base #-------------------------------------------------------------------------- # ● 处理数值的输入(覆盖原方法) #-------------------------------------------------------------------------- def input_number @number_window.start Fiber.yield while @number_window.extra_window.active end end #============================================================================== # ■ Window_PartyCommand #------------------------------------------------------------------------------ # 战斗画面中,选择“战斗/撤退”的窗口。 #============================================================================== class Window_PartyCommand < Window_Command #-------------------------------------------------------------------------- # ● 方向键移动光标时将鼠标移动到对应的光标位置 #-------------------------------------------------------------------------- def set_mouse_pos if viewport.nil? vp_x, vp_y = 0, 0 else #vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end item_x1 = x + standard_padding item_y1 = vp_y + y + standard_padding get_index = @index < 0 ? 0 : @index row = get_index / col_max - top_row col = get_index % col_max new_x = item_x1 + item_width * (col + 0.5) new_y = item_y1 + item_height * (row + 0.5) Mouse.set_pos(new_x, new_y) end end #============================================================================== # ■ Window_ActorCommand #------------------------------------------------------------------------------ # 战斗画面中,选择角色行动的窗口。 #============================================================================== class Window_ActorCommand < Window_Command #-------------------------------------------------------------------------- # ● 方向键移动光标时将鼠标移动到对应的光标位置 #-------------------------------------------------------------------------- def set_mouse_pos if viewport.nil? vp_x, vp_y = 0, 0 else #vp_x = viewport.rect.x - viewport.ox vp_y = viewport.rect.y - viewport.oy end item_x1 = Graphics.width - width + standard_padding item_y1 = vp_y + y + standard_padding get_index = @index < 0 ? 0 : @index row = get_index / col_max - top_row col = get_index % col_max new_x = item_x1 + item_width * (col + 0.5) new_y = item_y1 + item_height * (row + 0.5) Mouse.set_pos(new_x, new_y) end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ # 处理玩家人物的类。拥有事件启动的判定、地图的卷动等功能。 # 本类的实例请参考 $game_player 。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● 由方向移动(覆盖原方法) #-------------------------------------------------------------------------- def move_by_input return if !movable? || $game_map.interpreter.running? if Input.dir4 > 0 move_straight(Input.dir4) reset_move_path else move_by_mouse end end #-------------------------------------------------------------------------- # ● 非移动中的处理(覆盖原方法) # last_moving : 此前是否正在移动 #-------------------------------------------------------------------------- def update_nonmoving(last_moving) return if $game_map.interpreter.running? if last_moving $game_party.on_player_walk return if check_touch_event end if movable? && Input.trigger?(:C) return if Mouse.press?(:L) # 防止按下鼠标左键绘制路径时触发事件或载具切换 return if get_on_off_vehicle return if check_action_event end update_encounter if last_moving end #-------------------------------------------------------------------------- # ● 判定是否跑步状态(覆盖原方法) #-------------------------------------------------------------------------- def dash? return false if @move_route_forcing return false if $game_map.disable_dash? return false if vehicle return Input.press?(:A) || @mouse_dash end #-------------------------------------------------------------------------- # ● 初始化 #-------------------------------------------------------------------------- alias sion_mouse_initialize initialize def initialize sion_mouse_initialize reset_move_path @moveto_x = 0 @moveto_y = 0 end #-------------------------------------------------------------------------- # ● 更新 #-------------------------------------------------------------------------- alias sion_mouse_update update def update sion_mouse_update clear_unreachable_sign end #-------------------------------------------------------------------------- # ● 处理卷动 #-------------------------------------------------------------------------- alias sion_mouse_update_scroll update_scroll def update_scroll(last_real_x, last_real_y) return if $game_map.scrolling? || $game_map.wait_scroll KsOfSion::New_Scroll ? new_update_scroll : sion_mouse_update_scroll(last_real_x, last_real_y) end #-------------------------------------------------------------------------- # ● 重置移动路径相关信息 #-------------------------------------------------------------------------- def reset_move_path @mouse_dash = false @mouse_move_path = [] $mouse_move_sign.transparent = true end #-------------------------------------------------------------------------- # ● 新的卷动地图方法 #-------------------------------------------------------------------------- def new_update_scroll return if $game_message.busy? || $game_message.visible horz_speed = 2 ** @move_speed * KsOfSion::Map_Scroll_Spd / Graphics.width vert_speed = 2 ** @move_speed * KsOfSion::Map_Scroll_Spd / Graphics.height ax = $game_map.adjust_x(@real_x) ay = $game_map.adjust_y(@real_y) if ay>center_y; $game_map.new_scroll_down (vert_speed * (ay - center_y)) elsif ay<center_y; $game_map.new_scroll_up (vert_speed * (center_y - ay)) end if ax>center_x; $game_map.new_scroll_right(horz_speed * (ax - center_x)) elsif ax<center_x; $game_map.new_scroll_left (horz_speed * (center_x - ax)) end end #-------------------------------------------------------------------------- # ● 消除不能抵达图标 #-------------------------------------------------------------------------- def clear_unreachable_sign return if Mouse.press?(:L) if $mouse_move_sign.direction == 4 && Mouse.click_count % 20 == 0 $mouse_move_sign.transparent = true $mouse_move_sign.direction = 2 end end #-------------------------------------------------------------------------- # ● 由鼠标移动 #-------------------------------------------------------------------------- def move_by_mouse unless @mouse_move_path.empty? # 移动路线数组不为空则执行移动 dir = @mouse_move_path.shift if passable?(x, y, dir) && !@mouse_move_path.empty? move_straight(dir) elsif @mouse_move_path.empty? # 判断是否是最后一步 x2 = $game_map.round_x_with_direction(x, dir) y2 = $game_map.round_y_with_direction(y, dir) move_straight(dir) unless dir.zero? unless @x == x2 && @y == y2 # 如果移动失败,检查是否启动前方事件 check_event_trigger_there([0,1,2]) get_on_off_vehicle unless $game_map.setup_starting_event end $mouse_move_sign.transparent = true if $mouse_move_sign.direction == 2 @mouse_dash = false elsif @mouse_move_path[0].zero? # 目标点无法抵达,调整朝向→目标点 @mouse_move_path.shift @direction = dir @mouse_dash = false else draw_move_path end end end #-------------------------------------------------------------------------- # ● 地图界面按下鼠标左键的处理 #-------------------------------------------------------------------------- def left_button_action @moveto_x = $game_map.mouse_map_x @moveto_y = $game_map.mouse_map_y return mouse_same_pos_action if @moveto_x == @x && @moveto_y == @y return if mouse_trigger_event? return unless drawable? $mouse_move_sign.moveto(@moveto_x, @moveto_y) # 移动路径点指示图 @mouse_dash = true if Mouse.double_click? # 双击冲刺 return if Mouse.left_state % 10 != 1 # 按住鼠标左键10帧绘制1次路径 for i in 1..4 # 判断目标点是否为角色周围四点 if @x == $game_map.round_x_with_direction(@moveto_x, i * 2) && @y == $game_map.round_y_with_direction(@moveto_y, i * 2) $mouse_move_sign.transparent = true @mouse_move_path = [10 - i * 2] return end end draw_move_path end #-------------------------------------------------------------------------- # ● 鼠标位置与玩家一致的处理 #-------------------------------------------------------------------------- def mouse_same_pos_action unless moving? || (vehicle && !vehicle.movable?) check_event_trigger_here([0]) # 判断是否触发重合点事件 get_on_off_vehicle if !$game_map.setup_starting_event && $game_map.airship.pos?(@x, @y) # 判断是否要上、下飞艇 end end #-------------------------------------------------------------------------- # ● trigger 鼠标左键的处理 #-------------------------------------------------------------------------- def mouse_trigger_event? if Mouse.trigger?(:L) $game_map.events_xy(@moveto_x, @moveto_y).each {|event| if event.mouse_start? event.start return true end } end return false end #-------------------------------------------------------------------------- # ● 绘制移动路径 @array[move_directions...] #-------------------------------------------------------------------------- def draw_move_path @mouse_move_path = case @vehicle_type when :walk; draw_walk_path when :boat; draw_boat_path when :ship; draw_ship_path when :airship; draw_air_path end end #-------------------------------------------------------------------------- # ● 判定是否可以绘制移动路径 #-------------------------------------------------------------------------- def drawable? return false if @move_route_forcing || @followers.gathering? return false if @vehicle_getting_on || @vehicle_getting_off return true end #-------------------------------------------------------------------------- # ● 绘制行走路径 @array[move_directions...] #-------------------------------------------------------------------------- def draw_walk_path # 准备绘制路径表格 sheet = Table.new($game_map.width, $game_map.height) reversed_chase_path = []; chase_path = [] reversed_chase_point = []; chase_point = [] new_start_points = [x, y]; new_end_points = [@moveto_x, @moveto_y] sheet[x, y] = 1; sheet[@moveto_x, @moveto_y] = 2 reach_point = false step = 3 loop do #loop1 开始填充表格 draw_path = false check_points = new_start_points new_start_points = [] loop do #loop2 从起点开始正向填充 point_x = check_points.shift break if point_x == nil point_y = check_points.shift left_x = $game_map.round_x(point_x - 1) right_x = $game_map.round_x(point_x + 1) up_y = $game_map.round_y(point_y - 1) down_y = $game_map.round_y(point_y + 1) # 判断路径是否连通 path_step = step - 1 if sheet[left_x, point_y] == path_step && $game_map.passable?(left_x, point_y, 6) && $game_map.passable?(point_x, point_y, 4) chase_path.push(4) chase_point = [left_x, point_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[right_x, point_y] == path_step && $game_map.passable?(right_x, point_y, 4) && $game_map.passable?(point_x, point_y, 6) chase_path.push(6) chase_point = [right_x, point_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[point_x, up_y] == path_step && $game_map.passable?(point_x, up_y, 2) && $game_map.passable?(point_x, point_y, 8) chase_path.push(8) chase_point = [point_x, up_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[point_x, down_y] == path_step && $game_map.passable?(point_x, down_y, 8) && $game_map.passable?(point_x, point_y, 2) chase_path.push(2) chase_point = [point_x, down_y] reversed_chase_point = [point_x, point_y] reach_point = true; break end # 以需要抵达该点的步数填充路径表格 # if sheet[left_x, point_y] == 0 && $game_map.passable?(left_x, point_y, 6) && !collide_with_events?(left_x, point_y) && $game_map.passable?(point_x, point_y, 4) && !collide_with_vehicles?(left_x, point_y) #judge_end sheet[left_x, point_y] = step draw_path = true new_start_points.push(left_x, point_y) end if sheet[right_x, point_y] == 0 && $game_map.passable?(right_x, point_y, 4) && !collide_with_events?(right_x, point_y) && $game_map.passable?(point_x, point_y, 6) && !collide_with_vehicles?(right_x, point_y)#judge_end sheet[right_x, point_y] = step draw_path = true new_start_points.push(right_x, point_y) end if sheet[point_x, up_y] == 0 && $game_map.passable?(point_x, up_y, 2) && !collide_with_events?(point_x, up_y) && $game_map.passable?(point_x, point_y, 8) && !collide_with_vehicles?(point_x, up_y) #judge_end sheet[point_x, up_y] = step draw_path = true new_start_points.push(point_x, up_y) end if sheet[point_x, down_y] == 0 && $game_map.passable?(point_x, down_y, 8) && !collide_with_events?(point_x, down_y) && $game_map.passable?(point_x, point_y, 2) && !collide_with_vehicles?(point_x, down_y) #judge_end sheet[point_x, down_y] = step draw_path = true new_start_points.push(point_x, down_y) end end#endOfLoop2 break if !draw_path || reach_point draw_path = false check_points = new_end_points new_end_points = [] step += 1 break if step > KsOfSion::Break_Steps && !Input.press?(KsOfSion::Find_Path_Key) loop do #loop3 从终点开始反向填充 point_x = check_points.shift break if point_x == nil point_y = check_points.shift left_x = $game_map.round_x(point_x - 1) right_x = $game_map.round_x(point_x + 1) up_y = $game_map.round_y(point_y - 1) down_y = $game_map.round_y(point_y + 1) # 判断路径是否连通 path_step = step - 1 if sheet[left_x, point_y] == path_step && $game_map.passable?(left_x, point_y, 6) && $game_map.passable?(point_x, point_y, 4) chase_path.push(6) chase_point = [point_x, point_y] reversed_chase_point = [left_x, point_y] reach_point = true; break elsif sheet[right_x, point_y] == path_step && $game_map.passable?(right_x, point_y, 4) && $game_map.passable?(point_x, point_y, 6) chase_path.push(4) chase_point = [point_x, point_y] reversed_chase_point = [right_x, point_y] reach_point = true; break elsif sheet[point_x, up_y] == path_step && $game_map.passable?(point_x, up_y, 2) && $game_map.passable?(point_x, point_y, 8) chase_path.push(2) chase_point = [point_x, point_y] reversed_chase_point = [point_x, up_y] reach_point = true; break elsif sheet[point_x, down_y] == path_step && $game_map.passable?(point_x, down_y, 8) && $game_map.passable?(point_x, point_y, 2) chase_path.push(8) chase_point = [point_x, point_y] reversed_chase_point = [point_x, down_y] reach_point = true; break end # 以需要抵达该点的步数填充路径表格 # if sheet[left_x, point_y] == 0 && $game_map.passable?(left_x, point_y, 6) && !collide_with_events?(left_x, point_y) && $game_map.passable?(point_x, point_y, 4) && !collide_with_vehicles?(left_x, point_y) #judge_end sheet[left_x, point_y] = step draw_path = true new_end_points.push(left_x, point_y) end if sheet[right_x, point_y] == 0 && $game_map.passable?(right_x, point_y, 4) && !collide_with_events?(right_x, point_y) && $game_map.passable?(point_x, point_y, 6) && !collide_with_vehicles?(right_x, point_y)#judge_end sheet[right_x, point_y] = step draw_path = true new_end_points.push(right_x, point_y) end if sheet[point_x, up_y] == 0 && $game_map.passable?(point_x, up_y, 2) && !collide_with_events?(point_x, up_y) && $game_map.passable?(point_x, point_y, 8) && !collide_with_vehicles?(point_x, up_y) #judge_end sheet[point_x, up_y] = step draw_path = true new_end_points.push(point_x, up_y) end if sheet[point_x, down_y] == 0 && $game_map.passable?(point_x, down_y, 8) && !collide_with_events?(point_x, down_y) && $game_map.passable?(point_x, point_y, 2) && !collide_with_vehicles?(point_x, down_y) #judge_end sheet[point_x, down_y] = step draw_path = true new_end_points.push(point_x, down_y) end end#endOfLoop3 break if !draw_path || reach_point step += 1 end #endOfLoop1 路径表格填充完毕 $mouse_move_sign.transparent = false # 判断指定地点能否抵达 if reach_point $mouse_move_sign.direction = 2 else return not_reach_point end # 根据路径表格绘制最短移动路径(反向) steps = step / 2 * 2 + 1 loop_times = step / 2 point_x, point_y = reversed_chase_point[0], reversed_chase_point[1] for i in 1..loop_times # forLoop steps -= 2 if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs if sheet[$game_map.round_x(point_x - 1), point_y] == steps && $game_map.passable?($game_map.round_x(point_x - 1), point_y, 6) && $game_map.passable?(point_x, point_y, 4) #judge_end reversed_chase_path.push(6) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps && $game_map.passable?($game_map.round_x(point_x + 1), point_y, 4) && $game_map.passable?(point_x, point_y, 6) #judge_end reversed_chase_path.push(4) point_x = $game_map.round_x(point_x + 1) elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps && $game_map.passable?(point_x, $game_map.round_y(point_y + 1), 8) && $game_map.passable?(point_x, point_y, 2) #judge_end reversed_chase_path.push(8) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps && $game_map.passable?(point_x, $game_map.round_y(point_y - 1), 2) && $game_map.passable?(point_x, point_y, 8) #judge_end reversed_chase_path.push(2) point_y = $game_map.round_y(point_y - 1) end else if sheet[point_x, $game_map.round_y(point_y + 1)] == steps && $game_map.passable?(point_x, $game_map.round_y(point_y + 1), 8) && $game_map.passable?(point_x, point_y, 2) #judge_end reversed_chase_path.push(8) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps && $game_map.passable?(point_x, $game_map.round_y(point_y - 1), 2) && $game_map.passable?(point_x, point_y, 8) #judge_end reversed_chase_path.push(2) point_y = $game_map.round_y(point_y - 1) elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps && $game_map.passable?($game_map.round_x(point_x - 1), point_y, 6) && $game_map.passable?(point_x, point_y, 4) #judge_end reversed_chase_path.push(6) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps && $game_map.passable?($game_map.round_x(point_x + 1), point_y, 4) && $game_map.passable?(point_x, point_y, 6) #judge_end reversed_chase_path.push(4) point_x = $game_map.round_x(point_x + 1) end end end #endOfForLoop # 根据路径表格绘制最短移动路径(正向) steps = step / 2 * 2 loop_times = step / 2 point_x, point_y = chase_point[0], chase_point[1] for i in 2..loop_times # forLoop steps -= 2 if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs if sheet[point_x, $game_map.round_y(point_y + 1)] == steps && $game_map.passable?(point_x, $game_map.round_y(point_y + 1), 8) && $game_map.passable?(point_x, point_y, 2) #judge_end chase_path.push(2) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps && $game_map.passable?(point_x, $game_map.round_y(point_y - 1), 2) && $game_map.passable?(point_x, point_y, 8) #judge_end chase_path.push(8) point_y = $game_map.round_y(point_y - 1) elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps && $game_map.passable?($game_map.round_x(point_x - 1), point_y, 6) && $game_map.passable?(point_x, point_y, 4) #judge_end chase_path.push(4) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps && $game_map.passable?($game_map.round_x(point_x + 1), point_y, 4) && $game_map.passable?(point_x, point_y, 6) #judge_end chase_path.push(6) point_x = $game_map.round_x(point_x + 1) end else if sheet[$game_map.round_x(point_x - 1), point_y] == steps && $game_map.passable?($game_map.round_x(point_x - 1), point_y, 6) && $game_map.passable?(point_x, point_y, 4) #judge_end chase_path.push(4) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps && $game_map.passable?($game_map.round_x(point_x + 1), point_y, 4) && $game_map.passable?(point_x, point_y, 6) #judge_end chase_path.push(6) point_x = $game_map.round_x(point_x + 1) elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps && $game_map.passable?(point_x, $game_map.round_y(point_y + 1), 8) && $game_map.passable?(point_x, point_y, 2) #judge_end chase_path.push(2) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps && $game_map.passable?(point_x, $game_map.round_y(point_y - 1), 2) && $game_map.passable?(point_x, point_y, 8) #judge_end chase_path.push(8) point_y = $game_map.round_y(point_y - 1) end end end #endOfForLoop reversed_chase_path.reverse + chase_path end#walk ## def not_reach_point $mouse_move_sign.direction = 4 dx = 0; dy = 0; dir = 0 if @moveto_x - x > 0 if @moveto_x - x > $game_map.width - @moveto_x + x && $game_map.loop_vertical? dx = $game_map.width - @moveto_x + x; dir = 4 else dx = @moveto_x - x; dir = 6 end else if x - @moveto_x > $game_map.width - x + @moveto_x && $game_map.loop_vertical? dx = $game_map.width - x + @moveto_x; dir = 6 else dx = x - @moveto_x; dir = 4 end end if @moveto_y - y > 0 if @moveto_y - y > $game_map.height - @moveto_y + y && $game_map.loop_horizontal? dy = $game_map.height - @moveto_y + y dir = 8 if dy > dx else dy = @moveto_y - y dir = 2 if dy > dx end else if y - @moveto_y > $game_map.height - y + @moveto_y && $game_map.loop_horizontal? dy = $game_map.height - y + @moveto_y dir = 2 if dy > dx else dy = y - @moveto_y dir = 8 if dy > dx end end return [dir, 0] # 0方向用于防止移动过程中触发事件 end #-------------------------------------------------------------------------- # ● 绘制boat的移动路径 @array[move_directions...] #-------------------------------------------------------------------------- def draw_boat_path # 准备绘制路径表格 sheet = Table.new($game_map.width, $game_map.height) reversed_chase_path = []; chase_path = [] reversed_chase_point = []; chase_point = [] new_start_points = [x, y]; new_end_points = [@moveto_x, @moveto_y] sheet[x, y] = 1; sheet[@moveto_x, @moveto_y] = 2 reach_point = false step = 3 loop do #loop1 开始填充表格 draw_path = false check_points = new_start_points new_start_points = [] loop do #loop2 从起点开始正向填充 point_x = check_points.shift break if point_x == nil point_y = check_points.shift left_x = $game_map.round_x(point_x - 1) right_x = $game_map.round_x(point_x + 1) up_y = $game_map.round_y(point_y - 1) down_y = $game_map.round_y(point_y + 1) # 判断路径是否连通 path_step = step - 1 if sheet[left_x, point_y] == path_step chase_path.push(4) chase_point = [left_x, point_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[right_x, point_y] == path_step chase_path.push(6) chase_point = [right_x, point_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[point_x, up_y] == path_step chase_path.push(8) chase_point = [point_x, up_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[point_x, down_y] == path_step chase_path.push(2) chase_point = [point_x, down_y] reversed_chase_point = [point_x, point_y] reach_point = true; break end # 以需要抵达该点的步数填充路径表格 # if sheet[left_x, point_y] == 0 && $game_map.boat_passable?(left_x, point_y) && !collide_with_events?(left_x, point_y) && !collide_with_vehicles?(left_x, point_y) #judge_end sheet[left_x, point_y] = step draw_path = true new_start_points.push(left_x, point_y) end if sheet[right_x, point_y] == 0 && $game_map.boat_passable?(right_x, point_y) && !collide_with_events?(right_x, point_y) && !collide_with_vehicles?(right_x, point_y) #judge_end sheet[right_x, point_y] = step draw_path = true new_start_points.push(right_x, point_y) end if sheet[point_x, up_y] == 0 && $game_map.boat_passable?(point_x, up_y) && !collide_with_events?(point_x, up_y) && !collide_with_vehicles?(point_x, up_y) #judge_end sheet[point_x, up_y] = step draw_path = true new_start_points.push(point_x, up_y) end if sheet[point_x, down_y] == 0 && $game_map.boat_passable?(point_x, down_y) && !collide_with_events?(point_x, down_y) && !collide_with_vehicles?(point_x, down_y) #judge_end sheet[point_x, down_y] = step draw_path = true new_start_points.push(point_x, down_y) end end#endOfLoop2 break if !draw_path || reach_point draw_path = false check_points = new_end_points new_end_points = [] step += 1 break if step > KsOfSion::Break_Steps && !Input.press?(KsOfSion::Find_Path_Key) loop do #loop3 从终点开始反向填充 point_x = check_points.shift break if point_x == nil point_y = check_points.shift left_x = $game_map.round_x(point_x - 1) right_x = $game_map.round_x(point_x + 1) up_y = $game_map.round_y(point_y - 1) down_y = $game_map.round_y(point_y + 1) # 判断路径是否连通 path_step = step - 1 if sheet[left_x, point_y] == path_step chase_path.push(6) chase_point = [point_x, point_y] reversed_chase_point = [left_x, point_y] reach_point = true; break elsif sheet[right_x, point_y] == path_step chase_path.push(4) chase_point = [point_x, point_y] reversed_chase_point = [right_x, point_y] reach_point = true; break elsif sheet[point_x, up_y] == path_step chase_path.push(2) chase_point = [point_x, point_y] reversed_chase_point = [point_x, up_y] reach_point = true; break elsif sheet[point_x, down_y] == path_step chase_path.push(8) chase_point = [point_x, point_y] reversed_chase_point = [point_x, down_y] reach_point = true; break end # 以需要抵达该点的步数填充路径表格 # if sheet[left_x, point_y] == 0 && $game_map.boat_passable?(left_x, point_y) && !collide_with_events?(left_x, point_y) && !collide_with_vehicles?(left_x, point_y) #judge_end sheet[left_x, point_y] = step draw_path = true new_end_points.push(left_x, point_y) end if sheet[right_x, point_y] == 0 && $game_map.boat_passable?(right_x, point_y) && !collide_with_events?(right_x, point_y) && !collide_with_vehicles?(right_x, point_y) #judge_end sheet[right_x, point_y] = step draw_path = true new_end_points.push(right_x, point_y) end if sheet[point_x, up_y] == 0 && $game_map.boat_passable?(point_x, up_y) && !collide_with_events?(point_x, up_y) && !collide_with_vehicles?(point_x, up_y) #judge_end sheet[point_x, up_y] = step draw_path = true new_end_points.push(point_x, up_y) end if sheet[point_x, down_y] == 0 && $game_map.boat_passable?(point_x, down_y) && !collide_with_events?(point_x, down_y) && !collide_with_vehicles?(point_x, down_y) #judge_end sheet[point_x, down_y] = step draw_path = true new_end_points.push(point_x, down_y) end end#endOfLoop3 break if !draw_path || reach_point step += 1 end #endOfLoop1 路径表格填充完毕 $mouse_move_sign.transparent = false # 判断指定地点能否抵达 reach_point ? $mouse_move_sign.direction = 2 : (return not_reach_point) # 根据路径表格绘制最短移动路径(正向) steps = step / 2 * 2 loop_times = step / 2 point_x, point_y = chase_point[0], chase_point[1] for i in 2..loop_times # forLoop steps -= 2 if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs if sheet[point_x, $game_map.round_y(point_y + 1)] == steps chase_path.push(2) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps chase_path.push(8) point_y = $game_map.round_y(point_y - 1) elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps chase_path.push(4) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps chase_path.push(6) point_x = $game_map.round_x(point_x + 1) end else if sheet[$game_map.round_x(point_x - 1), point_y] == steps chase_path.push(4) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps chase_path.push(6) point_x = $game_map.round_x(point_x + 1) elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps chase_path.push(2) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps chase_path.push(8) point_y = $game_map.round_y(point_y - 1) end end end #endOfForLoop # 如果指定点无法抵达或者登陆 return not_reach_point unless landable?(@moveto_x, @moveto_y, chase_path) # 根据路径表格绘制最短移动路径(反向) steps = step / 2 * 2 + 1 loop_times = step / 2 point_x, point_y = reversed_chase_point[0], reversed_chase_point[1] for i in 1..loop_times # forLoop steps -= 2 if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs if sheet[$game_map.round_x(point_x - 1), point_y] == steps reversed_chase_path.push(6) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps reversed_chase_path.push(4) point_x = $game_map.round_x(point_x + 1) elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps reversed_chase_path.push(8) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps reversed_chase_path.push(2) point_y = $game_map.round_y(point_y - 1) end else if sheet[point_x, $game_map.round_y(point_y + 1)] == steps reversed_chase_path.push(8) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps reversed_chase_path.push(2) point_y = $game_map.round_y(point_y - 1) elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps reversed_chase_path.push(6) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps reversed_chase_path.push(4) point_x = $game_map.round_x(point_x + 1) end end end #endOfForLoop return reversed_chase_path.reverse + chase_path end#boat #-------------------------------------------------------------------------- # ● 绘制ship的移动路径 @array[move_directions...] #-------------------------------------------------------------------------- def draw_ship_path # 准备绘制路径表格 sheet = Table.new($game_map.width, $game_map.height) reversed_chase_path = []; chase_path = [] reversed_chase_point = []; chase_point = [] new_start_points = [x, y]; new_end_points = [@moveto_x, @moveto_y] sheet[x, y] = 1; sheet[@moveto_x, @moveto_y] = 2 reach_point = false step = 3 loop do #loop1 开始填充表格 draw_path = false check_points = new_start_points new_start_points = [] loop do #loop2 从起点开始正向填充 point_x = check_points.shift break if point_x == nil point_y = check_points.shift left_x = $game_map.round_x(point_x - 1) right_x = $game_map.round_x(point_x + 1) up_y = $game_map.round_y(point_y - 1) down_y = $game_map.round_y(point_y + 1) # 判断路径是否连通 path_step = step - 1 if sheet[left_x, point_y] == path_step chase_path.push(4) chase_point = [left_x, point_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[right_x, point_y] == path_step chase_path.push(6) chase_point = [right_x, point_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[point_x, up_y] == path_step chase_path.push(8) chase_point = [point_x, up_y] reversed_chase_point = [point_x, point_y] reach_point = true; break elsif sheet[point_x, down_y] == path_step chase_path.push(2) chase_point = [point_x, down_y] reversed_chase_point = [point_x, point_y] reach_point = true; break end # 以需要抵达该点的步数填充路径表格 # if sheet[left_x, point_y] == 0 && $game_map.ship_passable?(left_x, point_y) && !collide_with_events?(left_x, point_y) && !collide_with_vehicles?(left_x, point_y) #judge_end sheet[left_x, point_y] = step draw_path = true new_start_points.push(left_x, point_y) end if sheet[right_x, point_y] == 0 && $game_map.ship_passable?(right_x, point_y) && !collide_with_events?(right_x, point_y) && !collide_with_vehicles?(right_x, point_y) #judge_end sheet[right_x, point_y] = step draw_path = true new_start_points.push(right_x, point_y) end if sheet[point_x, up_y] == 0 && $game_map.ship_passable?(point_x, up_y) && !collide_with_events?(point_x, up_y) && !collide_with_vehicles?(point_x, up_y) #judge_end sheet[point_x, up_y] = step draw_path = true new_start_points.push(point_x, up_y) end if sheet[point_x, down_y] == 0 && $game_map.ship_passable?(point_x, down_y) && !collide_with_events?(point_x, down_y) && !collide_with_vehicles?(point_x, down_y) #judge_end sheet[point_x, down_y] = step draw_path = true new_start_points.push(point_x, down_y) end end#endOfLoop2 break if !draw_path || reach_point draw_path = false check_points = new_end_points new_end_points = [] step += 1 break if step > KsOfSion::Break_Steps && !Input.press?(KsOfSion::Find_Path_Key) loop do #loop3 从终点开始反向填充 point_x = check_points.shift break if point_x == nil point_y = check_points.shift left_x = $game_map.round_x(point_x - 1) right_x = $game_map.round_x(point_x + 1) up_y = $game_map.round_y(point_y - 1) down_y = $game_map.round_y(point_y + 1) # 判断路径是否连通 path_step = step - 1 if sheet[left_x, point_y] == path_step chase_path.push(6) chase_point = [point_x, point_y] reversed_chase_point = [left_x, point_y] reach_point = true; break elsif sheet[right_x, point_y] == path_step chase_path.push(4) chase_point = [point_x, point_y] reversed_chase_point = [right_x, point_y] reach_point = true; break elsif sheet[point_x, up_y] == path_step chase_path.push(2) chase_point = [point_x, point_y] reversed_chase_point = [point_x, up_y] reach_point = true; break elsif sheet[point_x, down_y] == path_step chase_path.push(8) chase_point = [point_x, point_y] reversed_chase_point = [point_x, down_y] reach_point = true; break end # 以需要抵达该点的步数填充路径表格 # if sheet[left_x, point_y] == 0 && $game_map.ship_passable?(left_x, point_y) && !collide_with_events?(left_x, point_y) && !collide_with_vehicles?(left_x, point_y) #judge_end sheet[left_x, point_y] = step draw_path = true new_end_points.push(left_x, point_y) end if sheet[right_x, point_y] == 0 && $game_map.ship_passable?(right_x, point_y) && !collide_with_events?(right_x, point_y) && !collide_with_vehicles?(right_x, point_y) #judge_end sheet[right_x, point_y] = step draw_path = true new_end_points.push(right_x, point_y) end if sheet[point_x, up_y] == 0 && $game_map.ship_passable?(point_x, up_y) && !collide_with_events?(point_x, up_y) && !collide_with_vehicles?(point_x, up_y) #judge_end sheet[point_x, up_y] = step draw_path = true new_end_points.push(point_x, up_y) end if sheet[point_x, down_y] == 0 && $game_map.ship_passable?(point_x, down_y) && !collide_with_events?(point_x, down_y) && !collide_with_vehicles?(point_x, down_y) #judge_end sheet[point_x, down_y] = step draw_path = true new_end_points.push(point_x, down_y) end end#endOfLoop3 break if !draw_path || reach_point step += 1 end #endOfLoop1 路径表格填充完毕 $mouse_move_sign.transparent = false # 判断指定地点能否抵达 reach_point ? $mouse_move_sign.direction = 2 : (return not_reach_point) # 根据路径表格绘制最短移动路径(正向) steps = step / 2 * 2 loop_times = step / 2 point_x, point_y = chase_point[0], chase_point[1] for i in 2..loop_times # forLoop steps -= 2 if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs if sheet[point_x, $game_map.round_y(point_y + 1)] == steps chase_path.push(2) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps chase_path.push(8) point_y = $game_map.round_y(point_y - 1) elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps chase_path.push(4) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps chase_path.push(6) point_x = $game_map.round_x(point_x + 1) end else if sheet[$game_map.round_x(point_x - 1), point_y] == steps chase_path.push(4) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps chase_path.push(6) point_x = $game_map.round_x(point_x + 1) elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps chase_path.push(2) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps chase_path.push(8) point_y = $game_map.round_y(point_y - 1) end end end #endOfForLoop # 如果指定点无法抵达或者登陆 return not_reach_point unless landable?(@moveto_x, @moveto_y, chase_path) # 根据路径表格绘制最短移动路径(反向) steps = step / 2 * 2 + 1 loop_times = step / 2 point_x, point_y = reversed_chase_point[0], reversed_chase_point[1] for i in 1..loop_times # forLoop steps -= 2 if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs if sheet[$game_map.round_x(point_x - 1), point_y] == steps reversed_chase_path.push(6) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps reversed_chase_path.push(4) point_x = $game_map.round_x(point_x + 1) elsif sheet[point_x, $game_map.round_y(point_y + 1)] == steps reversed_chase_path.push(8) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps reversed_chase_path.push(2) point_y = $game_map.round_y(point_y - 1) end else if sheet[point_x, $game_map.round_y(point_y + 1)] == steps reversed_chase_path.push(8) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == steps reversed_chase_path.push(2) point_y = $game_map.round_y(point_y - 1) elsif sheet[$game_map.round_x(point_x - 1), point_y] == steps reversed_chase_path.push(6) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == steps reversed_chase_path.push(4) point_x = $game_map.round_x(point_x + 1) end end end #endOfForLoop return reversed_chase_path.reverse + chase_path end#ship #-------------------------------------------------------------------------- # ● 绘制airship的移动路径 @array[move_directions...] #-------------------------------------------------------------------------- def draw_air_path $mouse_move_sign.transparent = false # 准备绘制路径表格 sheet = Table.new($game_map.width, $game_map.height) new_check_point = [x, y]; sheet[x, y] = 1 reach_point = false; step = 2 loop do #loop1 check_point = new_check_point new_check_point = [] loop do #loop2 point_x = check_point.shift break if point_x == nil point_y = check_point.shift if point_x == @moveto_x && point_y == @moveto_y reach_point = true; break end left_x = $game_map.round_x(point_x - 1) right_x = $game_map.round_x(point_x + 1) up_y = $game_map.round_y(point_y - 1) down_y = $game_map.round_y(point_y + 1) # 以需要抵达该点的步数填充路径表格 # if sheet[left_x, point_y] == 0 sheet[left_x, point_y] = step new_check_point.push(left_x, point_y) end if sheet[right_x, point_y] == 0 sheet[right_x, point_y] = step new_check_point.push(right_x, point_y) end if sheet[point_x, up_y] == 0 sheet[point_x, up_y] = step new_check_point.push(point_x, up_y) end if sheet[point_x, down_y] == 0 sheet[point_x, down_y] = step new_check_point.push(point_x, down_y) end end#endOfLoop2 break if reach_point step += 1 end #endOfLoop1 # 根据路径表格绘制最短移动路径 # reversed_chase_path = []; step -= 1 point_x, point_y = @moveto_x, @moveto_y for i in 2..step step -= 1 if (@moveto_x - point_x).abs < (@moveto_y - point_y).abs if sheet[$game_map.round_x(point_x - 1), point_y] == step reversed_chase_path.push(6) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == step reversed_chase_path.push(4) point_x = $game_map.round_x(point_x + 1) elsif sheet[point_x, $game_map.round_y(point_y + 1)] == step reversed_chase_path.push(8) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == step reversed_chase_path.push(2) point_y = $game_map.round_y(point_y - 1) end else if sheet[point_x, $game_map.round_y(point_y + 1)] == step reversed_chase_path.push(8) point_y = $game_map.round_y(point_y + 1) elsif sheet[point_x, $game_map.round_y(point_y - 1)] == step reversed_chase_path.push(2) point_y = $game_map.round_y(point_y - 1) elsif sheet[$game_map.round_x(point_x - 1), point_y] == step reversed_chase_path.push(6) point_x = $game_map.round_x(point_x - 1) elsif sheet[$game_map.round_x(point_x + 1), point_y] == step reversed_chase_path.push(4) point_x = $game_map.round_x(point_x + 1) end end end #endOfForLoop return reversed_chase_path.reverse end#airship #-------------------------------------------------------------------------- # ● 判断目标点是否能抵达、登陆,用于船只路径绘制 #-------------------------------------------------------------------------- def landable?(x, y, path) case @vehicle_type when :ship; return $game_map.ship_passable?(x, y) || $game_map.passable?(x, y, 10 - path[-1]) when :boat; return $game_map.boat_passable?(x, y) || $game_map.passable?(x, y, 10 - path[-1]) end end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ # 管理地图的类。拥有卷动地图以及判断通行度的功能。 # 本类的实例请参考 $game_map 。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● 初始化对象 #-------------------------------------------------------------------------- alias sion_mouse_initialize initialize def initialize sion_mouse_initialize creat_move_sign ### set_constants end #-------------------------------------------------------------------------- # ● 更新画面 # main : 事件解释器更新的标志 #-------------------------------------------------------------------------- alias sion_mouse_update update def update(main = false) sion_mouse_update(main) update_move_sign end #-------------------------------------------------------------------------- # ● 设置显示位置 #-------------------------------------------------------------------------- alias sion_mouse_set_display_pos set_display_pos def set_display_pos(x, y) sion_mouse_set_display_pos(x, y) @_display_y_ = @display_y @_display_x_ = @display_x end #-------------------------------------------------------------------------- # ● 创建显示路径点的事件 #-------------------------------------------------------------------------- def creat_move_sign $mouse_move_sign = Move_Sign.new end #-------------------------------------------------------------------------- # ● 更新显示路径点的事件 #-------------------------------------------------------------------------- def set_constants @mouse_pos_setted = true @set_pos_prepared = false @mouse_old_x = 0 @mouse_old_y = 0 end #-------------------------------------------------------------------------- # ● 更新显示路径点的事件 #-------------------------------------------------------------------------- def update_move_sign $mouse_move_sign.update end #-------------------------------------------------------------------------- # ● 获取鼠标位于的地图块的x、y坐标 #-------------------------------------------------------------------------- def mouse_map_x round_x((@display_x + Mouse.x / 32.0).to_i) end def mouse_map_y round_y((@display_y + Mouse.y / 32.0).to_i) end #-------------------------------------------------------------------------- # ● 返回地图画面时重设鼠标坐标 #-------------------------------------------------------------------------- def reset_mouse_pos return if @mouse_pos_setted Mouse.set_pos(@mouse_old_x, @mouse_old_y) @mouse_pos_setted = true @set_pos_prepared = false end #-------------------------------------------------------------------------- # ● 重设鼠标的坐标 #-------------------------------------------------------------------------- def prepare_reset_mouse_pos return if @set_pos_prepared @mouse_pos_setted = false @mouse_old_x = Mouse.x @mouse_old_y = Mouse.y @set_pos_prepared = true end #-------------------------------------------------------------------------- # ● 向下卷动 #-------------------------------------------------------------------------- def new_scroll_down(distance) if loop_vertical? @_display_y_ += distance @_display_y_ %= @map.height @parallax_y += distance if @parallax_loop_y else last_y = @_display_y_ @_display_y_ = [@_display_y_ + distance, height - screen_tile_y].min @parallax_y += @_display_y_ - last_y end @display_y = (@_display_y_ * 32).round / 32.0 end #-------------------------------------------------------------------------- # ● 向左卷动 #-------------------------------------------------------------------------- def new_scroll_left(distance) if loop_horizontal? @_display_x_ += @map.width - distance @_display_x_ %= @map.width @parallax_x -= distance if @parallax_loop_x else last_x = @_display_x_ @_display_x_ = [@_display_x_ - distance, 0].max @parallax_x += @_display_x_ - last_x end @display_x = (@_display_x_ * 32).round / 32.0 end #-------------------------------------------------------------------------- # ● 向右卷动 #-------------------------------------------------------------------------- def new_scroll_right(distance) if loop_horizontal? @_display_x_ += distance @_display_x_ %= @map.width @parallax_x += distance if @parallax_loop_x else last_x = @_display_x_ @_display_x_ = [@_display_x_ + distance, (width - screen_tile_x)].min @parallax_x += @_display_x_ - last_x end @display_x = (@_display_x_ * 32).round / 32.0 end #-------------------------------------------------------------------------- # ● 向上卷动 #-------------------------------------------------------------------------- def new_scroll_up(distance) if loop_vertical? @_display_y_ += @map.height - distance @_display_y_ %= @map.height @parallax_y -= distance if @parallax_loop_y else last_y = @_display_y_ @_display_y_ = [@_display_y_ - distance, 0].max @parallax_y += @_display_y_ - last_y end @display_y = (@_display_y_ * 32).round / 32.0 end end #============================================================================== # ■ Spriteset_Map #------------------------------------------------------------------------------ # 处理地图画面精灵和图块的类。本类在 Scene_Map 类的内部使用。 #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ● 生成路径点精灵 #-------------------------------------------------------------------------- alias sion_mouse_create_characters create_characters def create_characters sion_mouse_create_characters @character_sprites.push(Sprite_Character.new(@viewport1, $mouse_move_sign)) end end #============================================================================== # ■ SceneManager #============================================================================== class << SceneManager alias sion_mouse_snapshot_for_background snapshot_for_background def snapshot_for_background Mouse.sprite.visible = false sion_mouse_snapshot_for_background Mouse.sprite.visible = true end end #============================================================================== # ■ Scene_Map #------------------------------------------------------------------------------ # 地图画面 #============================================================================== class Scene_Map #-------------------------------------------------------------------------- # ● 画面更新 #-------------------------------------------------------------------------- alias sion_mouse_update_scene update_scene def update_scene sion_mouse_update_scene update_mouse_action unless scene_changing? || $game_map.interpreter.running? end #-------------------------------------------------------------------------- # ● 场所移动前的处理 #-------------------------------------------------------------------------- alias sion_mouse_pre_transfer pre_transfer def pre_transfer $game_player.reset_move_path sion_mouse_pre_transfer end #-------------------------------------------------------------------------- # ● 监听鼠标左键的按下 #-------------------------------------------------------------------------- def update_mouse_action $game_player.left_button_action if Mouse.press?(:L) end end #============================================================================== # ■ Scene_File #------------------------------------------------------------------------------ # 存档画面和读档画面共同的父类 #============================================================================== class Scene_File < Scene_MenuBase #-------------------------------------------------------------------------- # ● 开始处理 #-------------------------------------------------------------------------- alias sion_mouse_start start def start sion_mouse_start @move_state = 0 set_mouse_pos end #-------------------------------------------------------------------------- # ● 更新画面 #-------------------------------------------------------------------------- alias sion_mouse_update update def update sion_mouse_update Input.dir4.zero? ? set_cursor : set_mouse_pos end #-------------------------------------------------------------------------- # ● 更新光标 #-------------------------------------------------------------------------- def set_cursor @move_state += 1 last_index = @index if mouse_which_window == -2 if (@move_state - 1) % 6 == 0 @index = (@index + 1) % item_max if @index < item_max - 1 end elsif mouse_which_window == -1 if (@move_state - 1) % 6 == 0 @index = (@index - 1 + item_max) % item_max if @index > 0 end else @move_state = 0 @index = top_index + mouse_which_window end ensure_cursor_visible if @index != last_index @savefile_windows[last_index].selected = false @savefile_windows[@index].selected = true end end #-------------------------------------------------------------------------- # ● 判断鼠标位于哪个窗口 #-------------------------------------------------------------------------- def mouse_which_window mouse_x = Mouse.x mouse_y = Mouse.y if mouse_y < @help_window.height + 14 mouse_row = -1 elsif mouse_y > Graphics.height - 14 mouse_row = -2 else mouse_row = 4 * (mouse_y - @help_window.height) / (Graphics.height - @help_window.height) end return mouse_row end #-------------------------------------------------------------------------- # ● 方向键移动光标时将鼠标移动到对应的光标位置 #-------------------------------------------------------------------------- def set_mouse_pos new_x = 40 new_y = @help_window.height + savefile_height * (@index - top_index) + 24 Mouse.set_pos(new_x, new_y) end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ # 处理事件的类。拥有条件判断、事件页的切换、并行处理、执行事件等功能。 # 在 Game_Map 类的内部使用。 #============================================================================== class Game_Event < Game_Character alias_method :sion_mouse_start, :start alias_method :sion_mouse_setup_page, :setup_page def start return if mouse_start? && !Mouse.press?(:L) sion_mouse_start end def mouse_start? @mouse_start end def setup_page(p) sion_mouse_setup_page(p) sion_mouse_read_event_notes end def sion_mouse_read_event_notes @mouse_start = false @list.each {|cmd| break if sion_mouse_scan_list(cmd)} unless empty? end def sion_mouse_scan_list(cmd) return false unless cmd.code == 108 || cmd.code == 408 return @mouse_start = cmd.parameters[0].include?("鼠标启动") end end #encoding:utf-8 #============================================================================== # ■ BattleManager #------------------------------------------------------------------------------ # 战斗过程的管理器。 #============================================================================== class << BattleManager alias_method :sion_mouse_on_encounter, :on_encounter # 遇敌后重置移动路径 def on_encounter $game_player.reset_move_path sion_mouse_on_encounter end end # v2.32 卷动地图优化 class Game_Interpreter alias_method :sion_mouse_command_204, :command_204 def command_204 sion_mouse_command_204 case next_event_code when 204 Fiber.yield while $game_map.scrolling? @index += 1 execute_command when 230 $game_map.wait_scroll = true @index += 1 execute_command $game_map.wait_scroll = false end end #230 wait end class Game_Map attr_accessor :wait_scroll #-------------------------------------------------------------------------- # ● 更新画面 覆盖原方法 # main : 事件解释器更新的标志 #-------------------------------------------------------------------------- def update(main = false) refresh if @need_refresh update_scroll update_interpreter if main update_events update_vehicles update_parallax @screen.update end end
QQ图片20160714025728.png (206.3 KB, 下载次数: 21)
用了鼠标脚本后的隔空取物
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |