Partagez
Aller en bas
Zephyr_1.2
Zephyr_1.2
Membre

Nombre de messages : 158
Localisation : Scénariste érrant...
Distinction : aucune
Date d'inscription : 13/02/2008

Système MouseOver Version 1.2 Empty Système MouseOver Version 1.2

le Jeu 14 Fév 2008 - 23:51
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.

Système MouseOver Version 1.2 Screen11

Code:
#===============================================================
#                         
#                www.rpgmakervx-fr.com                                         
#     
#===============================================================
#------------------------------------------------------------------------
#                          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
Korndor
Korndor
Staffeux retraité

Nombre de messages : 4959
Age : 106
Localisation : Erem Vehyx
Distinction : Champion de boxe et au lit ! :O [Wax]
Être Mythique [Mister]
Papi Korndor qui a l'ostéoporose [Skillo]
Soldat Ikéa [Coco']
Un bonhomme, un vrai ! [Neresis]
Vieillard acariâtre [Didier Gustin]
Date d'inscription : 16/12/2007
https://www.rpgmakervx-fr.com/

Système MouseOver Version 1.2 Empty Re: Système MouseOver Version 1.2

le Ven 15 Fév 2008 - 17:20
wow, super utile; merci! ^^
Mister Geek
Mister Geek
Staffeux retraité

Nombre de messages : 719
Age : 25
Localisation : Vosges
Distinction : aucune
Date d'inscription : 20/12/2007

Système MouseOver Version 1.2 Empty Re: Système MouseOver Version 1.2

le Ven 15 Fév 2008 - 18:05
En effet, ça claque ! =D

Merci Wink
Dydc4
Dydc4
Membre

Nombre de messages : 135
Age : 25
Localisation : Dans le 79 tu me trouveras.
Distinction : aucune
Date d'inscription : 20/12/2007
http://www.picnicland.superforum.fr

Système MouseOver Version 1.2 Empty Re: Système MouseOver Version 1.2

le Ven 15 Fév 2008 - 21:21
Super c'est!
Surtout pour faire des mmorpg, cela sera utile.
NostalGeek
NostalGeek
Membre

Nombre de messages : 107
Distinction : aucune
Date d'inscription : 02/03/2008

Système MouseOver Version 1.2 Empty Re: Système MouseOver Version 1.2

le Ven 7 Mar 2008 - 12:05
génial xce script!
mais ça fait ramer à mort XD
il n'y auraiyt pas un script anti-lag pour rmvx par hasard?
Lindya
Lindya
Membre

Nombre de messages : 39
Age : 42
Distinction : aucune
Date d'inscription : 06/03/2008

Système MouseOver Version 1.2 Empty Re: Système MouseOver Version 1.2

le Ven 7 Mar 2008 - 14:33
il n'y auraiyt pas un script anti-lag pour rmvx par hasard?


en tout cas si il y a je veux !!!!! Système MouseOver Version 1.2 153215
fabY
fabY
Membre

Nombre de messages : 229
Distinction : aucune
Date d'inscription : 29/01/2008
http://rpg-maker-vx.bbactif.com/index.htm

Système MouseOver Version 1.2 Empty Re: Système MouseOver Version 1.2

le Ven 7 Mar 2008 - 17:06
Je crois que Berka en a fait un (ou du moins en a adapté un).

Trouvé !
Le voila :
Spoiler:

class Game_Map
#--------------------------------------------------------------------------
def in_range?(object)
screne_x = $game_map.display_x
screne_x -= 256
screne_y = $game_map.display_y
screne_y -= 256
screne_width = $game_map.display_x
screne_width += 2816
screne_height = $game_map.display_y
screne_height += 2176
if object.real_x < screne_x and screne_x >= screne_width
return false
end
if object.real_y < screne_y and screne_y >= screne_height
return false
end
return true
end
#--------------------------------------------------------------------------
def update
if $game_map.need_refresh
refresh
end
if @scroll_rest > 0
distance = 2 ** @scroll_speed
case @scroll_direction
when 2
scroll_down(distance)
when 4
scroll_left(distance)
when 6
scroll_right(distance)
when 8
scroll_up(distance)
end
@scroll_rest -= distance
end
for event in @events.values
if in_range?(event) or event.trigger == 3 or event.trigger == 4
event.update
end
end
for common_event in @common_events.values
common_event.update
end
end
end

#======================================
# â– Spriteset_Map
#======================================

class Spriteset_Map
#--------------------------------------------------------------------------
def in_range?(object)
screne_x = $game_map.display_x
screne_x -= 256
screne_y = $game_map.display_y
screne_y -= 256
screne_width = $game_map.display_x
screne_width += 2816
screne_height = $game_map.display_y
screne_height += 2176
if object.real_x < screne_x and screne_x >= screne_width
return false
end
if object.real_y < screne_y and screne_y >= screne_height
return false
end
return true
end
#--------------------------------------------------------------------------
def update
if @parallax_name != $game_map.parallax_name
@parallax_name = $game_map.parallax_name
if @parallax.bitmap != nil
@parallax.bitmap.dispose
@parallax.bitmap = nil
end
if @parallax_name != ""
@parallax.bitmap = RPG::Cache.parallax(@parallax_name)
end
Graphics.frame_reset
end
@tilemap.ox = $game_map.display_x / 8
@tilemap.oy = $game_map.display_y / 8
@tilemap.update
@parallax.ox = $game_map.display_x / 8
@parallax.oy = $game_map.display_y / 8
i=0
for sprite in @character_sprites
if sprite.character.is_a?(Game_Event)
if in_range?(sprite.character) or sprite.character.trigger == 3 or sprite.character.trigger == 4
sprite.update
i+=1
end
else
sprite.update
i+=1
end
end
for sprite in @picture_sprites
sprite.update
end
@timer_sprite.update
@viewport1.update
@viewport3.update
end
end

Par contre chez moi il marche pas très bien, ça bug un peu moins mais c'est pas flagrant ^^.
NostalGeek
NostalGeek
Membre

Nombre de messages : 107
Distinction : aucune
Date d'inscription : 02/03/2008

Système MouseOver Version 1.2 Empty Re: Système MouseOver Version 1.2

le Ven 7 Mar 2008 - 17:46
merci je vais eesayé car à passer de 60 images par secondes à 5 il faut le faire XD (merci fraps :p ).
Korndor
Korndor
Staffeux retraité

Nombre de messages : 4959
Age : 106
Localisation : Erem Vehyx
Distinction : Champion de boxe et au lit ! :O [Wax]
Être Mythique [Mister]
Papi Korndor qui a l'ostéoporose [Skillo]
Soldat Ikéa [Coco']
Un bonhomme, un vrai ! [Neresis]
Vieillard acariâtre [Didier Gustin]
Date d'inscription : 16/12/2007
https://www.rpgmakervx-fr.com/

Système MouseOver Version 1.2 Empty Re: Système MouseOver Version 1.2

le Ven 7 Mar 2008 - 17:48
oki!^^
Le locke ce topic, pour toute autre question, allez dans la section appropriée Wink
Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum