AccueilAccueil  PortailPortail  RechercherRechercher  Dernières imagesDernières images  S'enregistrerS'enregistrer  ConnexionConnexion  



Le Deal du moment : -30%
LEGO Icons 10318 – Le Concorde à ...
Voir le deal
139.99 €

Partagez
 

 [VX] Extension des zones.

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Tiroflan
Illusionniste Lv.12
Illusionniste Lv.12
Tiroflan


Masculin Age : 34
Inscrit le : 14/02/2010
Messages : 796

[VX] Extension des zones. Empty
MessageSujet: [VX] Extension des zones.   [VX] Extension des zones. Icon_minitimeVen 18 Fév 2011 - 23:36

Voilà un script de mon cru qui permet, d'une part, de changer la forme des zones, d'autre part, de démarrer un event commun lorsqu'on entre/sort d'une zone.

Comment ça fonctionne : par mapping. Vous choisissez une zone à étendre, et vous lui attribuez une case du tile B, C, D ou E (sauf la première case du tile B bien sûr). Ensuite, sur l'éditeur de map, vous posez ce tile aux endroits où vous voulez prolonger votre map. Voilà, z'avez compris : ce script à un coût graphique d'une case de tileset par zone, sur une map. Par contre, les cases perdues peuvent être réutilisées pour d'autres zones sur des maps différentes ; mais si une map possède 5 zones différentes (et que vous voulez étendre), alors il vous faut 5 cases de libres.

[VX] Extension des zones. Captur23
Dans cette map, la zone est le rectangle clair, mais toutes les cases marquées d'un "A" (qui est un élément du tileE) font aussi partie de la zone.

Des exemples dans la démo qui suit : Démo

Configuration :

Code:
#  Un peu plus bas dans le script, vous tombez sur ceci :
#    AREA_MODIFIEES = {
#                      1 => ["E",1,1,2]  ,  <= Virgule obligatoire !
#                      2 => ["E",2,3,4]                                     
#                      }
#
# C'est à vous de remplir les lignes entre les accolades, selon ce template :
#
# ID_ZONE => ["Lettre du tileset", position dans le tileset, id de l'event commun d'entrée, id de l'event commun de sortie]
#
# Avec : 
#    => ID_ZONE : C'est l'id de la zone (noon?) Vous pouvez le trouver en ouvrant la fenêtre des proprietés de la zone.
#    => Lettre de tileset : "B", si la case d'extension utilisée est dans le tileB, "C", "D" ou "E" pour les autres tiles.
#          IMPORTANT : N'utilisez pas le tileA ! Ni la première case du tileB !
#    => Position dans le tileset : ici vous donnez le numéro de la case du tile que vous voulez utiliser.
#          Les numéros vont de 1 (case en haut à gauche du tileset) à 256 (en bas à droite) et se comptent par ligne.
#          Je le répète, la case "B1" ne doit pas être utilisée !!
#          Si vous de voulez pas étendre votre zone et la laisser sous forme de carré (mais pas de case nécessaire),
#            mettez 0 au numéro.
#    => Les id d'event communs d'entrée et de sortie : besoin de préciser ? entrée : quand vous entrez dans la zone,
#            sortie : quand vous sortez de la zone :o
#          Si vous voulez déclencher un processus parallèle, alors mettez son id à l'entrée et la sortie de la zone.
#          Pour les events automatiques, de toute façon vous devez les arrêter vous même, donc vous pouvez
#            en mettre 2 différents.
#    => Ne pas oublier de mettre une virgule derrière les crochets.
#          (Pas de virgule pour le dernier élément que vous rajoutez)
#
# Résumé : 52 => ["D",7,22,48] permet d'étendre la zone d'id 52 avec la 7ème case du tileD, de plus,
#  entrer dans la zone d'id 52 déclenchera l'event commun 22, et en sortir déclenchera le 48.
#                52 => ["D",7,30,30], où l'évènement commun 30 est un processus parallèle, permettra de déclencher et
#  d'arrêter cet évènement.                   
#
# NOTE : Si vous ne voulez pas déclencher d'évenements, rentrez 0 à l'endroit de leur numéro.
#
#

Et le script entier :

Code:
#-------------------------------------------------------------------------------------------------------------------------------------------------------------
# Script d'extension des zones par Tiroflan (18/02/2011)
#-------------------------------------------------------------------------------------------------------------------------------------------------------------
#
# Présentation.
#
# Un script qui permet de créer des zones non carrées en les rallongeant grâce à une case de tileset,
#  et qui donne aussi la possibilité d'enclencher un évènement commun lorsqu'on rentre ou sort d'une zone.
#
# Cette amélioration a cependant un coût : mettons que votre jeu possède une map contenant 7 zones étendues,
#  alors vous aurez besoin de 7 cases de tileset vides différentes, ce qui grignote un peu votre tileset.
# Ces cases sont réutilisables sur d'autres maps, cela dit. Si une map contient trois zones,
#  étendues grâce aux cases "E1", "E2" et "E3" (les trois premières cases du tileE), on peut réutiliser "E1", "E2" et "E3"
#  pour d'autres zones sur des maps différentes. 
# Ce script reste cependant plus recommandé aux jeux mappés en parallaxe.
#
# Le script aliase deux fonctions des scripts de base : la fonction in_area? et la fonction update de Game_Player.
# S'il est peu problable de trouver d'autres scripts modifiants in_area? , en revanche l'update pourrait être source
#  de problèmes d'incompatibilité.
#
#
#-------------------------------------------------------------------------------------------------------------------------------------------------------------
# Installation : à mettre simplement au-dessus du script 'Main'
#-------------------------------------------------------------------------------------------------------------------------------------------------------------
#
# Configuration : votre part de boulot <3
#
#  Un peu plus bas dans le script, vous tombez sur ceci :
#    AREA_MODIFIEES = {
#                      1 => ["E",1,1,2]  ,  <= Virgule obligatoire !
#                      2 => ["E",2,3,4]                                     
#                      }
#
# C'est à vous de remplir les lignes entre les accolades, selon ce template :
#
# ID_ZONE => ["Lettre du tileset", position dans le tileset, id de l'event commun d'entrée, id de l'event commun de sortie]
#
# Avec : 
#    => ID_ZONE : C'est l'id de la zone (noon?) Vous pouvez le trouver en ouvrant la fenêtre des proprietés de la zone.
#    => Lettre de tileset : "B", si la case d'extension utilisée est dans le tileB, "C", "D" ou "E" pour les autres tiles.
#          IMPORTANT : N'utilisez pas le tileA ! Ni la première case du tileB !
#    => Position dans le tileset : ici vous donnez le numéro de la case du tile que vous voulez utiliser.
#          Les numéros vont de 1 (case en haut à gauche du tileset) à 256 (en bas à droite) et se comptent par ligne.
#          Je le répète, la case "B1" ne doit pas être utilisée !!
#          Si vous de voulez pas étendre votre zone et la laisser sous forme de carré (mais pas de case nécessaire),
#            mettez 0 au numéro.
#    => Les id d'event communs d'entrée et de sortie : besoin de préciser ? entrée : quand vous entrez dans la zone,
#            sortie : quand vous sortez de la zone :o
#          Si vous voulez déclencher un processus parallèle, alors mettez son id à l'entrée et la sortie de la zone.
#          Pour les events automatiques, de toute façon vous devez les arrêter vous même, donc vous pouvez
#            en mettre 2 différents.
#    => Ne pas oublier de mettre une virgule derrière les crochets.
#          (Pas de virgule pour le dernier élément que vous rajoutez)
#
# Résumé : 52 => ["D",7,22,48] permet d'étendre la zone d'id 52 avec la 7ème case du tileD, de plus,
#  entrer dans la zone d'id 52 déclenchera l'event commun 22, et en sortir déclenchera le 48.
#                    52 => ["D",7,30,30], où l'évènement commun 30 est un processus parallèle, permettra de déclencher et
#  d'arrêter cet évènement.                   
#
# NOTE : Si vous ne voulez pas déclencher d'évenements, rentrez 0 à l'endroit de leur numéro.
#
#
#
module TIRO
  module AIRE
 # Paramètres : ID_ZONE => ["Lettre du tileset", position dans le tileset, id de l'event d'entrée, id de l'event de sortie]
   
    AREA_MODIFIEES = { #<= On laisse comme ça.
                      1 => ["E",1,1,2],
                      2 => ["E",2,5,5], 
                        3 =>["E",1,6,7],   
                        4 =>["E",0,6,7]
                      } #<= Pas toucher ;)
                     
# Fin de la configuration, la suite pour d'éventuels scripteurs !
#-------------------------------------------------------------------------------------------------------------------------------------------------------------
#
#
#
# La fonction indicatrice, qui me sert juste après. Si cette fonction existe déjà sous dans les RTP,
#  merci de me le faire savoir, je l'ai pas trouvée. Elle convertit  juste true en 1 et false en 0 ^^
  def indic(assertion)
    if assertion == true
      return 1
    else
      return 0
    end
  end
 
# On a besoin de convertir l'emplacement de tile, fourni sous la forme lettre+numéro, en l'id de ce tile.
# C'est ce que fait la fonction suivante.
  def Calcul_id_tile(lettre, numero)
      return -1 + (numero + 256*indic(lettre=="C") + 512*indic(lettre=="D") + 768*indic(lettre=="E"))*indic(numero>0)
    end # Note : si on met 0 au numéro, la fonction renvoie -1 : la zone n'a pas de case d'extension.
   
  end
end
#-------------------------------------------------------------------------------------------------------------------------------------------------------------

class Game_Player < Game_Character

  include TIRO::AIRE
 
  alias old_in_area in_area?
# La réecriture de in_area? permet d'inclure dans la zone les cases porteuses du tile précisé en configuration. 
  def in_area?(area)
      return false if area == nil
      return false if $game_map.map_id != area.map_id
      return true if (AREA_MODIFIEES[area.id] != nil && $game_map.data[@x,@y,2] == Calcul_id_tile(AREA_MODIFIEES[area.id ][0], AREA_MODIFIEES[area.id][1]))
    old_in_area(area)
  end
 
# La fonction suivante permet de savoir dans quelles zones on se situe.
# C'est nécessaire pour déclencher les évènements à l'entrée et à la sortie d'une zone.
  def which_areas
    aires_occupees = []
    for area in $data_areas.values
      if in_area?(area) == true
        aires_occupees += [area.id]
      end
    end
    if aires_occupees.empty?
      return nil
    else     
      return aires_occupees
    end
end
 
# Voilà la fonction qui gère le changement de zone en terme de déclenchement d'event.
  def chgt_aires(aires_avant_mouvement,aires_apres_mouvement)
    if (aires_avant_mouvement != nil && aires_apres_mouvement != nil) 
        aires_communes = aires_avant_mouvement & aires_apres_mouvement
            aires_avant_mouvement = aires_avant_mouvement - aires_communes
            aires_apres_mouvement = aires_apres_mouvement - aires_communes
    end
    if (aires_avant_mouvement != aires_apres_mouvement)
        if aires_avant_mouvement != nil
            for aire in aires_avant_mouvement
                if AREA_MODIFIEES[aire] != nil 
                    if $data_common_events[AREA_MODIFIEES[aire][3]].trigger == 0
                        $game_temp.common_event_id = AREA_MODIFIEES[aire][3]
                    else
                        switch = $data_common_events[AREA_MODIFIEES[aire][3]].switch_id
                        $game_switches[switch] = false
                        $game_map.refresh #Nécessaire pour actualiser l'arrêt d'un processus parallèle.
                    end
                end
            end
        end
        if aires_apres_mouvement != nil
            for aire in aires_apres_mouvement
                if AREA_MODIFIEES[aire] != nil
                    if $data_common_events[AREA_MODIFIEES[aire][2]].trigger == 0
                        $game_temp.common_event_id = AREA_MODIFIEES[aire][2]
                    else
                        switch = $data_common_events[AREA_MODIFIEES[aire][2]].switch_id
                        $game_switches[switch] = true
                        $game_map.refresh #Idem qu'au dessus pour le démarrage d'un processus parallèle/automatique.
                    end
                end
            end
        end
    end
  end
 
  alias old_update update
 
  def update
      aires_avant_mouvement = which_areas
    old_update
      aires_apres_mouvement = which_areas
    chgt_aires(aires_avant_mouvement,aires_apres_mouvement)
  end
end


Des applications possibles :

[VX] Extension des zones. 1120170421755_hh
Hautes herbes irrégulières.

[VX] Extension des zones. 0
Gestion du surf/de la pêche façon pokemon.

Voilà voilà, enjoy !


Dernière édition par Tiroflan le Lun 21 Fév 2011 - 10:17, édité 1 fois
Revenir en haut Aller en bas
BARVACHE
Vache Folle
Vache Folle
BARVACHE


Masculin Age : 29
Inscrit le : 22/05/2010
Messages : 3005

[VX] Extension des zones. Empty
MessageSujet: Re: [VX] Extension des zones.   [VX] Extension des zones. Icon_minitimeSam 19 Fév 2011 - 16:35

Hey, mais c'est vachement interessant!
Merci du partage=D
Revenir en haut Aller en bas
Zangther
Maître des Duels
Maître des Duels
Zangther


Masculin Age : 32
Inscrit le : 29/07/2009
Messages : 7841

[VX] Extension des zones. Empty
MessageSujet: Re: [VX] Extension des zones.   [VX] Extension des zones. Icon_minitimeDim 20 Fév 2011 - 10:42

C'est sympa, le script à l'air bien organisé et l'idée originale.

J'aurais peut être pas l'occasion de le tester mais c'est du beau boulot, bravo ^^
Revenir en haut Aller en bas
Garruk
Aventurier Lv.16
Aventurier Lv.16
Garruk


Age : 40
Inscrit le : 03/09/2009
Messages : 1503

[VX] Extension des zones. Empty
MessageSujet: Re: [VX] Extension des zones.   [VX] Extension des zones. Icon_minitimeDim 20 Fév 2011 - 22:07

Ça m'a l'air pas mal tout ça, pour le moment je n'en ai pas trop besoin, mais il y a des chance qui finisse dans mon projet, bon boulot.
Revenir en haut Aller en bas
Tiroflan
Illusionniste Lv.12
Illusionniste Lv.12
Tiroflan


Masculin Age : 34
Inscrit le : 14/02/2010
Messages : 796

[VX] Extension des zones. Empty
MessageSujet: Re: [VX] Extension des zones.   [VX] Extension des zones. Icon_minitimeLun 21 Fév 2011 - 10:26

Merci des com's.

J'ai mis à jour le code, on peut désormais activer directement des évènements en processus parallèle et automatiques, dans le cas d'un processus parallèle, vous devez mettre son id en entrée ET en sortie de zone ; D'autre part, le code gère maintenant en théorie les superpositions de zones, même s'il me reste un petit problème bizarre à résoudre là-dessus.
Revenir en haut Aller en bas
Contenu sponsorisé




[VX] Extension des zones. Empty
MessageSujet: Re: [VX] Extension des zones.   [VX] Extension des zones. Icon_minitime

Revenir en haut Aller en bas
 

[VX] Extension des zones.

Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1

 Sujets similaires

-
» Windows Vista interface
» Systeme d'extension de jeux [resolu]
» Zones de combats
» Meilleure configuration des zones sur une map
» [Event Extender] Distances et zones

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
RPG Maker VX :: Entraide :: Scripts :: Scripts VX - RGSS2 :: Utilitaires-
Créer un forum | ©phpBB | Forum gratuit d'entraide | Signaler un abus | Cookies | Forum gratuit | Informatique et Internet | Informatique et électronique