Confira o Videos Épicos #45!
17 Respostas   5598 Visualizações
0 Membros e 1 Visitante estão vendo este tópico.
#===============================================================================# 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 endendMouse.initclass << 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 endendclass 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 endendclass Window_NameInput def item_max 90 endendclass 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 endendclass Game_Temp attr_accessor :mouse_character, :mouse_movement, :mouse_path endclass 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 } endendclass 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 endendclass 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 endendclass 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 endendclass Game_Vehicle attr_reader :type endclass 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 endendclass Game_Interpreter def toggle_mouse_movement(bool) $game_system.mouse_movement = bool endendclass 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 endendclass 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 endendclass 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) endendclass 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 endend
Bem, acho que já resolveu, mas está no script. Só de ver o código dopost vi que tem essa opção.Você só vai trocar o ID do ícone, só ler as informações, que a propósitoeu traduzi pra facilitar, que vai encontrar fácil.
Muito Obrigado Pela resposta Gear;
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.
Win32API.new('User32', 'ShowCursor', 'i', 'i').call(0)
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.
$game_variables[id] = Jet::MouseSystem.pos[0] # X$game_variables[id] = Jet::MouseSystem.pos[1] # Y