Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Mouse Script Problems

I have a mouse script I'm using:
Code:
#----------------------------------------------------------------------------

#Credits: This is an adaptation from a script created by shun ([url=http://simp.nobody.jp/]http://simp.nobody.jp/[/url])

#Also looked at Cybersam's work and Astro_mech and Mr.Mo's mouse script edits to 

#learn how onmouse events work.

#----------------------------------------------------------------------------

# TO USE:

# In each map event, put the name of the cursor you want to show as a comment.

# The comment must be the first event command. Make sure that you put the cursor

# in your Icons directory (name in comment and icon name must match exactly)

#----------------------------------------------------------------------------

 

 

module Input

  #--------------------------------------------------------------------------

  # ● get winAPIs

  #--------------------------------------------------------------------------

  #gsm = Win32API.new('user32', 'GetSystemMetrics', 'i', 'i')

  @mouse_status = [[0, 1], [0, 2], [0, 4]] #left, right, middle mouse

  @gaks = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i')

  @cursor_pos = Win32API.new('user32', 'GetCursorPos', 'p', 'i')

  @scr2cli = Win32API.new('user32', 'ScreenToClient', %w(l p), 'i')

  @client_rect = Win32API.new('user32', 'GetClientRect', %w(l p), 'i')

  @readini = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l')

  @findwindow = Win32API.new('user32', 'FindWindowA', %w(p p), 'l')

  show_cursor = Win32API.new('user32', 'ShowCursor', 'l', 'l')

  @last_pos = [0, 0].pack('ll')  

  @pos_x = @pos_y = 0

  @width = 0

  @height = 0

  n = (true ? 0 : 1)

  show_cursor.call(n)

  module_function

    

  #--------------------------------------------------------------------------

  # ● get the window

  #--------------------------------------------------------------------------

  def hwnd

    game_name = "\0" * 256

    @readini.call('Game', 'Title', '', game_name, 255, ".\\Game.ini")

    game_name.delete!("\0")

    h = @findwindow.call('RGSS Player', game_name)

    if h == 0

      n = 0

      while h == 0

        h = @findwindow.call('RGSS Player', "#{game_name} - #{n} FPS")

        n += 1

      end

    end

    return h

  end

  

  #--------------------------------------------------------------------------

  # ● get the global position of the mouse

  #--------------------------------------------------------------------------

  def global_pos

    pos = [0, 0].pack('ll')

    if @cursor_pos.call(pos) != 0

      return pos.unpack('ll')

    else

      return nil

    end

  end

   

  #--------------------------------------------------------------------------

  # ● Position of the mouse in the game

  #     catch_anywhere : get position if mouse is outside of game screen

  #--------------------------------------------------------------------------

  def pos(catch_anywhere = true)

         

    if (global_pos != @last_pos)

      

      @last_pos = *global_pos

      

      string = global_pos.to_s + " " + @last_pos.to_s

      $debug_string = string.to_s

      

      @pos_x, @pos_y = screen_to_client(*global_pos)

      @width, @height = client_size

      

    end

    

    if (@pos_x >= 0 and @pos_y >= 0 and @pos_x < @width and @pos_y < @height)  

      return @pos_x, @pos_y

    else

      return 0, 0

    end

    

  end

  

  #--------------------------------------------------------------------------

  # ● Position of the mouse on screen

  #     x : x coordinate

  #     y : y coordinate

  #--------------------------------------------------------------------------

  def screen_to_client(x, y)

    return nil unless x and y

    pos = [x, y].pack('ll')

    if @scr2cli.call(hwnd, pos) != 0

      return pos.unpack('ll')

    else

      return nil

    end

  end

  

  #--------------------------------------------------------------------------

  # ● Size of the game window

  #--------------------------------------------------------------------------

  def client_size

    rect = [0, 0, 0, 0].pack('l4')

    @client_rect.call(hwnd, rect)

    right, bottom = rect.unpack('l4')[2..3]

    return right, bottom

  end

 

  #--------------------------------------------------------------------------

  # ● Check to see if the mouse is over an event

  #--------------------------------------------------------------------------  

  def check_event(x, y)

    

    for event in $game_map.events.values

      # change icon if an event is encountered

      if (event.x == x or event.x == (x-1)) and (event.y == y or event.y == (y+1))

        if event.list && event.list[0].code == 108

            icon = event.list[0].parameters 

            icon = icon.to_s

            if icon == "Arrow2" || icon == "Arrow3" || icon == "Arrow4" || icon == "Arrow5" || icon == "Arrow6"

              $mouse_icon = icon.to_s

            end

        end

        break

      end

      

      # if even is not encountered, use default icon

      $mouse_icon = "Arrow" 

    end

  

  end   

 

  def icon_name(name)

    $msg = name.to_s

    $mouse_icon = name.to_s

  end

  

  #--------------------------------------------------------------------------

  # ● watch for left mouse actions

  #     id : Mouse (0:Left, 1:Right, 2:Center)

  #--------------------------------------------------------------------------

  def mouse_press?(id = 0)

    if $scene.is_a?(Scene_Map)

      # get the icon to display

      if @mouse_status[id][0] <= 0

        $hoverx = (pos[0] + $game_map.display_x / 4) / 32

        $hovery = (pos[1] + $game_map.display_y / 4) / 32

        icon = check_event($hoverx,$hovery)

      end  

      # move character when mouse is pressed

      if @mouse_status[id][0] > 0

        $mousex = pos[0] + $game_map.display_x / 4

        $mousey = pos[1] + $game_map.display_y / 4

        $move = 1

      end

      # don't move character if message window showing

      if $game_temp.message_window_showing

        $move = 0

      end

    end

    return @mouse_status[id][0] > 0

  end

  

  #--------------------------------------------------------------------------

  # ● Watch for mouse button actions (especially right mouse button)

  #     id : mouse (0:Left, 1:Right, 2:Center)

  #--------------------------------------------------------------------------

  def mouse_trigger?(id = 0)   

    return @mouse_status[id][0] == 1    

  end

  

  #--------------------------------------------------------------------------

  # ● Check to see if a mouse action was repeated

  #     id : mouse (0:Left, 1:Right, 2:Center)

  #--------------------------------------------------------------------------

  def mouse_repeat?(id = 0)

    if @mouse_status[id][0] <= 0

      return false

    else

      result = @mouse_status[id][0] % 5 == 1 and @mouse_status[id][0] % 5 != 2

      return result

    end

  end

  

  #--------------------------------------------------------------------------

  # ● Update the mouse

  #--------------------------------------------------------------------------

  def mouse_update

    for i in @mouse_status

      n = @gaks.call(i[1])

      if n == 0 or n == 1

        i[0] = (i[0] > 0 ? i[0] * -1 : 0)

      else

        i[0] = (i[0] > 0 ? i[0] + 1 : 1)

      end

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

class << Input

  #--------------------------------------------------------------------------

  # ● Update old input calls

  #--------------------------------------------------------------------------

  alias old_update update unless $@

  def Input.update

    old_update

    mouse_update

    $mouse.update

  end

  #--------------------------------------------------------------------------

  # ● Update old input triggers

  #     num : A, B, C

  #--------------------------------------------------------------------------

  alias old_trigger? trigger? unless $@

  def Input.trigger?(num)

    return old_trigger?(num) if Input.pos(false) == nil

    case num

    when Input::A

      return (old_trigger?(num) or mouse_trigger?(2))

    when Input::B

      return (old_trigger?(num) or mouse_trigger?(1))

    when Input::C

      return (old_trigger?(num) or mouse_trigger?)

    else

      return old_trigger?(num)

    end

  end

  #--------------------------------------------------------------------------

  # ● Check to see if an old input call was repeated

  #     num : B

  #--------------------------------------------------------------------------

  alias old_repeat? repeat? unless $@

  def repeat?(num)

    return old_repeat?(num) if Input.pos(false) == nil

    if num == Input::B

      return (old_repeat?(num) or mouse_repeat?(1))

    else

      return old_repeat?(num)

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

class Game_Player < Game_Character

  #--------------------------------------------------------------------------

  # ● Move the player toward the mouse

  #--------------------------------------------------------------------------

  alias mouse_update update

  def update

   

    rx = $mousex = (@real_x / 4 + 16)

    ry = $mousey = (@real_y / 4 + 16)  

    

    # if an arrow key is pressed, stop path finding

    $move = 0 if Input.dir4 != 0

    

    # move to a specified area on the map, using the mouse

    if $move == 1

        unless moving? or $game_system.map_interpreter.running? or

           @move_route_forcing or $game_temp.message_window_showing or

           (rx.abs <= 16 and ry.abs <= 16)

          rad = -(Math.atan2(ry, rx) / Math::PI * 180)

          case rad

          when -157.5...-112.5

            move_lower_left

          when -112.5...-67.5

            move_down

          when -67.5...-22.5

            move_lower_right

          when -22.5...22.5

            move_right

          when 22.5...67.5

            move_upper_right

          when 67.5...112.5

            move_up

          when 112.5...157.5

            move_upper_left

          else

            move_left

          end

        end

        

        # if the path has been reached, stop moving

        if (rx.abs <= 16 and ry.abs <= 16)

          $move = 0

        end

        

    end

    

    #update the mouse

    mouse_update

    

  end

  

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

class Sprite_Mouse < Sprite

  #--------------------------------------------------------------------------

  # ● Initialize the mouse

  #--------------------------------------------------------------------------

  def initialize

    super

    self.bitmap = RPG::Cache.icon($mouse_icon.to_s)

    self.z = 10001

    self.ox, self.oy = [16, 0]

    self.visible = false

    self.src_rect.set(0, 0, 32, 32)

    update

  end

  #--------------------------------------------------------------------------

  # ● Dispose of the mouse

  #--------------------------------------------------------------------------

  def dispose

    if self.bitmap != nil

      self.bitmap.dispose

    end

    super

  end

  #--------------------------------------------------------------------------

  # ● Update the mouse

  #--------------------------------------------------------------------------

  def update

    super

    self.bitmap = RPG::Cache.icon($mouse_icon.to_s)    

    self.visible = true if self.visible == false and $scene != nil

    self.x, self.y = Input.pos

    if Input.mouse_press?

      self.src_rect.set(0, 0, 32, 32)     

    end

    return

  end

  

end

 

$mouse = Sprite_Mouse.new

 

class Window_Selectable < Window_Base

  #--------------------------------------------------------------------------

  # ● Initialize the mouse

  #--------------------------------------------------------------------------

  alias mouse_initialize initialize

  def initialize(x, y, width, height)

    mouse_initialize(x, y, width, height)

    @scroll_wait = 0

  end

  #--------------------------------------------------------------------------

  # ● Update the mouse

  #--------------------------------------------------------------------------

  alias mouse_update update

  def update

    mouse_update

    mouse_operation if self.active

  end

  #--------------------------------------------------------------------------

  # ○ Perform mouse operations

  #--------------------------------------------------------------------------

  def mouse_operation

    mx = Input.pos[0] - (self.x - self.ox + 16)

    my = Input.pos[1] - (self.y - self.oy + 16)

    width = self.width / @column_max - 32

    height = 32

 

    for index in 0...@item_max

      x = index % @column_max * (width + 32)

      y = index / @column_max * 32

      if mx > x and

         mx < x + width and

         my > y and

         my < y + height

        mouse_cursor(index)

        break

      end

    end

  end

  #--------------------------------------------------------------------------

  # ○ Track the position of the mouse cursor

  #--------------------------------------------------------------------------

  def mouse_cursor(index)

    return if @index == index

    @scroll_wait -= 1 if @scroll_wait > 0

    row1 = @index / @column_max

    row2 = index / @column_max

    bottom = self.top_row + (self.page_row_max - 1)

    if row1 == self.top_row and row2 < self.top_row

      return if @scroll_wait > 0

      @index = [@index - @column_max, 0].max

      @scroll_wait = 4

    elsif row1 == bottom and row2 > bottom

      return if @scroll_wait > 0

      @index = [@index + @column_max, @item_max - 1].min

      @scroll_wait = 4

    else

      @index = index

    end

    $game_system.se_play($data_system.cursor_se)

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Window_MenuStatus < Window_Selectable

  def mouse_operation   

    return if @index < 0

    mx = Input.pos[0] - (self.x - self.ox + 16)

    my = Input.pos[1] - (self.y - self.oy + 16)

    x = 0

    width = self.width - 32

    height = 96

    for index in 0...@item_max

      y = index * 116

      if mx > x and

          mx < x + width and

          my > y and

          my < y + height

        mouse_cursor(index)

        break

      end

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Window_Target < Window_Selectable

  def mouse_operation

    return if @index <= -1

    mx = Input.pos[0] - (self.x - self.ox + 16)

    my = Input.pos[1] - (self.y - self.oy + 16)

    x = 0

    width = self.width - 32

    height = 96

    for index in 0...@item_max

      y = index * 116

      if mx > x and

          mx < x + width and

          my > y and

          my < y + height

        mouse_cursor(index)

        break

      end

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Window_NameInput < Window_Base

  #--------------------------------------------------------------------------

  # ● Update the position of the mouse

  #--------------------------------------------------------------------------

  alias mouse_update update

  def update

    mouse_update

    mouse_operation if self.active

  end

  #--------------------------------------------------------------------------

  # ● Perform mouse operations

  #--------------------------------------------------------------------------

  def mouse_operation

    last_index = @index

    mx = Input.pos[0] - (self.x - self.ox + 16)

    my = Input.pos[1] - (self.y - self.oy + 16)

    width = 28

    height = 32

    for index in 0...180

      x = 4 + index / 5 / 9 * 152 + index % 5 * 28

      y = index / 5 % 9 * 32

      if mx > x and

          mx < x + width and

          my > y and

          my < y + height

        @index = index

        break

      end

    end

    x = 544

    y = 9 * 32

    width = 64

    if mx > x and

        mx < x + width and

        my > y and

        my < y + height

      @index = 180

    end

    $game_system.se_play($data_system.cursor_se) unless @index == index

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Window_Message < Window_Selectable

  #--------------------------------------------------------------------------

  # ● Perform mouse operations

  #--------------------------------------------------------------------------

  def mouse_operation

    mx = Input.pos[0] - (self.x - self.ox + 16)

    my = Input.pos[1] - (self.y - self.oy + 16)

    x = 8

    width = 128 

    height = 32

    for index in 0...@item_max

      y = ($game_temp.choice_start + index) * 32

          

      if mx > x and mx < x + width and my > y and my < y + height

        mouse_cursor(index)

        break

      end

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Window_PartyCommand < Window_Selectable

  def mouse_operation

    mx = Input.pos[0] - (self.x - self.ox + 16)

    my = Input.pos[1] - (self.y - self.oy + 16)

    y = 0

    width = 128

    height = 32

    for index in 0...@item_max

      x = 160 + index * 160

      if mx > x and

          mx < x + width and

          my > y and

          my < y + height

        mouse_cursor(index)

        break

      end

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Window_MenuPosition < Window_Selectable

  def mouse_operation

    mx = Input.pos[0] - (self.x - self.ox + 16)

    my = Input.pos[1] - (self.y - self.oy + 16)

    y = 0

    width = self.contents.width / @item_max - 10

    height = 32

    for index in 0...@item_max

      x = self.contents.width / (@item_max) * index + 4

      if mx > x and

         mx < x + width and

         my > y and

         my < y + height

        mouse_cursor(index)

        break

      end

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Arrow_Base < Sprite

  alias mouse_update update

  def update

    mouse_update

    mouse_operation

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Arrow_Enemy < Arrow_Base

  def mouse_operation

    mx, my = Input.pos

    for index in 0...$game_troop.enemies.size

      enemy = $game_troop.enemies[index]

      bitmap = RPG::Cache.battler(enemy.battler_name, 0)

      width = bitmap.width

      height = bitmap.height

      x = enemy.screen_x - width / 2

      y = enemy.screen_y - height

      if mx > x and

          mx < x + width and

          my > y and

          my < y + height

        break if @index == index

        @index = index

        $game_system.se_play($data_system.cursor_se)

        break

      end

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Arrow_Actor < Arrow_Base

  def mouse_operation 

    mx, my = Input.pos

    for index in 0...$game_party.actors.size

      index = $game_party.actors.size - index - 1

      actor = $game_party.actors[index]

      bitmap = RPG::Cache.battler(actor.battler_name, 0)

      width = bitmap.width

      height = bitmap.height

      x = actor.screen_x - width / 2

      y = actor.screen_y - height

      if mx > x and

          mx < x + width and

          my > y and

          my < y + height

        break if @index == index

        @index = index

        $game_system.se_play($data_system.cursor_se)

        break

      end

    end

  end

end

 

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

#--------------------------------------------------------------------------

 

class Scene_File

  #--------------------------------------------------------------------------

  # ● Update the mouse

  #--------------------------------------------------------------------------

  alias mouse_update update

  def update

    mouse_update

    save = false

    mx, my = Input.pos

    x = 0

    width = (save ? 160 : 640)

    height = 104

    for index in 0...4

      y = 64 + index % 4 * 104

      if mx > x and

          mx < x + width and

          my > y and

          my < y + height

        break if @file_index == index

        @savefile_windows[@file_index].selected = false

        @file_index = index

        @savefile_windows[@file_index].selected = true

        $game_system.se_play($data_system.cursor_se)

        break

      end

    end

  end

end
But, unforchantly, it clicks far to the right and a little down... Any way to fix this?
 
You could edit the location of the mouse in relation to the cursor if that makes sense... if it clicks a little to the right and down just move it up and to the left... Idk how to do that but it should work right?
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top