O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Mouse System

Iniciado por Geraldo de Rívia, 04/12/2012 às 23:28


Mouse System
Por Jet

Introdução

     Quem não acha um máximo usar o mouse para interagir com o game?
     Pois é! Este script permite o uso do mouse na interação com o projeto, e ainda possui algumas ferramentas extras que podem auxiliar e/ou melhorar essa interação. O script é de fácil entendimento, mas somente é aconselhável o manuseio das informações que não estejam nas partes personalizáveis por aqueles que entendem do assunto.

Características

         
  • Permite o uso do mouse no gameplay.
  • Interagem por padrão com qualquer sistema padrão do VX Ace.
  • Permite exibir mensagens sobre o evento selecionado.
  • Permite mudança de ícone quando selecionar um evento.
  • Pathfinder incluso.
  • Entre outras funções configuráveis.

Screenshots

Spoiler


O cursor é a espadinha e o quadradinho com a borda preta é o tile selecionado.
[close]

Script

#===============================================================================
# Mouse System
# Por: Jet10985(Jet)
#===============================================================================
# Este script permite o uso do mouse no sistema do Ace para vários propósitos.
#===============================================================================
# Overwritten Methods:
# Game_Player: move_by_input
# Window_NameInput: item_max
#-------------------------------------------------------------------------------
# Aliased methods:
# Scene_Map: update, terminate, update_transfer_player
# Input: update, trigger?, press?, repeat?, dir4
# Window_Selectable: update, top_row=
# Scene_File: update, top_index=
# Game_Event: update, setup_page
# Game_Player: check_action_event, get_on_off_vehicle
# Game_System: initialize
#===============================================================================
#
#===============================================================================
# MOSTRANDO UM TEXTO SOBRE O EVENTO QUANDO O MOUSE PASSA
#===============================================================================
# Você pode fazer com que apareça uma mensagem sobre o evento, quando o mesmo
# estiver como o mouse sobre ele. Para isso é só usar o comando de evento
# "Comentário" e colocar no início do comentário as palavras "MOUSE TEXT" e na
# frente escrever a mensagem que você quer que apareça. Como no exemplo:
#
# MOUSE TEXT Baúzinho
#
# Neste exemplo será mostrada a palavra "Baúzinho" sobre o evento.
# A mensagem some assim que o cursor do mouse é retirado de sobre o evento.
#===============================================================================
# TROCANDO A IMAGEM QUANDO O MOUSE ESTÁ SOBRE UM EVENTO
#===============================================================================
# Você pode também fazer com que a imagem/ícone do cursos mude, quando o mouse
# está sobre um evento. Para isso é só usar o comando de evento "Comentário" e
# colocar no início do comentário as palavras "MOUSE PIC" e na frente escrever
# o nome da imagem ou colocar o ID do ícone. Como no exemplo:
#
# MOUSE PIC 131
#
# Neste exemplo será mostrado o ícone de ID 131.
# Caso você coloque o número, esse número corresponderá ao ID do ícone que será
# exibido. Caso você coloque o nome, terá de haver uma imagem com esse mesmo
# nome na pasta "Graphics/Pictures".
#===============================================================================
# DEFINIR DESTINO DO PERSONAGEM AO CLICAR EM UM EVENTO
#===============================================================================
# Se você quiser que, quando um evento for clicado, o personagem se dirija para
# perto desse evento e para ao lado dele, é só usar o comando de evento
# "Comentário" e colocar no início do comentário as palavras "MOUSE MOVE" e na
# frente escrever o lado em que você quer que o personagem pare quando chegar
# próximo ao evento de destino, UP = acima, LEFT = esquerda, RIGHT = direita e
# DOWN = abaixo. Observe o exemplo:
#
# MOUSE MOVE DOWN
#
# Neste exemplo, o personagem irá se mover para próximo ao evento (esse evento é
# sempre o que recebe o comentário em questão) e parar abaixo dele.
#===============================================================================
# ATIVAR UM EVENTO AO CLICAR NELE
#===============================================================================
# Você ainda pode fazer com que um evento seja ativado, mesmo à distância. Para
# isso é só usar o comando de evento "Comentário" e colocar no comentário as
# palavras "MOUSE CLICK".
#===============================================================================
# IGNORAR EVENTOS
#===============================================================================
# Para ignorar um evento quando o mouse faz seu caminho de movimento (como se o
# evento não estivesse lá), use o comando de evento "Comentário" e colocar no
# comentário as palavras "MOUSE THROUGH".
#===============================================================================
# NOTAS EXTRAS
# Mesmo utilizando o sistema de mouse, ainda é possível usar as teclas.
#===============================================================================
module Jet
  module MouseSystem
#-------------------------------------------------------------------------------
# Este é o nome da imagem que será usada como cursor. Essa imagem deve estar na
# na pasta "Graphics/Pictures". Se esta imagem não existir, o cursor terá o
# gráfico do ícone do ID respectivo ao que indicar logo abaixo.
#-------------------------------------------------------------------------------
    CURSOR_IMAGE = "cursor-picture"
    CURSOR_ICON = 147
#-------------------------------------------------------------------------------
# Esta é a Switch que desativa o mouse. Para o sistema de mouse ser desativado
# é só você ativar a switch abaixo.
#-------------------------------------------------------------------------------
    TURN_MOUSE_OFF_SWITCH = 99
#-------------------------------------------------------------------------------
# Esta opção é para que você possa habilitar ou desabilitar o movimento do
# personagem usando o mouse. Para ativar ou desativar durante o jogo, você deve
# utilizar o comando por evento "Chamar Script" e escrever o código
# "toggle_mouse_movement(true/false)" sem as aspas obviamente e usando o "true"
# para permitir e o "false" para não permitir o movimento pelo mouse.
#-------------------------------------------------------------------------------
    ALLOW_MOUSE_MOVEMENT = true
#-------------------------------------------------------------------------------
# A opção abaixo permite que seja ou não mostrada uma caixa com as bordas pretas
# no tile selecionado pelo mouse. Para permitir(como de padrão) deixe "true" e
# para não permitir, coloque "false".
#-------------------------------------------------------------------------------
    DEV_OUTLINE = true
  end
#===============================================================================
  module HoverText
#-------------------------------------------------------------------------------
# Esta é a fonte que será usada para se escrever as mensagens sobre o evento,
# quando essa função for habilitada, claro.
#-------------------------------------------------------------------------------
    FONT = "Verdana"
#-------------------------------------------------------------------------------
# Esta é a cor da fonte (R, G, B , Alpha[claridade]).
#-------------------------------------------------------------------------------
    COLOR = Color.new(255, 255, 255, 255)
#-------------------------------------------------------------------------------
# Este é o tamanho da fonte.
#-------------------------------------------------------------------------------
    SIZE = 15
  end
#===============================================================================
  module Pathfinder
#-------------------------------------------------------------------------------
# Este é o tempo padrão dado ao Pathfinder para que ele encontre o caminho.
#-------------------------------------------------------------------------------
    MAXIMUM_ITERATIONS = 1000
  end
#===============================================================================
end
#===============================================================================
# Somente edite abaixo por contra própria.
#===============================================================================
module Mouse
  
  Get_Message = Win32API.new('user32', 'GetMessage', 'plll', 'l')
  GetAsyncKeyState = Win32API.new("user32", "GetAsyncKeyState", 'i', 'i')
  GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
  GetCursorPo = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
  SetCursorPos = Win32API.new('user32', 'SetCursorPos', 'nn', 'n')
  ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'lp', 'i')
  FindWindowA = Win32API.new('user32', 'FindWindowA', 'pp', 'l')
  GetClientRect = Win32API.new('user32', 'GetClientRect', 'lp', 'i')
  GetWindowRect = Win32API.new('user32', 'GetWindowRect', 'lp', 'i')
  contents = File.open('Game.ini', 'r') {|f| f.read }
  q = contents[/Title=(.+)/].nil? ? "cccc" : $1
  @handle = FindWindowA.call('RGSS Player', q)
  
  Win32API.new('user32', 'ShowCursor', 'i', 'i').call(0)
  
  module_function
  
  def click?(button)
    return true if @keys.include?(button)
    return false
  end
  
  def press?(button)
    return true if @press.include?(button)
    return false
  end
  
  def set_pos(x_pos = 0, y_pos = 0)
    width,height = client_size
    if (x_pos.between?(0, width) && y_pos.between?(0, height))
      SetCursorPos.call(client_pos[0] + x_pos,client_pos[1] + y_pos)
    end
  end
  
  def moved?
    @pos != @old_pos
  end
  
  def set_cursor(image)
    (@cursor ||= Sprite_Cursor.new).set_cursor(image)
  end
  
  def revert_cursor
    (@cursor ||= Sprite_Cursor.new).revert
  end
  
  def update
    if !$game_switches.nil? 
      if $game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
        @keys, @press = [], []
        @pos = [-1, -1]
        @cursor.update
        return
      end
    end
    @old_pos = @pos.dup
    @pos = Mouse.pos
    @keys.clear
    @press.clear
    @keys.push(1) if GetAsyncKeyState.call(1)&0x01 == 1
    @keys.push(2) if GetAsyncKeyState.call(2)&0x01 == 1
    @keys.push(3) if GetAsyncKeyState.call(4)&0x01 == 1
    @press.push(1) if pressed?(1)
    @press.push(2) if pressed?(2)
    @press.push(3) if pressed?(4)
    @cursor.update rescue @cursor = Sprite_Cursor.new
  end
  
  def init
    @keys = []
    @press = []
    @pos = Mouse.pos
    @cursor = Sprite_Cursor.new
  end
  
  def pressed?(key)
    return true unless GetKeyState.call(key).between?(0, 1)
    return false
  end
  
  def global_pos
    pos = [0, 0].pack('ll')
    GetCursorPo.call(pos) != 0 ? (return pos.unpack('ll')) : (return [0, 0])
  end
  
  def pos
    x, y = screen_to_client(*global_pos)
    width, height = client_size
    begin
      x = 0 if x <= 0; y = 0 if y <= 0
      x = width if x >= width; y = height if y >= height
      return x, y
    end
  end
  
  def screen_to_client(x, y)
    return nil unless x && y
    pos = [x, y].pack('ll')
    if ScreenToClient.call(@handle, pos) != 0
      return pos.unpack('ll')
    else
      return [0, 0]
    end
  end
  
  def client_size
    rect = [0, 0, 0, 0].pack('l4')
    GetClientRect.call(@handle, rect)
    right,bottom = rect.unpack('l4')[2..3]
    return right, bottom
  end
  
  def client_pos
    rect = [0, 0, 0, 0].pack('l4')
    GetWindowRect.call(@handle, rect)
    left, upper = rect.unpack('l4')[0..1]
    return left + 4, upper + 30
  end
  
  def grid
    [(@pos[0]/32),(@pos[1]/32)]
  end
  
  def true_grid
    [grid[0] + $game_map.display_x, grid[1] + $game_map.display_y]
  end
  
  def area?(x, y, width, height)
    @pos[0].between?(x, width + x) && @pos[1].between?(y, height + y)
  end
  
  class Sprite_Cursor < Sprite
    
    def initialize
      super(nil)
      self.z = 50000
      @bitmap_cache = initial_bitmap
      if Jet::MouseSystem::DEV_OUTLINE
        @outline = Sprite.new(nil)
        @outline.bitmap = Bitmap.new(32, 32)
        @outline.bitmap.fill_rect(0, 0, 32, 32, Color.new(0, 0, 0, 190))
        @outline.bitmap.fill_rect(1, 1, 30, 30, Color.new(0, 0, 0, 0))
      end
    end
    
    def initial_bitmap
      begin
        self.bitmap = Cache.picture(Jet::MouseSystem::CURSOR_IMAGE)
      rescue
        self.bitmap = Bitmap.new(24, 24)
        icon_index = Jet::MouseSystem::CURSOR_ICON
        rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
        self.bitmap.blt(0, 0, Cache.system("Iconset"), rect, 255)
      end
      self.bitmap.dup
    end
    
    def set_cursor(image)
      if image.is_a?(Integer)
        self.bitmap = Bitmap.new(24, 24)
        icon_index = image
        rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
        self.bitmap.blt(0, 0, Cache.system("Iconset"), rect, 255)
      else
        self.bitmap = Cache.picture(image)
      end
    end
    
    def revert
      self.bitmap = @bitmap_cache.dup
    end
    
    def update
      super
      self.x, self.y = *Mouse.pos
      self.visible = !$game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
      if !@outline.nil?
        @outline.visible = SceneManager.scene_is?(Scene_Map)
        @outline.x = Mouse.grid[0] * 32
        @outline.y = [Mouse.grid[1] * 32, 1].max
      end
    end
  end
end

Mouse.init

class << Input

  alias jet5888_press? press?
  def press?(arg)
    if arg == Input::C
      return true if Mouse.press?(1)
    elsif arg == Input::B
      return true if Mouse.press?(2)
    end
    jet5888_press?(arg)
  end
  
  alias jet5888_repeat? repeat?
  def repeat?(arg)
    if arg == Input::C
      return true if Mouse.click?(1)
    elsif arg == Input::B
      return true if Mouse.click?(2)
    end
    jet5888_repeat?(arg)
  end
  
  alias jet5888_trigger? trigger?
  def trigger?(arg)
    if arg == Input::C
      return true if Mouse.click?(1)
    elsif arg == Input::B
      return true if Mouse.click?(2)
    end
    jet5888_trigger?(arg)
  end
  
  alias jet3845_dir4 dir4
  def dir4(*args, &block)
    if (orig = jet3845_dir4) == 0
      if !$game_temp.nil? && SceneManager.scene_is?(Scene_Map)
        if !(a = $game_temp.mouse_character).nil? && a.movable?
          if !$game_temp.mouse_path.nil? && !$game_temp.mouse_path.empty?
            return $game_temp.mouse_path.pop * 2
          end
        end
      end
    end
    $game_temp.mouse_path = nil if !$game_temp.nil?
    return orig
  end
  
  alias jet8432_update update
  def update(*args, &block)
    jet8432_update(*args, &block)
    Mouse.update
  end
end

class Window_Selectable
  
  alias jet1084_update update
  def update(*args, &block)
    jet1084_update(*args, &block)
    update_mouse if self.active && self.visible && Mouse.moved?
  end
  
  alias jet7222_top_row top_row=
  def top_row=(*args, &block)
    @last_cursor_move = 0 if @last_cursor_move.nil?
    @last_cursor_move -= 1
    return if @last_cursor_move > 0
    jet7222_top_row(*args, &block)
    @last_cursor_move = 10
  end

  
  def update_mouse
    return if $game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
    orig_index = @index
    rects = []
    add_x = self.x + 16 - self.ox
    add_y = self.y + 16 - self.oy
    if !self.viewport.nil?
      add_x += self.viewport.rect.x - self.viewport.ox
      add_y += self.viewport.rect.y - self.viewport.oy
    end
    self.item_max.times {|i|
      @index = i
      mouse_update_cursor
      rects.push(cursor_rect.dup)
    }
    @index = orig_index
    rects.each_with_index {|rect, i|
      if Mouse.area?(rect.x + add_x, rect.y + add_y, rect.width, rect.height)
        @index = i
      end
    }
    update_cursor
  end
  
  def mouse_update_cursor
    if @cursor_all
      cursor_rect.set(0, 0, contents.width, row_max * item_height)
    elsif @index < 0
      cursor_rect.empty
    else
      cursor_rect.set(item_rect(@index))
    end
  end
end

class Window_NameInput
  
  def item_max
    90
  end
end

class Scene_File
  
  alias jet3467_update update
  def update(*args, &block)
    update_mouse
    jet3467_update(*args, &block)
  end
  
  alias jet7222_top_index top_index=
  def top_index=(*args, &block)
    @last_cursor_move = 0 if @last_cursor_move.nil?
    @last_cursor_move -= 1
    return if @last_cursor_move > 0
    jet7222_top_index(*args, &block)
    @last_cursor_move = 10
  end
  
  def update_mouse
    self.item_max.times {|i|
      ix = @savefile_windows[i].x
      iy = @savefile_windows[i].y + 48 - @savefile_viewport.oy
      iw = @savefile_windows[i].width
      ih = @savefile_windows[i].height
      if Mouse.area?(ix, iy, iw, ih)
        @savefile_windows[@index].selected = false
        @savefile_windows[i].selected = true
        @index = i
      end
    }
    ensure_cursor_visible
  end
end

class Game_Temp
  
  attr_accessor :mouse_character, :mouse_movement, :mouse_path
  
end

class Game_CharacterBase

  def mouse_path(target_x, target_y)
    f = $game_map.find_path(target_x.to_i, target_y.to_i, @x.to_i, @y.to_i, self)
    $game_temp.mouse_path = f.collect {|a| a.code }
  end
end

class Game_Player
  
  def move_by_input
    return if !movable? || $game_map.interpreter.running?
    dir = Input.dir4
    move_straight(dir) if dir > 0
  end
  
  alias jet3745_check_action_event check_action_event
  def check_action_event(*args, &block)
    return false unless Input.jet5888_trigger?(:C)
    jet3745_check_action_event(*args, &block)
  end
  
  alias jet3745_get_on_off_vehicle get_on_off_vehicle
  def get_on_off_vehicle(*args, &block)
    if !Input.jet5888_trigger?(:C)
      [:boat, :ship, :airship].each {|a|
        if $game_map.send(a).pos?(*Mouse.true_grid)
          jet3745_get_on_off_vehicle(*args, &block)
          return
        end
      }
    elsif Input.jet5888_trigger?(:C)
      jet3745_get_on_off_vehicle(*args, &block)
    end
  end
  
  def get_on_vehicle_mouse(veh)
    return if vehicle
    @vehicle_type = veh.type
    if vehicle
      turn_toward_character(veh)
      @vehicle_getting_on = true
      force_move_forward unless in_airship?
      @followers.gather
    end
    @vehicle_getting_on
  end
end

class Window_MousePopUp < Window_Base
  
  def initialize(event, text)
    rect = Bitmap.new(1, 1).text_size(text)
    width = rect.width
    height = rect.height
    super(event.screen_x - width / 2, event.screen_y - 48, width + 32, height + 32)
    self.opacity = 0
    self.contents.font.name = Jet::HoverText::FONT
    self.contents.font.color = Jet::HoverText::COLOR
    self.contents.font.size = Jet::HoverText::SIZE
    @text = text
    @event = event
    refresh
  end
  
  def refresh
    contents.clear
    draw_text(0, 0, contents.width, contents.height, @text)
  end
  
  def update
    super
    self.visible = !@event.erased? && Mouse.true_grid == [@event.x, @event.y]
    self.x = @event.screen_x - contents.width / 2 - 8
    self.y = @event.screen_y - 64
  end
end

class Game_Event
  
  attr_accessor :text_box
  
  def check_for_comment(regexp)
    return false if empty?
    for item in @list
      if item.code == 108 or item.code == 408
        if !item.parameters[0][regexp].nil?
          return $1.nil? ? true : $1
        end
      end
    end
    return false
  end
  
  def mouse_empty?
    return true if empty?
    return @list.reject {|a| [108, 408].include?(a.code) }.size <= 1
  end
  
  alias jet3745_setup_page setup_page
  def setup_page(*args, &block)
    jet3745_setup_page(*args, &block)
    @text_box = nil
    @mouse_activated = nil
  end
  
  def mouse_activated?
    @mouse_activated ||= check_for_comment(/MOUSE[ ]*CLICK/i)
  end
  
  def text_box
    @text_box ||= (
      if (a = check_for_comment(/MOUSE[ ]*TEXT[ ]*(.+)/i))
        Window_MousePopUp.new(self, a)
      else
        false
      end
    )
  end
  
  def through
    if $game_temp.mouse_movement && check_for_comment(/MOUSE[ ]*THROUGH/i)
      true
    else
      super
    end
  end
  
  def mouse_cursor
    @mouse_cursor ||= (
      if (a = check_for_comment(/MOUSE[ ]*PIC[ ]*(\d+)/i))
        a.to_i
      elsif (a = check_for_comment(/MOUSE[ ]*PIC[ ]*(.+)/i))
        a
      else
        false
      end
    )
  end
  
  def erased?
    @erased
  end
  
  def movable?
    return false if moving?
    return false if $game_message.busy? || $game_message.visible
    return true
  end
  
  def check_mouse_change
    if mouse_cursor
      Mouse.set_cursor(@mouse_cursor)
      return true
    end
    return false
  end
  
  alias jet3845_update update
  def update(*args, &block)
    jet3845_update(*args, &block)
    @text_box.update if text_box
  end
end

class Game_Vehicle
  
  attr_reader :type
  
end

class Game_System
  
  attr_accessor :mouse_movement
  
  alias jet2735_initialize initialize
  def initialize(*args, &block)
    jet2735_initialize(*args, &block)
    @mouse_movement = Jet::MouseSystem::ALLOW_MOUSE_MOVEMENT
  end
end

class Game_Interpreter
  
  def toggle_mouse_movement(bool)
    $game_system.mouse_movement = bool
  end
end

class Scene_Map
  
  alias jet3745_update update
  def update(*args, &block)
    jet3745_update
    check_mouse_movement if $game_system.mouse_movement
    check_mouse_icon_change
  end
  
  alias jet5687_terminate terminate
  def terminate(*args, &block)
    $game_map.events.values.each {|a| 
      a.text_box.dispose if a.text_box
      a.text_box = nil
    }
    Mouse.update
    jet5687_terminate(*args, &block)
  end
  
  def mouse_char
    $game_temp.mouse_character
  end
  
  def check_mouse_icon_change
    changed_mouse = false
    $game_map.events_xy(*Mouse.true_grid).each {|event|
      changed_mouse = changed_mouse || event.check_mouse_change
    }
    Mouse.revert_cursor unless changed_mouse
  end

  def check_mouse_movement
    $game_temp.mouse_character ||= $game_player
    if Mouse.click?(1)
      dont_move = false
      x, y = *Mouse.true_grid
      ($game_map.events_xy(x, y) + $game_map.vehicles).each {|event|
        if event.is_a?(Game_Vehicle)
          if (event.x - mouse_char.x).abs + (event.y - mouse_char.y).abs == 1
            if [event.x, event.y] == Mouse.true_grid
              mouse_char.get_on_vehicle_mouse(event)
              dont_move = true
            end
          end
        elsif !!!mouse_char.vehicle
          if event.mouse_activated?
            event.start
            dont_move = true
          elsif (event.x - mouse_char.x).abs + (event.y - mouse_char.y).abs == 1
            if event.is_a?(Game_Vehicle)
              mouse_char.get_on_vehicle_mouse(event)
              dont_move = true
            else
              if !event.mouse_empty? && [0, 1, 2].include?(event.trigger)
                mouse_char.turn_toward_character(event)
                event.start
                dont_move = true
              end
            end
          else
            {UP: [0, -1], DOWN: [0, 1], LEFT: [-1, 0], RIGHT: [1, 0]}.each {|d, a|
              if event.check_for_comment(/MOUSE[ ]*MOVE[ ]*#{d.to_s}/i)
                x += a[0]; y += a[1]
              end
            }
          end
        end
      }
      mouse_char.mouse_path(x, y) unless dont_move
    end
  end
end

class Node
  
  include Comparable

  attr_accessor :point, :parent, :cost, :cost_estimated

  def initialize(point)
    @point = point
    @cost = 0
    @cost_estimated = 0
    @on_path = false
    @parent = nil
  end

  def mark_path
    @on_path = true
    @parent.mark_path if @parent
  end
   
  def total_cost
    cost + cost_estimated
  end

  def <=>(other)
    total_cost <=> other.total_cost
  end
   
  def ==(other)
    point == other.point
  end
end

class Point
  
  attr_accessor :x, :y
  
  def initialize(x, y)
    @x, @y = x, y
  end

  def ==(other)
    return false unless Point === other
    @x == other.x && @y == other.y
  end

  def distance(other)
    (@x - other.x).abs + (@y - other.y).abs
  end

  def relative(xr, yr)
    Point.new(x + xr, y + yr)
  end
end

class Game_Map
  
  def each_neighbor(node, char = $game_player)
    x = node.point.x
    y = node.point.y
    nodes = []
    4.times {|i|
      i += 1
      new_x = round_x_with_direction(x, i * 2)
      new_y = round_y_with_direction(y, i * 2)
      next unless char.passable?(x, y, i * 2)
      nodes.push(Node.new(Point.new(new_x, new_y)))
    }
    nodes
  end
  
  def find_path(tx, ty, sx, sy, char = $game_player)
    start = Node.new(Point.new(sx, sy))
    goal = Node.new(Point.new(tx, ty))
    return [] if start == goal
    return [] if ![2, 4, 6, 8].any? {|i| char.passable?(tx, ty, i) }
    open_set = [start]
    closed_set = []
    path = []
    iterations = 0
    loop do
      return [] if iterations == Jet::Pathfinder::MAXIMUM_ITERATIONS
      iterations += 1
      current = open_set.min
      return [] unless current
      each_neighbor(current, char).each {|node|
        if node == goal
          node.parent = current
          node.mark_path
          return recreate_path(node)
        end
        next if closed_set.include?(node)
        cost = current.cost + 1
        if open_set.include?(node)
          if cost < node.cost
            node.parent = current
            node.cost = cost
          end
        else
          open_set << node
          node.parent = current
          node.cost = cost
          node.cost_estimated = node.point.distance(goal.point)
        end
      }
      closed_set << open_set.delete(current)
    end
  end
  
  def recreate_path(node)
    path = []
    hash = {[1, 0] => 6, [-1, 0] => 4, [0, 1] => 2, [0, -1] => 8}
    until node.nil?
      pos = node.point
      node = node.parent
      next if node.nil?
      ar = [pos.x <=> node.point.x, pos.y <=> node.point.y]
      path.push(RPG::MoveCommand.new(hash[ar] / 2))
    end
    return path
  end
end



         
  • Para utilizar o script é só colar acima do Main.
  • Mais instruções estão no cabeçalho do próprio script.

Informações

         
  • Creio que não funciona no XP nem no VX, mas não testei.
  • Possui baixo nível de compatibilidade se usado junto a scripts que interfiram nos mesmos scripts em que esse modificou.

Créditos
     
  • Jet, por criar o script.
     Post original: http://forums.rpgmakerweb.com/index.php?/topic/3065-mouse-system/


Todos os scripts criados por Jet estão sob liçenca da Creative Commons e podem ser usados somente para finalidades não-comerciais.

Gostei bastante do sistema, pode ser incrivelmente útil. Provavelmente vou usar em algum dos meus projetos, muito obrigado por postá-lo. Será que ele funciona bem com um script de batalha tática?
To Die Is To Find Out If Humanity Ever Conquers Death

Hum... bem mano, caso esteja planejando uma batalha tática
por eventos, não pensei no caso, mas acho que é possível sem
muito problema quanto à dificuldade de uso, vai ser mais tenso
mesmo programar. Agora, se quiser usar algum script para TBS,
acho meio difícil este funcionar, porque o movimento em batalha
dos TBSs já são feitos lá... dái acho que esse script daria
incompatibilidade...

Mas bem, tudo isso, só acho... só tem um jeito de descobrir... hehe
  :XD:

De boa, se eu conseguir fazer funcionar faço um jogo tático só pelo sistema. Obrigado cara o/
To Die Is To Find Out If Humanity Ever Conquers Death

Acho muito legal usar o Mouse para algumas interações, até mesmo para movimento, esse é um sistema que vale a pena colocar no seu jogo.





Eu sei que pode parecer meio coisa de burro mais como não manjo nada de rgss queria tirar uma duvida:
Qual o Local do SCRIPT aonde posso modificar o icon do cursor?
RPG Maker Vx Ace.

Bem, acho que já resolveu, mas está no script. Só de ver o código do
post vi que tem essa opção.
Você só vai trocar o ID do ícone, só ler as informações, que a propósito
eu traduzi pra facilitar, que vai encontrar fácil.
  :XD:

Citação de: King Gerar online 26/01/2014 às 14:39
Bem, acho que já resolveu, mas está no script. Só de ver o código do
post vi que tem essa opção.
Você só vai trocar o ID do ícone, só ler as informações, que a propósito
eu traduzi pra facilitar, que vai encontrar fácil.
  :XD:
Muito Obrigado Pela resposta Gear;
RPG Maker Vx Ace.

eu tentei usar esse script "Mouse System" mas não funcionava... ate que descobri o problema, que era incompatibilidade com o script Dax Core. Antes eu tentava fazer com que o "personagem" andasse mas nada acontecia ao invés de aparecer somente o "icon" do "Mouse system" aparecia também o ponteiro do Windows em cima. Depois de retirar o Dax Core... o outro script funcionou perfeitamente.
E eu queria usar esse script... mas não posso "descartar" o Dax Core por ser necessário.
... ... ...

Esse sistema de mouse é o mais completo que vi até agora, muito bom.
Só gostaria de saber se tem como eu armazenar numa variável as coordenadas X e Y do ponteiro do mouse, simplesmente para definir a altura e largura de determinados eventos.

Citação de: TokusatsuBR online 02/02/2014 às 14:41
Muito Obrigado Pela resposta Gear;
Sim... o amigo do Super Shock...  :hmm:



Citação de: Kowts online 02/02/2014 às 21:06
eu tentei usar esse script "Mouse System" mas não funcionava... ate que descobri o problema, que era incompatibilidade com o script Dax Core. Antes eu tentava fazer com que o "personagem" andasse mas nada acontecia ao invés de aparecer somente o "icon" do "Mouse system" aparecia também o ponteiro do Windows em cima. Depois de retirar o Dax Core... o outro script funcionou perfeitamente.
E eu queria usar esse script... mas não posso "descartar" o Dax Core por ser necessário.

Bem Kowts, se o problema é mostrar o cursor do Windows, você
pode usar o código abaixo, via Chamar Script mesmo:

Win32API.new('User32', 'ShowCursor', 'i', 'i').call(0)

Não sei se vai funcionar... mas na teoria sim. Agora caso não
funcione, seria melhor pedir suporte ao Dax, já que ele é daqui
mesmo. Com o Jet seria mais complicado, e domorado.




Citação de: MayLeone online 02/02/2014 às 23:04
Esse sistema de mouse é o mais completo que vi até agora, muito bom.
Só gostaria de saber se tem como eu armazenar numa variável as coordenadas X e Y do ponteiro do mouse, simplesmente para definir a altura e largura de determinados eventos.
Hum, Mayzinha... vai me desculpar mas não sei. Creio que esse script
não faz isso não. Mas sei que esse guarda o valor dessas coordenadas,
talvez sirva e funcionem juntos.
  :XD:

Obrigada, Gerar! Vou testa-los aqui, será de grande ajuda.

 May, acho que isso funciona veja(Eu não teste;;)
$game_variables[id] = Jet::MouseSystem.pos[0] # X
$game_variables[id] = Jet::MouseSystem.pos[1] # Y



Testarei, Dax! Obrigada!

Gente ._. HELP-ME, quando eu desativo " andar pelo mouse " eu não consigo clicar nos eventos para eles ativarem, é como se o andar do mouse também desativasse o sistema de "click no evento" ...
Teria como alguem resolver isto ?
Tudo vai dar certo (y(8.