Illusionniste Lv.12
Age : 34 Inscrit le : 14/02/2010 Messages : 796
| Sujet: [VX] Extension des zones. Ven 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. 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 : Hautes herbes irrégulières. 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 |
|
Vache Folle
Age : 29 Inscrit le : 22/05/2010 Messages : 3005
| Sujet: Re: [VX] Extension des zones. Sam 19 Fév 2011 - 16:35 | |
| Hey, mais c'est vachement interessant! Merci du partage=D |
|
Maître des Duels
Age : 32 Inscrit le : 29/07/2009 Messages : 7841
| Sujet: Re: [VX] Extension des zones. Dim 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 ^^ |
|
Aventurier Lv.16
Age : 40 Inscrit le : 03/09/2009 Messages : 1503
| Sujet: Re: [VX] Extension des zones. Dim 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. |
|
Illusionniste Lv.12
Age : 34 Inscrit le : 14/02/2010 Messages : 796
| Sujet: Re: [VX] Extension des zones. Lun 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.
|
|