Author: Samarium Version: 1.0
Function:Show one comment when your mouse stays above event.

Utilization:Is very easy! Add one commetn with [M] and after put the text

Above Main #------------------------------------------------------------------------ # MouseOver Version 1.1 # RPG Maker VX # # Auteur : Samarium # # Créé le 12 Février 2008 # # Fonction : Permet d'afficher une fenêtre contenant un texte sur # un ou des évènement(s) lors du passage de la souris # sur ce dernier # # Utilisation : Très facile ! Faites un commentaire commençant par [M] # suivit du texte dans l'/les évènement(s) de votre choix. # # Script modifié : Scene_Map # # Site : www.rpgcreative.net # # Remarque : Script disponible aussi sous RPG Maker XP # #------- Modification --------- # #------------------------------------------------------------------------
def defaut return "Window" end
# ------------------ A définir -------------------
FONT_SIZE = 16 # La taille du texte FONT_FACE = "Arial" # Police du texte WINDOWSKIN = defaut # Le nom du Windoskin. Mettez "defaut" (sans les guillemets) pour afficher le Windowskins par défaut.
# Mettez la couleur RGB du texte. Mettez 0 pour tous pour la couleur noire et 255 pour la couleur blanche COLOR_RED = 255 COLOR_BLUE = 255 COLOR_GREEN = 255
OPACITY = 160 # Opacité de la fenêtre # ------------------------------------------------
#--------------------------------------------------------------------- # Game_Search_Event # # Permet, dès le départ, chercher tout les évènements ayant un # commentaire commençant par [M] et de les enregistrer dans un # tableau (ID de l'évènement et message) #--------------------------------------------------------------------- class Game_Search_Event def initialize # initialisation des variables @element_event = {} @map = load_data(sprintf("Data/Map%03d.rvdata", $game_map.map_id)) @nb_event = @map.events.size @tab_event = @map.events.values # Retourne les valeurs du Hash dans un tableau main end def main for i in 0..@nb_event - 1 # Prend le contenu de la page de chaques évènements event = @tab_event[i] pages = event.pages for page in event.pages # Prend la liste et le code de la commande d'évènement list = page.list code = cod(list) # Si le code est celui que l'on veut if code[0] event_id = event.id message = code[1] # Ajoute dans un Hash, l'ID et le message de l'évènement @element_event[event_id] = message end end end $search_finish = $game_map.map_id end def element_event_id return @element_event.keys # Array end def element_event_message(event) return @element_event[event] # String end def element_event_size return @element_event.size # Integer end def cod(list) # initialisation des variables for index in 0...list.size parameters = list[index].parameters # Si la commande est un commentaire et commence par [M] if list[index].code == 108 and commentaire(parameters[0]) message_text = parameters[0] + "\n" # Ajoute aux messages les lignes suivantes for line_count in 1..5 if list[line_count] != nil if list[index + line_count].code == 408 message_text += list[index + line_count].parameters[0] + "\n" end end end return true, message_text end end return false, false end
def commentaire(text) # Cherche le [M] et l'efface text.gsub!(/[\[Mm]\]/) { "\001" } while ((c = text.slice!(/./m)) != nil) if c == "\001" text.sub!(/[\[Mm]\]/, "") return true end end return false end end
#--------------------------------------------------------------------- # Mouse # # Reprise du module Mouse créé par Cybersam et édité par Astro_mech # Calcule et retourne la position X et Y de la souris sur l'écran # #---------------------------------------------------------------------
module Mouse gsm = Win32API.new('user32', 'GetSystemMetrics', 'i', 'i')
@cursor_pos = Win32API.new('user32', 'GetCursorPos', 'p', 'i') module_function
def mouse_global_pos pos = [0, 0].pack('ll') if @cursor_pos.call(pos) != 0 return pos.unpack('ll') else return nil end end
def mouse_pos(catch_anywhere = false) x, y = screen_to_client(*mouse_global_pos) width, height = client_size # if catch_anywhere or (x >= 0 and y >= 0 and x < width and y < height) return x, y # else # return $m.x, $m.y # end end
def del if @oldcursor == nil return else @SetClassLong.call(handel ,-12, @oldcursor) @oldcursor = nil end end end
$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')
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
def hwnd game_name = "\0" * 256 $readini.call('Game','Title','',game_name,255,".\\Game.ini") game_name.delete!("\0") return $findwindow.call('RGSS Player',game_name) end
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
#--------------------------------------------------------------------- # Game_Pos_Screen_Event # # Calcul la position de l'évènement non par rapport à la carte # mais selon l'écran. #---------------------------------------------------------------------
class Game_Pos_Screen_Event def initialize # Initialisation @x = @y = @real_x = @real_y = 0 @map = load_data(sprintf("Data/Map%03d.rvdata", $game_map.map_id)) end def calcul_pos_event(event_id = 1) # Prend la position de l'évènement event = @map.events[event_id] pos_x_event = event.x pos_y_event = event.y # Calcule la position relative à l'écran @x = pos_x_event % @map.width @y = pos_y_event % @map.height @real_x = @x * 256 @real_y = @y * 256 end
def screen_x return ($game_map.adjust_x(@real_x) + 8007) / 8 - 1000 + 16 end def screen_y return ($game_map.adjust_y(@real_y) + 8007) / 8 - 1000 + 32 end end
#--------------------------------------------------------------------- # Game_Pos_Screen_Mouse # # Retourne les positions de la souris grâce au module Mouse #---------------------------------------------------------------------
class Game_Pos_Screen_Mouse def initialize @pos_x_mouse = @pos_y_mouse = 0 end def screen_x return @pos_x_mouse = Mouse.mouse_pos[0] end def screen_y return @pos_y_mouse = Mouse.mouse_pos[1] end end #--------------------------------------------------------------------- # Window_MouseOver # # Affichage de la fenêtre MouseOver. Calcule la taille de la feêtre # selon la taille du texte. #---------------------------------------------------------------------
class Window_MouseOver < Window_Base def initialize super(0, 0, 64, 64) @height = @width = 64 end
def refresh(text) # initialisation x = y = lign_size = max_size = 0
self.contents = Bitmap.new(@width - 32, @height - 32) self.contents.font.name = FONT_FACE self.contents.font.size = FONT_SIZE self.windowskin = Cache.system(WINDOWSKIN) self.contents.font.color = Color.new(COLOR_RED,COLOR_BLUE, COLOR_GREEN, 255) self.opacity = OPACITY self.contents.clear ctab = text.scan(/./m) for i in 0..ctab.size - 1 if ctab[i] == "\n" # Prend la ligne la plus grande (pour la taille de la fenêtre) if lign_size > max_size max_size = lign_size end lign_size = x = 0 y += 1 next end lign_size += self.contents.text_size(ctab[i]).width taille_height = self.contents.text_size(ctab[i]).height # Affichage du texte self.contents.draw_text(x, taille_height * y, 20, 20, ctab[i]) x += self.contents.text_size(ctab[i]).width end # Calcule de la taille de la fenêtre @height = self.height = taille_height * y + 32 @width = self.width = max_size + 32 # Affichage si la taille du contenu de la Bitmap (- 32px) est égal à la taille de la fenêtre if self.contents.width == @width - 32 and self.contents.height == @height - 32 self.visible = true else self.visible = false end end def width_window return self.width end def height_window return self.height end end
#--------------------------------------------------------------------- # Scene_Map # # Reprise du scritp Scene_Map avec des parties rajoutées # Affiche la fenêtre sur la carte. #---------------------------------------------------------------------
class Scene_Map < Scene_Base def start super $game_map.refresh @spriteset = Spriteset_Map.new @message_window = Window_Message.new #-------- RAJOUT SCRIPT MOUSEOVER ---------- $search_finish = 0 @map = load_data(sprintf("Data/Map%03d.rvdata", $game_map.map_id)) @mouseover_window = Window_MouseOver.new @mouseover_window.visible = false @event_memoire = 0 #---------- FIN ---------------------------- end def terminate super if $scene.is_a?(Scene_Battle) @spriteset.dispose_characters end snapshot_for_background @spriteset.dispose @message_window.dispose #-------- RAJOUT SCRIPT MOUSEOVER ---------- @mouseover_window.dispose #---------- FIN ---------------------------- if $scene.is_a?(Scene_Battle) perform_battle_transition end end def update super $game_map.interpreter.update $game_map.update $game_player.update $game_system.update @spriteset.update @message_window.update #---------------------------------------------------- # RAJOUT SCRIPT MOUSEOVER # Ce code permet d'afficher la fenêtre lorsque # la souris se trouve su l'évènement #---------------------------------------------------- # Cherche les évènements commentés commençant par [M] if $search_finish != $game_map.map_id # Cette condition permet de chercher seulement une fois les évènements par map $game_search_event = Game_Search_Event.new @event_tab = $game_search_event.element_event_id end
# Positions X et Y de la souris sur l'écran $game_pos_screen_mouse = Game_Pos_Screen_Mouse.new mouse_x = $game_pos_screen_mouse.screen_x mouse_y = $game_pos_screen_mouse.screen_y # Positions X et Y des évènements sur l'écran $game_pos_screen_event = Game_Pos_Screen_Event.new element_event_size = $game_search_event.element_event_size # Parcours le tableau contenant les évènements à afficher for i in 0..element_event_size - 1 event = @event_tab[i] # Calcul la position de l'évènement relative à l'écran $game_pos_screen_event.calcul_pos_event(event) event_x = $game_pos_screen_event.screen_x event_y = $game_pos_screen_event.screen_y # Si la souris est sur l'évènement (carreau de 32*32) if mouse_x != nil and mouse_y != nil # Evite de tester une position nulle de la souris if mouse_x <= (event_x + 16) and mouse_x >= (event_x - 16) if mouse_y <= (event_y) and mouse_y >= (event_y - 32) # Affiche la fenêtre avec le message de l'évènement et à ses positions text = $game_search_event.element_event_message(event) if text.size != 1 @mouseover_window.refresh(text) end # Calcul la position X et Y à afficher afin d'éviter que l'écran coupe la fenêtre width_window = @mouseover_window.width_window height_window = @mouseover_window.height_window if (width_window + event_x) > 544 @mouseover_window.x = event_x - width_window else @mouseover_window.x = event_x end if (height_window + event_y) > 416 @mouseover_window.y = event_y - height_window - 16 else @mouseover_window.y = event_y - 16 end # Retient en mérmoire l'ID de l'évènement @event_memoire = event # Si la souris n'est plus sur l'évènement elsif @event_memoire == event @mouseover_window.visible = false @event_memoire = 0 end elsif @event_memoire == event @mouseover_window.visible = false @event_memoire = 0 end else @mouseover_window.visible = false end end #------------ FIN DU CODE ---------------------- unless $game_message.visible update_transfer_player update_encounter update_call_menu update_call_debug update_scene_change end end end
 |