=begin ========================================================================== 鼠标系统按钮2.5 =========================================================================== 这是一个基于鼠标脚本,让之创造尽可能多的按钮,你要在地图屏幕或地图地,也是游戏中 为您提供完整的RMVXACE鼠标交互播放 安装、复制并粘贴上面主这个脚本做鼠标触发 - 左击:动作按钮 - 右键点击:取消按钮,关闭窗口# - 鼠标滚轮中键: DASH ———————————————————————————————————————— *主要功能 - 允许您创建按钮,并配置它们做一些事情 - 事件可以是按钮也对应地按钮!对于一些难题等等 - 允许您显示事件名称 - 全鼠标交互 - WASD移动可选 - 寻路功能,玩家可以用鼠标 Mouse.show_cursor内的鼠标光标(假的) 如果你想手动改变鼠标光标使用下面的脚本调用# Mouse.set_cursor ( :图标集, X) - 将x更改为任何图标索引# 如果你想显示一个图片,而不是图标集使用下一个脚本调用# Mouse.set_cursor =end #===========================================================================# # #*****************# # # #*** By Falcao ***# Mouse System Buttons 2.5 # # #*****************# This is a button based mouse script, allow # # create as many buttons you want to the map # # screen or map ground, also provide you full # # RMVXACE mouse interaction within the game play # # # # # # Falcao RGSS site: [url]http://falcaorgss.wordpress.com[/url] # # Falcao Forum site: [url]http://makerpalace.com[/url] # # # #===========================================================================# #---------------------------------------------------------------------------- # * Version 2.5 change log (Date: June 9 2013) # # Fixed non-refreshing item description bug # Fixed Save file selection issue # Added ability to start events even if the player is no facing the event # Removed option to display arrow selector on save file # Added compatibility for multiples game resolutions # Item selection with mouse is now more occurate # Fixed issue with pearl skillbar (when clicking any tool perform path finding) # Cleaned up some code # #---------------------------------------------------------------------------- # * Version 2.0 change log (Date: January 13 2013) # # - Added path finding, now the game player is able to move using the mouse # - Now you are able to change the mouse cursor icon in game # - Two new notetags added to change the mouse cursor by event comment tags # - Fixed crash when pointing a notetagged event with a valid condition #---------------------------------------------------------------------------- # * Version 1.6 change log (Date: November 21 2012) # # - Added compatibility for any game screen resolution # - System optimized to consume less cpu than before # - Added extra compatibility for Pearl ABS Liquid # - Removed the font fix # - Added the imported bolean #---------------------------------------------------------------------------- # * Version 1.5 change log # # - Fixed cursor sound over loading on selectable windows # - Fixed bug when selecting event graphic tileset that have mouse comment tag # - FIxed minor bug when transfering (event name now erase completely) # - Added option to turn on / off arrow selector on save file # - Important! changes on mouse comment tags! # ~ CLICK START change to MOUSE START # ~ ANIMATION change to MOUSE ANIMATION # ~ NAME change to MOUSE NAME # #--------------------------------------------------------------------------- # * installation # # Copy and paste this script above main done! # # * Mouse triggers # - Left click: Action button # - Right click: Cancel button, close windows # - Mouse wheel middle button: DASH # #--------------------------------------------------------------------------- # * Main features # # - Allow you create buttons and configure them to do something # - Events can be buttons too, map ground buttons! for some puzzles etc. # - Allow you display event name # - Full mouse interaction # - WASD movement optional # - Path finding feature, player is able to move using the mouse # - Mouse cursor changing in-game enabled #--------------------------------------------------------------------------- # * Event buttons commands # # Write this lines on event comments tags # # MOUSE START - Event start when you click the event # MOUSE ANIMATION x - Show animation when mouse is over event, # ex: MOUSE ANIMATION 1 # MOUSE NAME x - Display event name when mouse is over event, # ex: MOUSE NAME Falcao # MOUSE ICON x - change the mouse cursor icon when it is over the event # change x for the icon index to display # MOUSE PIC X - Change the mouse cursor when is over an event but in this # case it display a picture graphic name, change x for the # picture name #------------------------------------------------------------------------------ # * Script calls # # Call this line to turn off/on the mouse cursor within the game true/false # Mouse.show_cursor(false) # # If you want to change the mouse cursor manually use the following script calls # Mouse.set_cursor(:iconset, x) - change x for any icon index # # if you want to show a picture instead iconset use the next script call # Mouse.set_cursor(:picture, name) - change name for picture name #----------------------------------------------------------------------------- module Map_Buttons # You can easily insert as many buttons you want to the map screen # define here below your buttons parameters Insert = { #----------------------------------------------------------------------------- # A => [B, C, D, E, F] # # A = Button number 按键序号 # # B = Name 游戏中按键显示的名字 # C = X position in screen tile 屏幕上X坐标 # D = Y position in screen tile 屏幕上Y坐标 # E = Icon, if you want a picture write picture 'name' otherwise icon index # F = What this button gonna do?, you have two options, call scene or call # common event, if you want scene put scene name, if you want common event # put common event ID #Y坐标12,显示在最靠近屏幕下方。添加新菜单的时候请将Y坐标-1。 #F处可填场景呼叫和公共事件ID。 # This button call the menu screen # ID=> ["显示名称", X, Y, 图标Index, 呼出菜单], 1=> ["Menu", 16, 11, 117, Scene_Menu], # ID=> ["显示名称", X, Y, 图标Index, 呼出菜单], } # * General configutration # Mouse cursor icon, if you want a picture write pic 'name' otherwise icon index CursorIcon = 386 # Switch ID to turn off/on the icons on the screen Switch = 100 # Allow movement with W A S D keys true/false WASD_Movement = true # When you click on event, do you want the player to ignore the self movement? IgnoreEventPath = true # Switch id to enable or disable the path finding feature PathFinderSwitch = 500 # #---------------------------------------------------------------------------- # # * License # # You can use this script in non comercial games, in you need it for comercial # games let me know. [email][email protected][/email] #----------------------------------------------------------------------------- def self.check_value(value) return 'numeric' if value.is_a? Fixnum return 'string' end end ($imported ||= {})[:Mouse_System_Buttons] = 2.0 # This class create all screen and event buttons on game screen class Interactive_Buttoms attr_reader :cursoring def initialize create_screen_buttoms @ani_delay = 0 @pearl_abs = $imported["Falcao Pearl ABS Liquid"] end def create_screen_buttoms @buttons_sprites = [] for i in Map_Buttons::Insert.values @buttons_sprites.push(Sprite_Buttons.new(i[0], i[1], i[2], i[3], i[4])) end end def create_button_text if @button_text.nil? @button_text = Sprite.new @button_text.bitmap = Bitmap.new(100, 32) @button_text.z = 50 @button_text.bitmap.font.size = 16 end end def dispose_screen_buttons for button in @buttons_sprites button.dispose end @buttons_sprites = [] end def dispose_button_text if not @button_text.nil? @button_text.dispose @button_text.bitmap.dispose @button_text = nil end end def dispose dispose_screen_buttons dispose_button_text end def update if $game_switches[Map_Buttons::Switch] and not @buttons_sprites.empty? dispose_screen_buttons elsif not $game_switches[Map_Buttons::Switch] and @buttons_sprites.empty? create_screen_buttoms end update_buttons update_event_selection end # path update def update_path return if $game_switches[Map_Buttons::PathFinderSwitch] return if $game_message.busy? return unless $game_player.normal_walk? @mxx, @myy = Mouse.map_grid[0], Mouse.map_grid[1] if Map_Buttons::IgnoreEventPath $game_map.events.values.each do |event| return if event.x == @mxx and event.y == @myy end end $game_player.find_path(@mxx, @myy) unless on_toolbar? end def on_toolbar? return false unless @pearl_abs 9.times.each {|x| return true if @mxx == PearlSkillBar::Tile_X + x and @myy == PearlSkillBar::Tile_Y} return false end def update_buttons for button in @buttons_sprites button.update if button.zooming @screen_b = true create_button_text if button.x > 272 x, y = button.px * 32 - 98, button.py * 32 draw_button_text(x, y, button.name, 2) elsif button.x < 272 x, y = button.px * 32 + 31, button.py * 32 draw_button_text(x, y, button.name, 0) end end end if @screen_b != nil unless mouse_over_button? dispose_button_text @screen_b = nil end end end def reset_cursor if Map_Buttons::check_value(@cursoring[1]) == 'numeric' Mouse.set_cursor(:iconset, @cursoring[1], true) else Mouse.set_cursor(:picture, @cursoring[1], true) end @cursoring = nil end def apply_iconchanging(sym, operand, event) cursor = $game_system.cursorr cursor = Map_Buttons::CursorIcon if cursor.nil? @cursoring = [event, cursor] Mouse.set_cursor(sym, operand, true) end def update_event_selection return if @screen_b #disable event buttom if mouse over screen buttom update_path if Mouse.trigger?(0) for event in $game_map.events.values next if event.page.nil? if event.x == Mouse.map_grid[0] and event.y == Mouse.map_grid[1] if event.mouse_start if Mouse.trigger?(0) and !$game_map.interpreter.running? event.start end end if event.square_size?($game_player, 2) if Mouse.trigger?(0) and !$game_map.interpreter.running? event.start end end anime = event.mouse_animation if anime != 0 @ani_delay += 1 event.animation_id = anime if @ani_delay == 1 @ani_delay = 0 if @ani_delay > 16 end name = event.mouse_name if name != "" @Eve = [event.x, event.y, event, name] create_button_text end icon = event.mouse_iconset picture = event.mouse_picture if !icon.nil? and icon != 0 and @cursoring.nil? apply_iconchanging(:iconset, icon, event) elsif !picture.nil? and picture != "" and @cursoring.nil? apply_iconchanging(:picture, picture, event) end end end if @cursoring != nil reset_cursor if not mouse_over_event?(@cursoring[0].x, @cursoring[0].y) end if @Eve != nil @eve[2].ch_oy.nil? ? event_oy = 32 : event_oy = @eve[2].ch_oy if event_oy > 32 draw_button_text(@eve[2].screen_x - 49, @eve[2].screen_y - event_oy / 2 - 50, @eve[3], 1) else draw_button_text(@eve[2].screen_x - 49, @eve[2].screen_y - event_oy / 2 - 36, @eve[3], 1) end if not mouse_over_event?(@eve[0], @eve[1]) dispose_button_text @eve = nil end end end def draw_button_text(x, y, text, a=0) return if @button_text.nil? @button_text.x = x @button_text.y = y return if @old_name == text @button_text.bitmap.clear @button_text.bitmap.draw_text(2, 0, @button_text.bitmap.width, 32, text, a) @old_name = text end def mouse_over_button? for button in @buttons_sprites if Mouse.object_area?(button.x, button.y - 6, button.width, button.height) return true end end @old_name = nil return false end def mouse_over_event?(event_x, event_y) if Mouse.map_grid[0] == event_x and Mouse.map_grid[1] == event_y return true end @old_name = nil return false end end # Set buttons sprites class Spriteset_Map alias falcao_insert_buttuns_view create_viewports def create_viewports @interact_buttoms = Interactive_Buttoms.new falcao_insert_buttuns_view end alias falcao_insert_buttuns_dis dispose def dispose @interact_buttoms.reset_cursor if @interact_buttoms.cursoring != nil @interact_buttoms.dispose falcao_insert_buttuns_dis end alias falcao_insert_buttuns_up update def update if $game_player.clear_mousepointers @interact_buttoms.dispose $game_player.clear_mousepointers = nil end @interact_buttoms.update falcao_insert_buttuns_up end end # comments definition class Game_Event < Game_Character attr_reader :mouse_start, :mouse_animation, :mouse_name, :mouse_iconset attr_reader :mouse_picture, :page alias falcaomouse_setup setup_page_settings def setup_page_settings falcaomouse_setup @mouse_start = check_comment("MOUSE START") @mouse_animation = check_value("MOUSE ANIMATION") @mouse_name = check_name("MOUSE NAME") @mouse_iconset = check_value("MOUSE ICON")# @mouse_picture = check_name("MOUSE PIC")# end def check_comment(comment) return false if @list.nil? or @list.size <= 0 for item in @list if item.code == 108 or item.code == 408 if item.parameters[0].include?(comment) return true end end end return false end def check_value(comment) return 0 if @list.nil? or @list.size <= 0 for item in @list if item.code == 108 or item.code == 408 if item.parameters[0] =~ /#{comment}[ ]?(\d+)?/ return $1.to_i end end end return 0 end def check_name(comment) return "" if @list.nil? or @list.size <= 0 for item in @list next unless item.code == 108 or item.code == 408 if item.parameters[0] =~ /#{comment} (.*)/ return $1.to_s end end return "" end def square_size?(target, size) distance = (@x - target.x).abs + (@y - target.y).abs enable = (distance <= size-1) return true if enable return false end end # Create screen buttons sprites class Sprite_Buttons < Sprite attr_reader :px attr_reader :py attr_reader :name attr_reader :zooming def initialize(name, px, py, icon_index, action=nil) super() self.z = 50 @icon_index = icon_index @px = px @py = py @action = action @object_zooming = 0 @zooming = false @name = name set_bitmap update end def update super if Mouse.object_area?(self.x, self.y - 4, self.bitmap.width, self.bitmap.height) @zooming = true @object_zooming += 1 case @object_zooming when 1..10 ; self.zoom_x -= 0.02 ; self.zoom_y -= 0.02 when 11..20 ; self.zoom_x += 0.02 ; self.zoom_y += 0.02 when 21..30 ; self.zoom_x = 1.0 ; self.zoom_y = 1.0 @object_zooming = 0 end if Mouse.trigger?(0) and @action != nil unless $game_map.interpreter.running? Sound.play_ok if @action == Scene_Menu and not $game_system.menu_disabled SceneManager.call(@action) Window_MenuCommand::init_command_position return end if Map_Buttons::check_value(@action) == 'numeric' $game_temp.reserve_common_event(@action) else SceneManager.call(@action) end end end elsif @object_zooming > 0 self.zoom_x = 1.0 self.zoom_y = 1.0 @object_zooming = 0 else @zooming = false end end def set_bitmap if Map_Buttons::check_value(@icon_index) == 'numeric' self.bitmap = Bitmap.new(24, 24) bitmap = Cache.system("Iconset") rect = Rect.new(@icon_index % 16 * 24, @icon_index / 16 * 24, 24, 24) self.bitmap.blt(0, 0, bitmap, rect) else self.bitmap = Cache.picture(@icon_index) end self.x = @px * 32 + 4 self.y = @py * 32 + 4 end end # Game_character new variable class Game_CharacterBase attr_accessor :ch_oy end # Sprite character class Sprite_Character < Sprite_Base alias falcaoadd_oxy_set_character_bitmap set_character_bitmap def set_character_bitmap falcaoadd_oxy_set_character_bitmap @character.ch_oy = self.oy end end class Game_System attr_accessor :current_cursor def cursorr return Map_Buttons::CursorIcon if @current_cursor.nil? return @current_cursor end end # Mouse module module Mouse GetKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i') GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'p', 'i') GetClientRect = Win32API.new('user32', 'GetClientRect', %w(l p), 'i') ShowCursor = Win32API.new('user32', 'ShowCursor', 'i', 'l') ScreenToClient = Win32API.new('user32', 'ScreenToClient', %w(l p), 'i') Findwindow = Win32API.new('user32', 'FindWindowA', %w(p p), 'l') GetPrivatePro = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l') ShowCursor.call(0) @triggers = [[0, 1], [0, 2], [0, 4]] @old_pos = 0 # Mouse Sprite def self.set_cursor(sym, operand, write=false) case sym when :iconset $mouse_cursor.bitmap = Bitmap.new(24, 24) bitmap = Cache.system("Iconset") rect = Rect.new(operand % 16 * 24, operand / 16 * 24, 24, 24) $mouse_cursor.bitmap.blt(0, 0, bitmap, rect) when :picture then $mouse_cursor.bitmap = Cache.picture(operand) end $game_system.current_cursor = operand if write end $mouse_cursor = Sprite.new icon = Map_Buttons::CursorIcon if Map_Buttons::check_value(icon) == 'numeric' set_cursor(:iconset, icon) else set_cursor(:picture, icon) end $mouse_cursor.z = 10001 $mouse_cursor.x = $mouse_cursor.y = 1000 $mouse_cursor.ox = 4 def self.show_cursor(value) unless value @pos[0] = @pos[1] = 600 end $mouse_cursor.visible = value end def self.map_grid return nil if @pos == nil x = ($game_map.display_x).to_i + (@pos[0] / 32) y = ($game_map.display_y).to_i + (@pos[1] / 32) return [x, y] end def self.standing? return false if @old_px != @pos[0] return false if @old_py != @pos[1] return true end def self.input_keys $game_arrows.mode_on ? type = $game_arrows.in_type : type = Input::C keys = {0 => type, 1 => Input::B, 2 => Input::A} return keys end def self.object_area?(x, y, width, height) return false if @pos.nil? return @pos[0].between?(x, width + x) && @pos[1].between?(y, height + y) end def self.position return @pos == nil ? [0, 0] : @pos end def self.global_pos pos = [0, 0].pack('ll') return GetCursorPos.call(pos) == 0 ? nil : pos.unpack('ll') end def self.screen_to_client(x=0, y=0) pos = [x, y].pack('ll') return ScreenToClient.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll') end def self.pos global_pos = [0, 0].pack('ll') gx, gy = GetCursorPos.call(global_pos) == 0 ? nil : global_pos.unpack('ll') local_pos = [gx, gy].pack('ll') x, y = ScreenToClient.call(self.hwnd, local_pos) == 0 ? nil : local_pos.unpack('ll') begin if (x >= 0 && y >= 0 && x <= Graphics.width && y <= Graphics.height) @old_px, @old_py = x, y return x, y else return -20, -20 end rescue return 0, 0 end end def self.update old_pos = @pos @pos = self.pos self.input_keys if !$mouse_cursor.visible && old_pos != @pos $mouse_cursor.visible = true end if old_pos != [-20, -20] && @pos == [-20, -20] ShowCursor.call(1) elsif old_pos == [-20, -20] && @pos != [-20, -20] ShowCursor.call(0) end for i in @triggers n = GetKeyState.call(i[1]) if [0, 1].include?(n) i[0] = (i[0] > 0 ? i[0] * -1 : 0) else i[0] = (i[0] > 0 ? i[0] + 1 : 1) end end end # trigger definition def self.trigger?(id = 0) pos = self.pos if pos != [-20,-20] case id when 0 return @triggers[id][0] == 1 when 1 if @triggers[1][0] == 1 && !$game_system.menu_disabled return @triggers[id][0] == 1 end when 2 return @triggers[id][0] == 1 end end end # repeat definition def self.repeat?(id = 0) if @triggers[id][0] <= 0 return false else return @triggers[id][0] % 5 == 1 && @triggers[id][0] % 5 != 2 end end #press definition def self.press?(id = 0) if @triggers[id][0] <= 0 return false else return true end end def self.screen_to_client(x=0, y=0) pos = [x, y].pack('ll') return ScreenToClient.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll') end def self.hwnd if @hwnd.nil? game_name = "\0" * 256 GetPrivatePro.call('Game', 'Title', '', game_name, 255, ".\\Game.ini") game_name.delete!("\0") @hwnd = Findwindow.call('RGSS Player', game_name) end return @hwnd end def self.client_size rect = [0, 0, 0, 0].pack('l4') GetClientRect.call(self.hwnd, rect) right, bottom = rect.unpack('l4')[2..3] return right, bottom end end # Input module aliased class << Input unless self.method_defined?(:falcao21_mouse_update) alias_method :falcao21_mouse_update, :update alias_method :falcao21_mouse_trigger?, :trigger? alias_method :falcao21_mouse_repeat?, :repeat? alias_method :fal_mouse_input_press?, :press? end def update if $mouse_cursor.visible Mouse.update $game_arrows.update mx, my = *Mouse.position $mouse_cursor.x = mx unless mx.nil? $mouse_cursor.y = my unless my.nil? end falcao21_mouse_update end # trigger def trigger?(constant) return true if falcao21_mouse_trigger?(constant) unless Mouse.pos.nil? if Mouse.input_keys.has_value?(constant) mouse_trigger = Mouse.input_keys.index(constant) return true if Mouse.trigger?(mouse_trigger) end end return false end # press def press?(constant) return true if fal_mouse_input_press?(constant) unless Mouse.pos.nil? if Mouse.input_keys.has_value?(constant) mouse_trigger = Mouse.input_keys.index(constant) return true if Mouse.press?(mouse_trigger) end end return false end # repeat def repeat?(constant) return true if falcao21_mouse_repeat?(constant) unless Mouse.pos.nil? if Mouse.input_keys.has_value?(constant) mouse_trigger = Mouse.input_keys.index(constant) return true if Mouse.repeat?(mouse_trigger) end end return false end end # Here your best friend, you can call this script within the game, scene etc. # $game_arrows.create_arrows(x, y), create it, $game_arrows.dispose, delete it class Game_Arrow_Selector attr_accessor :mode_on attr_accessor :in_type def initialize @mode_on = false end def create_arrows(x, y) return unless @arrows_sprites.nil? buttons = {1=> 'UP', 2=> 'RIGHT', 3=> 'DOWN', 4=> 'LEFT', 5=> 'OK', 6=> 'Cancel'} @arrows_sprites = [] for i in buttons.values @arrows_sprites.push(Garrows_Sprites.new(i, x, y)) end end def dispose return if @arrows_sprites.nil? for arrow in @arrows_sprites arrow.dispose end @arrows_sprites = nil @mode_on = false end def update return if @arrows_sprites.nil? for arrow in @arrows_sprites arrow.update end end end class Garrows_Sprites < Sprite def initialize(name, x, y) super() self.z = 1000 @px, @py = x, y @name = name @object_zooming = 0 @zooming = false set_bitmap update end def update super if Mouse.object_area?(self.x + @fix[0], self.y + @fix[1], self.bitmap.width + @fix[2], self.bitmap.height + @fix[3]) $game_arrows.mode_on = true $game_arrows.in_type = Input::UP if @name == 'UP' $game_arrows.in_type = Input::DOWN if @name == 'DOWN' $game_arrows.in_type = Input::LEFT if @name == 'LEFT' $game_arrows.in_type = Input::RIGHT if @name == 'RIGHT' $game_arrows.in_type = Input::C if @name == 'OK' $game_arrows.in_type = Input::B if @name == 'Cancel' @object_zooming += 1 @zooming = true case @object_zooming when 1..10 ; self.zoom_x -= 0.01 ; self.zoom_y -= 0.01 when 11..20 ; self.zoom_x += 0.01 ; self.zoom_y += 0.01 when 21..30 ; self.zoom_x = 1.0 ; self.zoom_y = 1.0 @object_zooming = 0 end elsif @object_zooming > 0 self.zoom_x = 1.0 self.zoom_y = 1.0 @object_zooming = 0 elsif @zooming @zooming = false $game_arrows.mode_on = false end end def set_bitmap self.bitmap = Bitmap.new(24, 15) if @name != 'Cancel' case @name when 'UP' self.x = @px + 25 ; self.y = @py - 2 self.angle = 182 ; @fix = [-23, -18, 0, 0] when 'DOWN' self.x = @px + 1 ; self.y = @py + 26 @fix = [0, -4, 0, 0] when 'LEFT' self.x = @px ; self.y = @py + 1 self.angle = - 92 ; @fix = [-14, -4, - 9, 9] when 'RIGHT' self.x = @px + 26 ; self.y = @py + 26 self.angle = + 92 ; @fix = [0, - 26, - 9, 9] when 'OK' self.x = @px + 1 ; self.y = @py + 6 @fix = [0, -4, 0, 0] self.bitmap.font.size = 20 self.bitmap.draw_text(4, -7, self.bitmap.width, 32, @name) return when 'Cancel' self.x = @px - 11 ; self.y = @py + 42 @fix = [0, -4, 0, 0] self.bitmap = Bitmap.new(50, 15) self.bitmap.font.size = 20 self.bitmap.draw_text(2, -7, self.bitmap.width, 32, @name) return end draw_crappy_triangle(0, 0) end # This method create a crappy triangle pointing down def draw_crappy_triangle(px, py) color = Color.new(192, 224, 255, 255) x, y, w, = 0, 4, 24 self.bitmap.fill_rect(px + 1, py, 22, 1, color) self.bitmap.fill_rect(px, py + 1, 24, 4, color) for i in 1..10 x += 1; y += 1; w -= 2 self.bitmap.fill_rect(px + x, py + y, w, 1, color) end end end $game_arrows = Game_Arrow_Selector.new # Arrow selector is displayed when Input number is on class Game_Interpreter alias falcao_setup_num_input setup_num_input def setup_num_input(params) falcao_setup_num_input(params) $game_arrows.create_arrows(256, 194) if $game_message.position == 0 $game_arrows.create_arrows(256, 340) if $game_message.position == 1 $game_arrows.create_arrows(256, 180) if $game_message.position == 2 end end # Arrow selector is disposed when press ok class Window_NumberInput < Window_Base alias falcao_process_ok process_ok def process_ok falcao_process_ok $game_arrows.dispose end end # WASD Movements module Input class << self if !method_defined?('vxe_dir4') alias vxace_dir4 dir4 end def dir4 if Map_Buttons::WASD_Movement return 2 if (Input.press?(Input::Y)) return 4 if (Input.press?(Input::X)) return 6 if (Input.press?(Input::Z)) return 8 if (Input.press?(Input::R)) end return vxace_dir4 end end end # If event start with mouse class Game_Player < Game_Character alias falcao_start_map_event start_map_event def start_map_event(x, y, triggers, normal) $game_map.events_xy(x, y).each do |event_click| return if event_click.check_comment("MOUSE START") end falcao_start_map_event(x, y, triggers, normal) end end # clear pointers when tranfering class Game_Player < Game_Character attr_accessor :clear_mousepointers alias falcaomouse_perform_transfer perform_transfer def perform_transfer @clear_mousepointers = true if $game_map.map_id != @new_map_id falcaomouse_perform_transfer end end # Path find class Game_Character < Game_CharacterBase attr_accessor :map, :runpath alias pathfind1_ini initialize def initialize pathfind1_ini @map = nil @runpath = false end alias pathfind1_up update def update run_path if @runpath == true pathfind1_up end def run_path return if moving? step = @map[@x,@y] if step == 1 @map = nil @runpath = false return end dir = rand(2) case dir when 0 move_straight(6) if @map[@x+1,@y] == step - 1 && step != 0 move_straight(2) if @map[@x,@y+1] == step - 1 && step != 0 move_straight(4) if @map[@x-1,@y] == step - 1 && step != 0 move_straight(8) if @map[@x,@y-1] == step - 1 && step != 0 when 1 move_straight(8) if @map[@x,@y-1] == step - 1 && step != 0 move_straight(4) if @map[@x-1,@y] == step - 1 && step != 0 move_straight(2) if @map[@x,@y+1] == step - 1 && step != 0 move_straight(6) if @map[@x+1,@y] == step - 1 && step != 0 end end def find_path(x,y) sx, sy = @x, @y result = setup_map(sx,sy,x,y) @runpath = result[0] @map = result[1] @map[sx,sy] = result[2] if result[2] != nil end def clear_path @map = nil @runpath = false end def setup_map(sx,sy,ex,ey) map = Table.new($game_map.width, $game_map.height) map[ex,ey] = 1 old_positions = [] new_positions = [] old_positions.push([ex, ey]) depth = 2 depth.upto(100){|step| loop do break if old_positions[0] == nil x,y = old_positions.shift return [true, map, step] if x == sx and y+1 == sy if $game_player.passable?(x, y, 2) and map[x,y + 1] == 0 map[x,y + 1] = step new_positions.push([x,y + 1]) end return [true, map, step] if x-1 == sx and y == sy if $game_player.passable?(x, y, 4) and map[x - 1,y] == 0 map[x - 1,y] = step new_positions.push([x - 1,y]) end return [true, map, step] if x+1 == sx and y == sy if $game_player.passable?(x, y, 6) and map[x + 1,y] == 0 map[x + 1,y] = step new_positions.push([x + 1,y]) end return [true, map, step] if x == sx and y-1 == sy if $game_player.passable?(x, y, 8) and map[x,y - 1] == 0 map[x,y - 1] = step new_positions.push([x,y - 1]) end end old_positions = new_positions new_positions = [] } return [false, nil, nil] end end class Game_Player alias pathfind_player_update update def update clear_path if Input.dir4 != 0 pathfind_player_update end alias findpath_perform_transfer perform_transfer def perform_transfer clear_path if $game_map.map_id != @new_map_id findpath_perform_transfer end end # Window selectable (Thanks wora for some lines here) class Window_Selectable < Window_Base alias mouse_selection_ini initialize def initialize(*args) mouse_selection_ini(*args) @scroll_wait = 0 @cursor_wait = 0 @sdelay = 0 end alias mouse_selection_update update def update update_mouse_selection if self.active and self.visible @sdelay -= 1 if @sdelay > 0 mouse_selection_update end def update_mouse_selection @cursor_wait -= 1 if @cursor_wait > 0 plus_x = self.x + 16 - self.ox plus_y = self.y + 8 - self.oy unless self.viewport.nil? plus_x += self.viewport.rect.x - self.viewport.ox plus_y += self.viewport.rect.y - self.viewport.oy end (0..self.item_max - 1).each do |i| irect = item_rect(i) move_cursor(i) if Mouse.object_area?( irect.x + plus_x, irect.y + plus_y, irect.width, irect.height) update_cursor end end def move_cursor(index) return if @index == index @scroll_wait -= 1 if @scroll_wait > 0 row1 = @index / self.col_max row2 = index / self.col_max bottom = self.top_row + (self.page_row_max - 1) if index != @index and @sdelay == 0 Sound.play_cursor @sdelay = 5 end if row1 == self.top_row and row2 < self.top_row return if @scroll_wait > 0 @index = [@index - self.col_max, 0].max @scroll_wait = 30 elsif row1 == bottom and row2 > bottom return if @scroll_wait > 0 @index = [@index + self.col_max, self.item_max - 1].min @scroll_wait = 30 else @index = index end select(@index) return if @cursor_wait > 0 @cursor_wait += 2 end end class Window_NameInput def item_max return 90 end end class Scene_File < Scene_MenuBase alias mouse_top_index top_index= def top_index=(index) @scroll_timer = 0 if @scroll_timer.nil? ; @scroll_timer -= 1 return if @scroll_timer > 0 mouse_top_index(index) ; @scroll_timer = 35 end alias mouse_sb_update update def update (0..self.item_max - 1).each do |i| ix = @savefile_windows[i].x iy = @savefile_windows[i].y + 40 - @savefile_viewport.oy iw = @savefile_windows[i].width ih = @savefile_windows[i].height if Mouse.object_area?(ix, iy, iw, ih) @savefile_windows[@index].selected = false @savefile_windows[i].selected = true @index = i end ensure_cursor_visible end mouse_sb_update end end
2 MB, 下载次数: 137
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |