设为首页收藏本站同能贴吧 切换语言 繁体中文
开启辅助访问 切换到窄版
扫描二维码关注官方公众号
返回列表
+ 发新帖
查看: 92|回复: 0

[转载发布] Super Simple Mouse Script

[复制链接]
累计送礼:
0 个
累计收礼:
1 个
  • TA的每日心情
    开心
    2026-7-12 04:10
  • 签到天数: 209 天

    连续签到: 2 天

    [LV.7]常住居民III

    6120

    主题

    864

    回帖

    3万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    7
    卡币
    26247
    OK点
    16
    推广点
    0
    同能卷
    50
    积分
    33261

    灌水之王

    发表于 2026-7-17 19:56:23 | 显示全部楼层 |阅读模式
    SUPER SIMPLE MOUSE SCRIPT

    Author- Shaz, Near Fantastica, SephirothSpawn, Amaranth

    Introduction

    This script will let you play your RMXP game with the keyboard or a mouse.

    Features


    • Pathfinding
    • Icons on events
    • Custom mouse cursors
    • Mouse-enabled menus
    Screenshots



    Enter the icon name as a comment on the first line. The mouse pointer will change to this icon when it moves over the event.

    Other options go on the second line (if using both the Mouse and the Name option, Name must come second):


    • Mouse[x-offset,y-offset] will make the PC walk to the offset, then turn and interact with the event
    • So, Mouse[1, 2] will make the player walk one tile to the right and two tiles below the event, turn up, and trigger the event.
    • Useful for reading signposts, mailboxes, bookshelves, etc, where you want the player to approach from a specific direction
    • Name abc def will make the name appear next to the event when you move the mouse over it




    How to Use

    Add the following scripts above Main.

    Demo

    SuperSimpleMouseSystem.zip

    Mod Note: The above demo does not work anymore. You can find a working demo here.

    Scripts

    Start Game

    Spoilermodule StartGame   $game_mouse = true   end



    Mouse 1

    Spoiler#============================================================================== # ** Modules.Mouse Input (7.0)              By Near Fantastica & SephirothSpawn#==============================================================================module Mouse  #--------------------------------------------------------------------------  # * Mouse to Input Triggers  #  #   key => Input::KeyCONSTANT (key: 0 - Left, 1 - Middle, 2 - Right)  #--------------------------------------------------------------------------  Mouse_to_Input_Triggers = {0 => Input::C, 1 => Input::B, 2 => Input::A}  #--------------------------------------------------------------------------  # * API Declaration  #--------------------------------------------------------------------------  GAKS          = Win32API.new('user32',    'GetAsyncKeyState', 'i',     'i')  GSM           = Win32API.new('user32',    'GetSystemMetrics', 'i',     'i')  Cursor_Pos    = Win32API.new('user32',    'GetCursorPos',     'p',     'i')  $ShowCursor   = Win32API.new('user32',    'ShowCursor',       'i',     'l')  Scr2cli       = Win32API.new('user32',    'ScreenToClient',   %w(l p), 'i')  Client_rect   = Win32API.new('user32',    'GetClientRect',    %w(l p), 'i')  Findwindow    = Win32API.new('user32',    'FindWindowA',      %w(p p), 'l')  Readini       = Win32API.new('kernel32',  'GetPrivateProfileStringA',                                %w(p p p p l p), 'l')                                 # if graphical effects turned on, show fancy cursor  $ShowCursor.call($game_mouse ? 0 : 1)    @triggers     =   [[0, 1], [0, 2], [0, 4]]   @old_pos      =   0  @pos_i        =   0      #--------------------------------------------------------------------------  # * Mouse Grid Position  #--------------------------------------------------------------------------  def self.grid        # Return Nil if Position is Nil    return nil if @pos.nil?        # Get X & Y Locations      x = (@pos[0] + $game_map.display_x / 4) / 32    y = (@pos[1] + $game_map.display_y / 4) / 32        # Vehicle Stuff    $mouse_x = x    $mouse_y = y         # Return X & Y    return [x, y]      end  #--------------------------------------------------------------------------  # * Mouse Position  #--------------------------------------------------------------------------  def self.position    return @pos == nil ? [0, 0] : @pos  end  #--------------------------------------------------------------------------  # * Mouse Global Position  #--------------------------------------------------------------------------  def self.global_pos    # Packs 0 Position    pos = [0, 0].pack('ll')    # Returns Unpacked Cursor Position Call    return Cursor_Pos.call(pos) == 0 ? nil : pos.unpack('ll')  end    #--------------------------------------------------------------------------  # * Screen to Client  #--------------------------------------------------------------------------  def self.screen_to_client(x=0, y=0)    pos = [x, y].pack('ll')    return Scr2cli.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll')  end        #--------------------------------------------------------------------------  # * Mouse Position  #--------------------------------------------------------------------------   def self.pos    global_pos = [0, 0].pack('ll')        gx, gy = Cursor_Pos.call(global_pos) == 0 ? nil : global_pos.unpack('ll')    local_pos = [gx, gy].pack('ll')    x, y = Scr2cli.call(self.hwnd, local_pos) == 0 ? nil : local_pos.unpack('ll')        # Begins Test    begin      # Return X & Y or Nil Depending on Mouse Position      if (x >= 0 && y >= 0 && x <= 640 && y <= 480)        return x, y      else        return -20, -20      end    rescue      return 0, 0 #nil    end      end        #--------------------------------------------------------------------------  # * Update Mouse Position  #--------------------------------------------------------------------------  def self.update        # Update Position    old_pos = @pos    @pos = self.pos        # agf = hide system mouse    if !$mouse_sprite.visible && old_pos != @pos      $mouse_sprite.visible = true    end        # when mouse leaves game window, show system mouse    if old_pos != [-20, -20] && @pos == [-20, -20]      $ShowCursor.call(1)    # when mouse is in game window, show custom mouse if it's turned on    elsif old_pos == [-20, -20] && @pos != [-20, -20]      $ShowCursor.call($game_mouse ? 0 : 1)    end    # Update Triggers    for i in @triggers      # Gets Async State      n = GAKS.call(i[1])      # If 0 or 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?  #     id : 0:Left, 1:Right, 2:Center  #--------------------------------------------------------------------------  def self.trigger?(id = 0)        #only user trigger if in range of screen    pos = self.pos    if pos != [-20,-20]        case id      when 0  # Left        return @triggers[id][0] == 1      when 1  # Right (only when menu enabled)        if @triggers[1][0] == 1 && !$game_system.menu_disabled          return @triggers[id][0] == 1              end      when 2  # Center        return @triggers[id][0] == 1    end            end      end  #--------------------------------------------------------------------------  # * Repeat?  #     id : 0:Left, 1:Right, 2:Center  #--------------------------------------------------------------------------  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  #--------------------------------------------------------------------------  # * Screen to Client  #--------------------------------------------------------------------------  def self.screen_to_client(x=0, y=0)    # Pack X & Y    pos = [x, y].pack('ll')    # Return Unpacked Position or Nil    return Scr2cli.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll')  end  #--------------------------------------------------------------------------  # * Hwnd - window handle  #--------------------------------------------------------------------------  def self.hwnd    if @hwnd.nil?      # Finds Game Name from ini file      game_name = "\0" * 256      Readini.call('Game', 'Title', '', game_name, 255, ".\\Game.ini")      game_name.delete!("\0")      # Finds Window      @hwnd = Findwindow.call('RGSS Player', game_name)    end    return @hwnd  end  #--------------------------------------------------------------------------  # * Client Size  #--------------------------------------------------------------------------  def self.client_size    # Packs Empty Rect    rect = [0, 0, 0, 0].pack('l4')    # Gets Game Window Rect    Client_rect.call(self.hwnd, rect)    # Unpacks Right & Bottom    right, bottom = rect.unpack('l4')[2..3]    # Returns Right & Bottom    return right, bottom  endend#==============================================================================# ** Input#==============================================================================class << Input  #------------------------------------------------------------------------  # * Alias Listings  #------------------------------------------------------------------------  unless self.method_defined?
    seph_mouse_input_update)    alias_method :seph_mouse_input_update,   :update    alias_method :seph_mouse_input_trigger?, :trigger?    alias_method :seph_mouse_input_repeat?,  :repeat?  end  #------------------------------------------------------------------------  # * Frame Update  #------------------------------------------------------------------------  def update    # Update Mouse    Mouse.update    # Original Update    seph_mouse_input_update  end  #--------------------------------------------------------------------------  # * Trigger? Test  #--------------------------------------------------------------------------  def trigger?(constant)    # Return true if original test is true    return true if seph_mouse_input_trigger?(constant)    # If Mouse Position isn't Nil    unless Mouse.pos.nil?      # If Mouse Trigger to Input Trigger Has Constant      if Mouse::Mouse_to_Input_Triggers.has_value?(constant)        # Return True if Mouse Triggered        mouse_trigger = Mouse::Mouse_to_Input_Triggers.index(constant)        return true if Mouse.trigger?(mouse_trigger)            end    end    # Return False    return false  end  #--------------------------------------------------------------------------  # * Repeat? Test  #--------------------------------------------------------------------------  def repeat?(constant)    # Return true if original test is true    return true if seph_mouse_input_repeat?(constant)    # If Mouse Position isn't Nil    unless Mouse.pos.nil?      # If Mouse Trigger to Input Trigger Has Constant      if Mouse::Mouse_to_Input_Triggers.has_value?(constant)        # Return True if Mouse Triggered        mouse_trigger = Mouse::Mouse_to_Input_Triggers.index(constant)             return true if Mouse.repeat?(mouse_trigger)      end    end    # Return False    return false  endend#==============================================================================#  ¦ Path Finding#==============================================================================# Near Fantastica# Version 1# 29.11.05#==============================================================================  class Game_Character    #--------------------------------------------------------------------------    alias nf_pf_game_character_initialize initialize    alias nf_pf_game_character_update update    #--------------------------------------------------------------------------    attr_accessor :map    attr_accessor :runpath    attr_accessor
    vrdest    #--------------------------------------------------------------------------    def initialize      nf_pf_game_character_initialize      @map = nil      @runpath = false      @ovrdest = false    end    #--------------------------------------------------------------------------    def update      run_path if @runpath == true      nf_pf_game_character_update    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_right if @map[@x+1,@y] == step - 1 and step != 0        move_down if @map[@x,@y+1] == step - 1 and step != 0        move_left if @map[@x-1,@y] == step -1 and step != 0        move_up if @map[@x,@y-1] == step - 1 and step != 0      when 1        move_up if @map[@x,@y-1] == step - 1 and step != 0        move_left if @map[@x-1,@y] == step -1 and step != 0        move_down if @map[@x,@y+1] == step - 1 and step != 0        move_right if @map[@x+1,@y] == step - 1 and step != 0      end    end    #--------------------------------------------------------------------------    def find_path(x,y, force = true)      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      $game_player.ignore_movement = @runpath ? force : false    end    #--------------------------------------------------------------------------    def clear_path      @map = nil      @runpath = false      @ovrdest = false      $game_player.ignore_movement = false    end    #--------------------------------------------------------------------------    def setup_map(sx,sy,ex,ey)      map = Table.new($game_map.width, $game_map.height)      # Shaz - adding this comment to the second line of the event commands      #     Mouse[0,1]      # will cause the player to go to the tile BELOW the event, turn up,      # and interact with the event ([0,1] is x+0, y+1)      tx = ex      ty = ey      event = $game_map.event_at(ex, ey)      if !event.nil? && !event.list.nil? && !event.erased &&         event.list.size > 1 && event.list[1].code == 108        text = event.list[1].parameters.to_s        text.gsub!(/[Mm][Oo][Uu][Ss][Ee]\[([-,0-9]+),([-,0-9]+)\]/) do          tx = ex + $1.to_i          ty = ey + $2.to_i          map[ex, ey] = 999          @ovrdest = true        end      end            update_counter = 0      map[tx,ty] = 1      old_positions = []      new_positions = []      old_positions.push([tx, ty])      depth = 2      $path_allow = false      depth.upto(100){|step|        loop do          break if old_positions[0] == nil          x,y = old_positions.shift          return [true, map, step-1] if x == sx and y == sy          if map[x,y + 1] == 0 and $game_player.passable?(x, y, 2, step, tx, ty)             map[x,y + 1] = step            new_positions.push([x,y + 1])          end          if map[x - 1,y] == 0 and $game_player.passable?(x, y, 4, step, tx, ty)             map[x - 1,y] = step            new_positions.push([x - 1,y])          end          if map[x + 1,y] == 0 and $game_player.passable?(x, y, 6, step, tx, ty)             map[x + 1,y] = step            new_positions.push([x + 1,y])          end          if map[x,y - 1] == 0 and $game_player.passable?(x, y, 8, step, tx, ty)             map[x,y - 1] = step            new_positions.push([x,y - 1])          end                    # If we've checked quite a few tiles, allow graphics and input          # to update - to avoid the 'script hanging' error          update_counter += 1          if update_counter > 100            Graphics.update            update_counter = 0          end        end                old_positions = new_positions        new_positions = []      }            @ovrdest = false      return [false, nil, nil]                    end  end    class Game_Map    #--------------------------------------------------------------------------    alias pf_game_map_setup setup    #--------------------------------------------------------------------------    def setup(map_id)      pf_game_map_setup(map_id)      $game_player.clear_path    end  end    class Game_Player    attr_accessor :ignore_movement    #--------------------------------------------------------------------------    alias pf_game_player_update update    #--------------------------------------------------------------------------    def update      $game_player.clear_path if Input.dir4 != 0      pf_game_player_update    end  end    class Interpreter    #--------------------------------------------------------------------------    def event      return $game_map.events[@event_id]    end  endMouse 2
                    Code:       
    1. #==============================================================================# ** MouseCursor#==============================================================================module MouseCursor    Default_Cursor = 'Arrow'    Event_Cursor   = 'Arrow3'    Actor_Cursor   = 'Arrow'    Enemy_Cursor   = 'Arrow4'    Item_Cursor    = true    Skill_Cursor   = true    Dummy = Bitmap.new(32, 32)end#==============================================================================# ** Sprite_Mouse#==============================================================================class Sprite_Mouse < Sprite  #--------------------------------------------------------------------------  # * Object Initialization  #--------------------------------------------------------------------------  def initialize    super    self.z = 10100    self.ox = 4    update  end  #--------------------------------------------------------------------------  # ** Frame Update  #--------------------------------------------------------------------------  def update    super        # Update Visibility    self.visible = $scene != nil        # If Visible    if self.visible            # If Non-nil Mouse Position      if Mouse.position != nil                # Gets Mouse Position        mx, my = *Mouse.position                # Update POsition        self.x = mx unless mx.nil?        self.y = my unless my.nil?                    end            # If Scene changes or Mouse is Triggered      if @scene != $scene.class || Mouse.trigger?                # Update Scene Instance        @scene = $scene.class                # Update Bitmap        set_bitmap(MouseCursor::Default_Cursor)      end          end      end  #--------------------------------------------------------------------------  # ** Set Bitmap  #--------------------------------------------------------------------------  def set_bitmap(cursor, xNPCname = nil)        # show fancy cursor only if custom mouse on    if $game_mouse                   # If Cursor Info matches      if (@_cursor == cursor) && (@_NPCname == xNPCname)        return      end            # Reset Cursor Info      @_cursor      = cursor      @_NPCname     = xNPCname            # Gets Dummy      dummy = MouseCursor::Dummy            # Gets Item Cursor Bitmap      item_cursor = cursor.nil? ? MouseCursor::Default_Cursor : cursor            # Start Cursor Bitmap      bitmap = RPG::Cache.icon(item_cursor) if item_cursor != ''      # Show NPC name      if @_NPCname != nil        # Get name width        w = dummy.text_size(@_NPCname).width        h = dummy.font.size        b = RPG::Cache.icon(item_cursor)        # Create New Bitmap        bitmap = Bitmap.new((bitmap.nil? ? w : 40 + w), [b.height, h + 2].max)        bitmap.font.size = dummy.font.size        bitmap.blt(0, 0, b, b.rect)        # Draw NPC Name        x = item_cursor == '' ? 0 : 32        bitmap.font.color = Color.new(0, 0, 0, 255) # black        bitmap.draw_text(b.width + 9, 0, w, h, @_NPCname) # 0        bitmap.draw_text(b.width + 11, 0, w, h, @_NPCname) # 0         bitmap.draw_text(b.width + 10, -1, w, h, @_NPCname) # -1        bitmap.draw_text(b.width + 10, 1, w, h, @_NPCname) # 1        bitmap.font.color = Color.new(255, 255, 255, 255) # white        bitmap.draw_text(b.width + 10, 0, w, h, @_NPCname)      end          # Set Bitmap      self.bitmap = bitmap          elsif self.bitmap      @_cursor = nil      self.bitmap = nil          end      end  #--------------------------------------------------------------------------  # ** Frame Update : Update Event Cursors  #--------------------------------------------------------------------------  def update_event_cursors        # If Nil Grid Position    if Mouse.grid.nil?      # Set Default Cursor      set_bitmap(MouseCursor::Default_Cursor)      return    end        # Gets Mouse Position    x, y = *Mouse.grid        # Gets Mouse Position    mx, my = *Mouse.position            # Gets Mouse Event    event = $game_map.event_at(x, y)        # If Non-Nil Event or not over map HUD    unless event.nil?       # If Not Erased or Nil List      if event.list != nil && event.erased == false && event.list[0].code == 108        # Get the cursor to show        icon = event.list[0].parameters         icon = icon.to_s        if !((icon == "Arrow2") ||            (icon == "Arrow3") ||            (icon == "Arrow4") ||            (icon == "Arrow5") ||            (icon == "Arrow6") ||           (icon == "Arrow7"))           icon = MouseCursor::Default_Cursor        end                xNPCname = nil         if event.list.size > 1 && event.list[1].code == 108          text = event.list[1].parameters.to_s          text.gsub!(/[Nn][Aa][Mm][Ee] (.*)/) do            xNPCname = $1.to_s          end        end        set_bitmap(icon, xNPCname)            return      end      return    end        # Set Default Cursor    set_bitmap(MouseCursor::Default_Cursor)      endend#==============================================================================# ** Input#==============================================================================class << Input  #------------------------------------------------------------------------  # * Alias Listings  #------------------------------------------------------------------------  unless self.method_defined?(:sephlamchop_mousesys_input_update)    alias_method :sephlamchop_mousesys_input_update,   :update  end  #------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update    $mouse_sprite.update if $mouse_sprite.visible    # Original Update    sephlamchop_mousesys_input_update  endend
    复制代码





    Mouse 3 (Part 1)

    SpoilerWORLD_MAP_ID = 1#==============================================================================# ** Game_Map#==============================================================================class Game_Map  #--------------------------------------------------------------------------  # * Event At  #--------------------------------------------------------------------------  def event_at(x, y)    for event in @events.values        return event if event.x == x && event.y == y    end    return nil  end    #--------------------------------------------------------------------------  # * Events At (returns multiple events at the same position in an array)  #--------------------------------------------------------------------------  def events_at(x, y)    eventarray = []    for event in @events.values      eventarray.push event if event.x == x && event.y == y    end    return eventarray if eventarray.size > 0    return nil  endend#==============================================================================# ** Game_Event#==============================================================================class Game_Event  #--------------------------------------------------------------------------  # * Public Instance Variables  #--------------------------------------------------------------------------  attr_reader   :erased                  # trigger  attr_accessor :mouse_autostart         # mouse autostart boolean  attr_accessor :mouse_cursor_icon       # mouse cursor icon  attr_accessor :mouse_cursor_desc       # mouse cursor desc  attr_reader   :name                    # name of event  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :sephlamchop_mousesys_gmevt_refresh, :refresh  #--------------------------------------------------------------------------  # * Start Event  #--------------------------------------------------------------------------  def start    # If list of event commands is not empty    if @list && @list.size > 1      @starting = true    end  end    #--------------------------------------------------------------------------  # * Refresh  #--------------------------------------------------------------------------    def refresh    # Original Refresh    sephlamchop_mousesys_gmevt_refresh    # Click triggers event for action button, player or event touch    @mouse_autostart   = [0, 1, 2].include?(@Trigger)    @mouse_cursor_icon = MouseCursor::Event_Cursor    @mouse_cursor_desc = nil    # Return if Erased or Nil List    #return if @erased || @list.nil?      endend#==============================================================================# ** Game_Character#==============================================================================class Game_Character    def passable?(x, y, d, step = 999, tx = nil, ty = nil)        # Get new coordinates    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)        # If coordinates are outside of map    unless $game_map.valid?(new_x, new_y)      return false    end        # If through is ON    if @through      return true    end        # Able to leave current tile in desired direction?    # SHAZ: for counter, must be old, counter, new, in a straight line    unless $game_map.passable?(x, y, d, self) || (step == 2 && $game_map.event_at(x, y)) ||      (step == 3 && $game_map.counter?(x, y) && tx != nil && ty != nil &&      new_x - x == x - tx && new_y - y == y - ty)      return false    end        # Able to enter adjoining tile in current direction?    unless $game_map.passable?(new_x, new_y, 10 - d) ||      (step == 2 && $game_map.counter?(new_x, new_y))      return false    end    # SHAZ - ignore events sitting on a counter next to the destination    if step != 2 || !$game_map.counter?(new_x, new_y)                # Loop all events      for event in $game_map.events.values        # If event coordinates are consistent with move destination        if event.x == new_x and event.y == new_y          @state = true          # If through is OFF          unless event.through            # If self is event            if self != $game_player              return false            end            # With self as the player and partner graphic as character            if event.character_name != ""              return false            end          end        end      end    end        # If on world map, don't allow to go through events.  Otherwise,    # the event will be triggered while the PC is walking    if $game_map.map_id == WORLD_MAP_ID && @state == false      return false    end          # If player coordinates are consistent with move destination    if $game_player.x == new_x && $game_player.y == new_y && self != $game_player      # If through is OFF      unless $game_player.through        # If your own graphic is the character        if @character_name != ""          return false        end      end    end    return true      endend#==============================================================================# ** Game_Player#==============================================================================class Game_Player < Game_Character  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :sephlamchop_mousesys_gmplyr_update, :update  #--------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update    # Unless Interpreter Running, Forcing a Route or Message Showing    unless $game_system.map_interpreter.running? or           @move_route_forcing or $game_temp.message_window_showing                 # Find Path If Mouse Triggered      if Mouse.trigger?(0) && Mouse.grid != nil        # Check if mouse is over HUD on map         screen_x,screen_y = Mouse.pos                # Gets Mouse X & Y        mx, my = *Mouse.grid                # Turn Character in direction        newd_x = (@x - mx).abs        newd_y = (@y - my).abs                if @x > mx             turn_left if newd_x >= newd_y         elsif @x < mx            turn_right if newd_x >= newd_y         end                      if @y > my            turn_up if newd_x < newd_y         elsif @y < my            turn_down if newd_x < newd_y         end         # Run Pathfinding        find_path(mx, my, false)                # Gets Event        @eventarray = @runpath ? $game_map.events_at(mx, my) : nil        # If Event At Grid Location        unless @eventarray.nil?          @eventarray.each do |event|            # If Event Autostart            if !event.mouse_autostart              @eventarray.delete(event)            end          end          @eventarray = nil if @eventarray.size == 0        end              end    end        if @move_route_forcing      clear_path      @eventarray = nil    end        # Original Update    sephlamchop_mousesys_gmplyr_update    # If Non-nil Event Autostarter    if @eventarray != nil && !moving? &&      (!@ovrdest || @map.nil? || @map[@x,@y] == 1)      # Gets Event      @eventarray.each do |event|              # If Event Within Range        if event and (@x == event.x or @y == event.y)          # SHAZ - trigger event when:          # - Action button and standing on or beside, or with a counter between          # - player/event touch and standing as close as possible (on, if possible)          distance = Math.hypot(@x - event.x, @y - event.y)          dir = @x < event.x ? 6 : @x > event.x ? 4 : @y < event.y ? 2 : @y > event.y ? 8 : 0          if (event.trigger == 0 and (distance < 2 or (distance == 2 and             $game_map.counter?((@x+event.x)/2, (@y+event.y)/2)))) or             ([1,2].include?(event.trigger) and ((distance == 0 and             $game_player.passable?(@x, @y, dir)) or (distance == 1 and            !$game_player.passable?(@x, @y, dir))))            # Turn toward Event            if @x == event.x              turn_up if @y > event.y              turn_down if @y < event.y            else              turn_left if @x > event.x              turn_right if @x < event.x            end            # Start Event            clear_path            event.start            @eventarray.delete(event)            @eventarray = nil if @eventarray.size == 0          end        end            end          end  end    def passable?(x1, y1, d, step = 999, tx = nil, ty = nil)    super  end  end#==============================================================================# ** Mouse Selectable Windows#------------------------------------------------------------------------------# SephirothSpawn# Version 2.1#==============================================================================#==============================================================================# ** Window_Base#==============================================================================class Window_Base  #--------------------------------------------------------------------------  # * Frame Update : Mouse Cursor - Item  #--------------------------------------------------------------------------  def update_mouse_cursors_item(item, cursor, show)    # Return if not Active    return unless self.active    # Return if nil Position    return if Mouse.position.nil?    # Gets Mouse Position    mx, my = Mouse.position    # Gets Cursor Position    cr = self.cursor_rect    cx, cy = cr.x + self.x + 16, cr.y + self.y + 16    cw, ch = cr.width, cr.height    # If Not on Item    if mx.between?(self.x, self.x + self.width) == false ||       my.between?(self.y, self.y + self.height) == false || item.nil? ||       @item_max == 0 || mx.between?(cx, cx + cw) == false ||       my.between?(cy, cy + ch) == false      # Clear Mouse Index      @mouse_index = nil      # Set Mouse to Default Cursor      $mouse_sprite.set_bitmap(MouseCursor:
    efault_Cursor)      return    end    # If Index is different than mouse index and window active    if @mouse_index != @index      # Reset Index      @mouse_index = @index      # set to item icon if cursor is true      cursor = item.icon_name if cursor      # Set Bitmap      $mouse_sprite.set_bitmap(cursor)     end  end  endclass Window_Selectable  #--------------------------------------------------------------------------  # * Default Settings  #--------------------------------------------------------------------------  Default_Mouse_Selectable = true  Default_Window_Padding   = 16  #--------------------------------------------------------------------------  # * Public Instance Variables  #--------------------------------------------------------------------------  attr_accessor :mouse_selectable  attr_accessor :window_padding  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :seph_mouseselectable_wndslct_init,   :initialize  alias_method :seph_mouseselectable_wndslct_update, :update  #--------------------------------------------------------------------------  # * Object Initialization  #--------------------------------------------------------------------------  def initialize(x, y, width, height)    # Original Initialization    seph_mouseselectable_wndslct_init(x, y, width, height)    # Set Mouse Selectable Flag    @mouse_selectable = Default_Mouse_Selectable    @window_padding   = Default_Window_Padding  end  #--------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update        # agf = hide mouse    if $mouse_sprite.visible == true        # If Mouse Selectable, Active, at Least 1 Item and Non-negitive index    if self.mouse_selectable && self.active && @item_max > 0 && @index >= 0      # Gets Mouse Position      mouse_x, mouse_y = *Mouse.position            # If Mouse Within Window             if mouse_x.between? (self.x, self.x + self.width) &&         mouse_y.between? (self.y, self.y + self.height)        # Calculates Mouse X and Y Position Within Window        mouse_x -= self.x; mouse_y -= self.y        # Subtracts Window Padding        mouse_x -= @window_padding; mouse_y -= @window_padding        # Subtracts Mouse Oh        mouse_y -= self.mouse_oh        # Gets Cursor Width        cursor_width = (self.width / @column_max - 32)        # Passes Through Item Max        for i in 0...@item_max          # Calculates Index Position          x = i % @column_max * (cursor_width + 32)          y = i / @column_max * self.oh - self.oy          # If Mouse Between Rect          if mouse_x.between?(x, x + cursor_width) &&              mouse_y.between?(y, y + self.oh)            # Set Index            prev_index = @index            @index = i            if prev_index != @index              $game_system.se_play($data_system.cursor_se)            end            break          end        end      end    end        end        # Original Update    seph_mouseselectable_wndslct_update  end  #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------  def oh    return 32  end  #--------------------------------------------------------------------------  # * Mouse Oh  #--------------------------------------------------------------------------  def mouse_oh    return 0  end    end



    Mouse 3 (Part 2)

    Spoiler(Attach the following to the end of the previous script - I had to split it into two as I couldn't add it as a spoiler otherwise. ~Shaz)

    #==============================================================================# ** Window_MenuStatus#==============================================================================class Window_MenuStatus < Window_Selectable  #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------  def oh    return 60   endend#==============================================================================# ** Window_Target#==============================================================================class Window_Target < Window_Selectable  #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------  def oh    return 105   endend#==============================================================================# ** Window_BattleReserve#==============================================================================class Window_BattleReserve < Window_Selectable  #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------  def oh    return 105   endend#==============================================================================# ** Window_EquipRight#==============================================================================class Window_EquipRight < Window_Selectable  #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------  def oh    return 50   end    #--------------------------------------------------------------------------  # * Mouse Oh  #--------------------------------------------------------------------------  def mouse_oh    return 140  end    end#==============================================================================# ** Window_Message#==============================================================================class Window_Message < Window_Selectable  #--------------------------------------------------------------------------  # * Mouse Oh  #--------------------------------------------------------------------------  def mouse_oh    return $game_temp.choice_start * 32  endend#==============================================================================# ** Window_Party#==============================================================================class Window_Party < Window_Selectable  #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------  def oh    return 52   endend#==============================================================================# ** Window_Menu#==============================================================================class Window_Menu < Window_Selectable  #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------  def oh    return 35   endend#==============================================================================# ** Window_ActorCommand#==============================================================================class Window_ActorCommand < Window_Selectable  #--------------------------------------------------------------------------  # * Update  #--------------------------------------------------------------------------  def update    if $mouse_sprite.visible            # if Mouse sleectable, active, at least 1 item and non-negative index      if self.mouse_selectable && self.active && @item_max > 0 && @index >= 0        # Get / check mouse position        mouse_x, mouse_y = *Mouse.position                if mouse_x.between?(self.x, self.x + self.width) &&           mouse_y.between?(self.y, self.y + self.height)                    # Calculates mouse position within window          mouse_x -= self.x          mouse_y -= self.y                    # Subtracts widnow padding and overhead          mouse_x -= @window_padding          mouse_y -= @window_padding - self.mouse_oh                    # Look through all items          for i in 0...@item_max            ix,iy = @positions            if mouse_x.between?(ix, ix + 32) && mouse_y.between?(iy, iy + self.oh)              if i != @index                $game_system.se_play($data_system.cursor_se)              end              @index = i              break            end          end        end      end    end        super  end    #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------  def oh    return 32    endend#==============================================================================# ** Window_NameInput#==============================================================================class Window_NameInput < Window_Base  #--------------------------------------------------------------------------  # * Default Settings  #--------------------------------------------------------------------------  Default_Mouse_Selectable = true  Default_Window_Padding = 16  #--------------------------------------------------------------------------  # * Public Instance Variables  #--------------------------------------------------------------------------  attr_accessor :mouse_selectable  attr_accessor :window_padding  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :shaz_mouseselectable_wndslct_init,   :initialize  alias_method :shaz_mouseselectable_wndslct_update, :update  #--------------------------------------------------------------------------  # ● Initialize the Name Input window  #--------------------------------------------------------------------------  def initialize    # Original Initialization    shaz_mouseselectable_wndslct_init    # Set Mouse Selectable Flag    @mouse_selectable = Default_Mouse_Selectable    @window_padding = Default_Window_Padding  end  #--------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update        # if mouse selectable, visible, active, and non-negative index    if $mouse_sprite.visible && self.mouse_selectable && self.active &&      @index >= 0            # Get mouse position      mouse_x, mouse_y = *Mouse.position            # If mouse within window      if mouse_x.between? (self.x, self.x + self.width) &&        mouse_y.between? (self.y, self.y + self.height)                # Calculates mouse X and Y positions within window        mouse_x -= self.x; mouse_y -= self.y                # Subtracts window padding        mouse_x -= @window_padding; mouse_y -= @window_padding                # Subtracts mouse oh        mouse_y -= self.mouse_oh                # Gets cursor width        cursor_width = 28                # If not Submit button, pass through all items        if mouse_x.between?(428, 428+48) && mouse_y.between?(9*32, 9*32+32)          $game_system.se_play($data_system.cursor_se) if @index != 180          @index = 180        else          for i in 0..90                          # Calculate index position            x = 140 + i / 5 / 9 * 180 + i % 5 * 32            y = i / 5 % 9 * 32                        # If mouse between rect            if mouse_x.between?(x, x + cursor_width) &&               mouse_y.between?(y, y + self.oh)              # set index              prev_index = @index              @index = i              if prev_index != @index                $game_system.se_play($data_system.cursor_se)              end              break            end          end        end      end    end        # Original update    shaz_mouseselectable_wndslct_update  end    #--------------------------------------------------------------------------  # * Oh  #--------------------------------------------------------------------------    def oh    return 32  end    #--------------------------------------------------------------------------  # * Mouse Oh  #--------------------------------------------------------------------------    def mouse_oh    return 0  end  end#==============================================================================# ** Scene_File#==============================================================================class Scene_File  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :sephlamchop_mousesys_scnfl_update, :update  #--------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update        # agf = hide mouse    if $mouse_sprite.visible == true            # If Mouse Position isn't Nil    if Mouse.pos != nil            # Gets Mouse Position      x, y = Mouse.pos       y = y + 32            # Pass Through Savefile Windows      for i in 0...@savefile_windows.size                # Gets Window        w = @savefile_windows                # Don't allow user to select autosave slot in Load Menu        if @autosave_slot == false          i = 1 if i == 0        end                # If Within Window Range        if x.between?(w.x, w.x + w.width) &&           y.between?(w.y, w.y + w.height) && w.active                                prev_index = @file_index                     # Set File Index          @file_index = i                    # Turns Window On          w.selected = true                    # Play SE          if prev_index != @file_index            $game_system.se_play($data_system.cursor_se)          end                              # Unhighlight remaining windows          for j in 0...@savefile_windows.size            if j != i               @savefile_windows[j].selected = false            end          end                   # Don't select autosave slot in Load Menu          if @autosave_slot == false            @savefile_windows[0].selected = false if i == 1          end                    # Break Main Loop          break                    end      end    end      end      # Original Update    sephlamchop_mousesys_scnfl_update  endend#==============================================================================# ** Game_Battler#==============================================================================class Game_Battler  #--------------------------------------------------------------------------  # * Battler Width  #--------------------------------------------------------------------------  def battler_width    return RPG::Cache.battler(@battler_name, @battler_hue).width  end  #--------------------------------------------------------------------------  # * Battler Height  #--------------------------------------------------------------------------  def battler_height    return RPG::Cache.battler(@battler_name, @battler_hue).height  endend#==============================================================================# ** Arrow_Enemy#==============================================================================class Arrow_Enemy < Arrow_Base  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :seph_mouseselectablewindows_arrenmy_update, :update  #--------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update    # Original Update    seph_mouseselectablewindows_arrenmy_update        if $mouse_sprite.visible == true      # Return if Nil Mouse Position      return if Mouse.position.nil?      # Gets Mouse Position      mx, my = *Mouse.position      # Pass Through Enemies      $game_troop.enemies.each do |enemy|        # Skip if Non-Existing Enemy        next unless enemy.exist?        # Gets Paddings        w, h = enemy.battler_width / 2, enemy.battler_height        # If Within Mouse Padding Range        if mx.between?(enemy.screen_x - w, enemy.screen_x + w) &&           my.between?(enemy.screen_y - h, enemy.screen_y + 10)          # Set Index          @index = $game_troop.enemies.index(enemy)          # Set mouse cursor to bitmap          $mouse_sprite.set_bitmap(MouseCursor::Enemy_Cursor)           return          # break        end      end          # Set Mouse to Default Cursor      $mouse_sprite.set_bitmap(MouseCursor:
    efault_Cursor)    end      endend#==============================================================================# ** Arrow_Actor#==============================================================================class Arrow_Actor < Arrow_Base  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :seph_mouseselectablewindows_arractr_update, :update  #--------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update    # Original Update    seph_mouseselectablewindows_arractr_update    # Return if Nil Mouse Position    return if Mouse.position.nil?    # Gets Mouse Position    mx, my = *Mouse.position    # Pass Through Actors    $game_party.actors.each do |actor|      # Gets Paddings      w, h = actor.battler_width / 2, actor.battler_height      # If Within Mouse Padding Range      if mx.between?(actor.screen_x - w, actor.screen_x + w) &&         my.between?(actor.screen_y - h, actor.screen_y + 10)        # Set Index        @index = $game_party.actors.index(actor)      end    end  endend#==============================================================================# ** Scene_Map#==============================================================================class Scene_Map  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :sephlamchop_mousesys_scnmap_update, :update  #--------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update    # Unless Message Showing    unless $game_temp.message_text      # Update Event Cursors      $mouse_sprite.update_event_cursors    end    # Original Update    sephlamchop_mousesys_scnmap_update  endend#==============================================================================# ** Interpreter#==============================================================================class Interpreter  #--------------------------------------------------------------------------  # * Alias Listings  #--------------------------------------------------------------------------  alias_method :shaz_mousesys_intrprtr_command_101, :command_101  #--------------------------------------------------------------------------  # * Show Text  #--------------------------------------------------------------------------  def command_101    # return mouse sprite to default cursor    $mouse_sprite.set_bitmap(MouseCursor:
    efault_Cursor)    # original command_101    shaz_mousesys_intrprtr_command_101  endend$mouse_sprite = Sprite_Mouse.new# game mouse is visible, system mouse is hidden$mouse_sprite.visible = true




    NOTE: There is a missing line that will cause the game to crash. I have fixed it in the scripts above, but the demo does not have the fix. If you use the demo, please go to the Mouse 1 script, find the Game_Player class, and add the following line immediately after class Game_Player:

    class Game_Player  attr_accessor :ignore_movementSuperSimpleMouseSystem.zip



    本贴来自国际rpgmaker官方论坛作者:amaranth处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/super-simple-mouse-script.16520/

    本帖子中包含更多资源

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

    x
    天天去同能,天天有童年!
    回复 送礼论坛版权

    使用道具 举报

    文明发言,和谐互动
    文明发言,和谐互动
    高级模式
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    简体中文
    繁體中文
    English(英语)
    日本語(日语)
    Deutsch(德语)
    Русский язык(俄语)
    بالعربية(阿拉伯语)
    Türkçe(土耳其语)
    Português(葡萄牙语)
    ภาษาไทย(泰国语)
    한어(朝鲜语/韩语)
    Français(法语)
    关闭

    幸运抽奖

    社区每日抽奖来袭,快来试试你是欧皇还是非酋~

    立即查看

    聊天机器人
    Loading...

    QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

    GMT+8, 2026-7-27 07:07 , Processed in 0.113832 second(s), 53 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表