查看: 1921|回复: 2

和ABS兼容的鼠标脚本与鼠标响应的兼容问题

[复制链接]
梦石
0
星屑
3105
在线时间
741 小时
注册时间
2015-2-28
回帖
784

开拓者

发表于 2015-3-5 20:47:32 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 唯道集虚 于 2016-11-20 01:11 编辑

ABS同作者发布了一套鼠标脚本可以在屏幕上显示一些按钮,类似鼠标响应脚本,但把鼠标放上去之后按钮会“晃动”,而不是显示另一个图片,我想让它显示图片却与鼠标响应系统不兼容,求解决方法。

[pre lang="ruby"]
=begin
==========================================================================
鼠标系统按钮2.5
===========================================================================
这是一个基于鼠标脚本,让之创造尽可能多的按钮,你要在地图屏幕或地图地,也是游戏中
为您提供完整的RMVXACE鼠标交互播放
安装、复制并粘贴上面主这个脚本做鼠标触发
- 左击:动作按钮
- 右键点击:取消按钮,关闭窗口# - 鼠标滚轮中键: DASH
————————————————————————————————————————
*主要功能
- 允许您创建按钮,并配置它们做一些事情
- 事件可以是按钮也对应地按钮!对于一些难题等等
- 允许您显示事件名称
- 全鼠标交互
- WASD移动可选
- 寻路功能,玩家可以用鼠标
#===========================================================================#
#  #*****************#                                                      #
#  #*** 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:  http://falcaorgss.wordpress.com                        #
# Falcao Forum site: http://makerpalace.com                                 #
#                                                                           #
#===========================================================================#
=end
#----------------------------------------------------------------------------
# * 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
#  D = Y position in screen tile
#  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
  
  # This button call the menu screen
  1=> ["Menu", 16, 11, 117, Scene_Menu],  
  
  # This button call a common event ID 1
  2=>  ["Bestiary",  16, 12, 121, 1],
  
  

  }

# * 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 = 500
  
# 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. falmc99@gmail.com
#-----------------------------------------------------------------------------

  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#98
          draw_button_text(x, y, button.name, 2)
        elsif button.x < 272
          x, y = button.px * 32 + 31, button.py * 32#31
          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.x
      iy = @savefile_windows.y + 40 - @savefile_viewport.oy
      iw = @savefile_windows.width
      ih = @savefile_windows.height
      if Mouse.object_area?(ix, iy, iw, ih)
        @savefile_windows[@index].selected = false
        @savefile_windows.selected = true
        @index = i
      end
      ensure_cursor_visible
    end
    mouse_sb_update
  end
end [/pre]
器识为先,文艺其从。
梦石
0
星屑
22879
在线时间
8598 小时
注册时间
2011-12-31
回帖
3270
发表于 2015-3-5 21:46:12 | 显示全部楼层
本帖最后由 tseyik 于 2015-3-5 21:47 编辑

#  E = Icon, if you want a picture write picture 'name' otherwise icon index
#  E =圖標,如果你想要的顕示圖片則寫圖片的'名字',否則圖標指數
回复

使用道具 举报

梦石
0
星屑
3105
在线时间
741 小时
注册时间
2015-2-28
回帖
784

开拓者

 楼主| 发表于 2015-3-6 15:55:49 | 显示全部楼层
tseyik 发表于 2015-3-5 21:46
#  E = Icon, if you want a picture write picture 'name' otherwise icon index
#  E =圖標,如果你想要 ...

这我知道,但关键是“但把鼠标放上去之后图片按钮会“晃动”,而不是显示另一个图片”
器识为先,文艺其从。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部