[PSP] Le Script du "Follow Me" dans Club | Pokémon Trash
[PSP] Le Script du "Follow Me"
Flower// - 7 août 2011 à 19:35
Bonjour chers nouveaux dans l'univers de Pokémon Script Project.
Attention! Ceci n'est en aucun cas un tuto pour le ROM-Hacking, mais pour RPG Maker.
Bien, aujourd'hui je vais vous apprendre à ajouter le script du Follow Me, en français, suis-moi. Vous l'aurez deviné, ce script permet de faire suivre derrière vous le premier Pokémon de votre équipe, comme dans HG/SS.
Mais tout d'abord, je dois vous apprendre à ajouter un script.
Pour commencer, ouvrez le PSP Mod, puis, ouvrez votre projet PSP.
Cliquez ensuite sur l'éditeur de script ici:
Ici sont rangés TOUS les scripts du jeu. Le côté programmation est là. Tout est codé en "rgss", une forme de "ruby" simplifié. C'est un langage de programmation simple, vous pourrez trouver sur le net des cours pour apprendre le ruby.
Bref, dans la liste de gauche sont rangés les scripts, il suffit de cliquer sur l'un de ceux-ci pour qu'il apparaisse à droite. Pour créer un nouveau script faîtes clique droit sur la liste, puis "nouveau script". Vous n'avez plus qu'à ajouter votre script.
Bien, vous avez tout compris? On va enfin pouvoir ajouter le follow me.
Ajoutez un nouveau script et collez le code que je vais vous donner. Nous remercierons fort Brendan75 de PSP pour ce script fabuleux.
[spoiler]
#==============================================================================# ■ Follow Me Pokémon# par Brendan75#-----------------------------------------------------------------------------# Rend le premier pokémon de l'équipe visible sur la map.#==============================================================================PKM_TRANSPARENT_SWITCHES = 50 # Index de l'interrupteur pour rendre invisibleclass Follower_Pkm < Game_Character
include POKEMON_S
def initialize
super()
@through = false
@step_anime = true
@pkm_id = 0
end
def update
if $pokemon_party.size != 0
@pkm_id = $pokemon_party.actors[0].id
string = "pkm #\{sprintf('%03d', @pkm_id)\}.png"
if @character_name != string
@character_name = string
@character_hue = 0
@opacity = 255
@blend_type = 0
end
if @opacity != ($game_switches[PKM_TRANSPARENT_SWITCHES] ? 0 : 255)
Nommez le script "Follow Me", et c'est dans la poche!
Mais le Follow Me a besoin de ressources pour fonctionner, bien sûr, l'image du Pokémon qui va suivre. Vous devez placer ces images dans le dossier "Characters". L'image doit avoir CETTE morphologie et pas une autre. [spoiler][/spoiler]
Vous devez aussi nommer les images de cette manière: "Pkm [ID].png" (par exemple "Pkm 001.png" pour Bulbizarre et ainsi de suite).
Voilà, vous savez désormais ajouter un script et je vous ai donné le secret du Follow me!
zekrom30 - 7 août 2011 à 19:43
Le côté programmation du est là.
Il manque pas le mot jeu par hasard?
Oussam1999 - 7 août 2011 à 19:48
T'as vraiment envie d'ouvrir une section RPGMXP
Latibro - 7 août 2011 à 19:50
Ah bien ce script et perso je serais pas contre une section RPGM aussi xD
The New Azerty - 7 août 2011 à 20:22
Super ! J'ai hate de m'y mettre. :D
ervan27 - 7 août 2011 à 21:55
Bon tuto
Flower// - 7 août 2011 à 21:57
T'as vraiment envie d'ouvrir une section RPGMXP
Oui, pour avoir une nouvelle section il faut du contenu, et ben va en avoir du contenu!
Nab - 8 août 2011 à 11:18
Ce serais énorme de coupler ce script avec un autre pour connaître l'humeur de pokémon. :you:
Ca n'a pas l'air bien compliqué
Flower// - 8 août 2011 à 11:37
Oulaaa! C'est difficile ce que tu demande. Il faudrait créer une nouvelle valeur qu'on appellerait "humeur" qui augmenterais selon certaines conditions et la faire afficher via son Pokémon.
vinc2612 - 8 août 2011 à 11:48
Elle existe pas déjà ? Pour les pokémons évoluant s'ils sont heureux ?
Flower// - 8 août 2011 à 12:01
Si, ça me revient! On peut utiliser la loyauté et l'adapter au bonheur pour les évolutions des Pokémon de cette manière.
Si je te retrouve le code je te le passe.
Nab - 8 août 2011 à 12:12
[spoiler=J'avais écrit un pavé mais il sert plus à rien maintenant :(]@Vinc': Non je parle de faire un système comme dans les remakes de Or et Argent, on 'parle avec notre pokémon, il affiche un émoticône selon l'humeur.
@Flow': Je suis pas sûr du tout mais il me semble que dans HG/SS, l'humeur du pokémon dépendait de ses PV et de sa statistique de bonheur ainsi que son statut si il est altéré et du nombre de pas.
La valeur humeur peut avoir 6 valeurs différentes avec une sorte de graduation allant de 0 à 5 et la 6ème n'est utilisé que si le pokémon est empoisonné et l'humeur sur l'échelle de 0 à 5 se calcule en ajoutant 1 par par conditions valides. Par exemple si tu a parcouru plus de 255 pas avec se pokémon, l'humeur augmente de 1, si ses PV sont au dessus de la moitié maximale, +1, bonheur au dessus de 127, +1, pokémon paralysé, brûlé, givré, endormi, -1, et empoisonné serait la valeur spéciale.
Voilà en gros ce que ça serai, le plus dur étant d'afficher l'emote et d'afficher un texte puis de revenir au jeu normalement.[/spoiler]
J'ai pas besoin du code, mais si tu le trouve tu pourras faire un autre tuto pour la future section
Flower// - 8 août 2011 à 12:43
Je ferais tout ce qui est dans mon possible pour que cette section naisse. Si vous êtes prêts à l'animer et à vous mettre a PSP, j'aurais les arguments pour créer une nouvelle section.
Nab - 9 août 2011 à 20:13
Faudrais peut-être un sondage, non ?
Car j'ai aucune idée de combien de personnes veulent utiliser PSP pour leurs projets :/
yago58 - 9 août 2011 à 20:24
Non, c'est inutile, sinon ça va être le cirque.
Toon - 10 août 2011 à 01:32
Moi je peux m'y mettre, il faut que je prenne le temps de lire les tuto de Flow' un jour c'est tout, car ça a l'air très intéressant à mes yeux, je suis pour cette section, & gg à toi Flow'.
Flower// - 10 août 2011 à 08:24
Thanks Rafale.
pikachu5000 - 18 août 2011 à 17:46
voici tous les pokemon a mettre dans le dossier Characters: Ici et pour ne le renommer remplacer le script par celui-ci:
[spoiler]
#==============================================================================# ■ Follow Me Pokémon# par Brendan75#-----------------------------------------------------------------------------# Rend le premier pokémon de l'équipe visible sur la map.#==============================================================================PKM_TRANSPARENT_SWITCHES = 50 # Index de l'interrupteur pour rendre invisibleclass Follower_Pkm < Game_Character include POKEMON_S def initialize super() @through = false @step_anime = true @pkm_id = 0 @shiney = false end def update if $pokemon_party.size != 0 @pkm_id = $pokemon_party.actors[0].id @shiney = $pokemon_party.actors[0].shiny if @shiney string = "#\{sprintf('%03d', @pkm_id)\}s_0.png" else string = "#\{sprintf('%03d', @pkm_id)\}_0.png" end if @character_name != string @character_name = string @character_hue = 0 @opacity = 255 @blend_type = 0 end else @character_name = "" end super end def check_event_trigger_touch(x, y) end def passable?(x, y, d) new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0) new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0) unless $game_map.valid?(new_x, new_y) return false end if @through return true end unless $game_map.passable?(x, y, d, self) return false end unless $game_map.passable?(new_x, new_y, 10 - d) return false end for event in $game_map.events.values if event.x == new_x and event.y == new_y unless event.through if self != $game_player return false end if event.character_name != "" return false end end end end return true endend#-----------------------------------------------------------------------------# ● Spriteset Map#-----------------------------------------------------------------------------class Spriteset_Map alias follow_me_initialize initialize def initialize follow_me_initialize @character_sprites.push(Sprite_Character.new(@viewport1, $game_party.follower_pkm)) update endend#-----------------------------------------------------------------------------# ● Scene Map#-----------------------------------------------------------------------------class Scene_Map alias follow_me_transfer_player transfer_player def transfer_player $game_party.erase_moves follow_me_transfer_player end alias follow_me_update update def update follow_me_update $game_party.follower_pkm.update endend#-----------------------------------------------------------------------------# ● Game Player#-----------------------------------------------------------------------------class Game_Player alias follow_me_moveto moveto def moveto(x, y) follow_me_moveto(x, y) $game_party.follower_pkm.moveto(x, y) end def move_down(turn_enabled = true) if passable?(@x, @y, 2) $game_party.move_party_actors $game_party.add_move_list(Input::DOWN, turn_enabled) end super(turn_enabled) end def move_left(turn_enabled = true) if passable?(@x, @y, 4) $game_party.move_party_actors $game_party.add_move_list(Input::LEFT, turn_enabled) end super(turn_enabled) end def move_right(turn_enabled = true) if passable?(@x, @y, 6) $game_party.move_party_actors $game_party.add_move_list(Input::RIGHT, turn_enabled) end super(turn_enabled) end def move_up(turn_enabled = true) if passable?(@x, @y, 8) $game_party.move_party_actors $game_party.add_move_list(Input::UP, turn_enabled) end super(turn_enabled) endend#-----------------------------------------------------------------------------# ● Game Party#-----------------------------------------------------------------------------class Game_Party include POKEMON_S attr_accessor :follower_pkm alias follow_me_initialize initialize def initialize follow_me_initialize @follower_pkm = Follower_Pkm.new @next_move = nil end def move_party_actors case @next_move.type when Input::DOWN @follower_pkm.move_down(@next_move.turn_enabled) when Input::LEFT @follower_pkm.move_left(@next_move.turn_enabled) when Input::RIGHT @follower_pkm.move_right(@next_move.turn_enabled) when Input::UP @follower_pkm.move_up(@next_move.turn_enabled) else return end erase_moves end def add_move_list(type, turn_enabled) @next_move = Move_List_Element.new(type, turn_enabled) end def erase_moves @next_move = nil endend#-----------------------------------------------------------------------------# ● Move List Element#-----------------------------------------------------------------------------class Move_List_Element attr_reader :type attr_reader :turn_enabled def initialize(type, turn_enabled) @type = type @turn_enabled = turn_enabled endend
[/spoiler]ca prendra aussi les brillants(comme moi lol)en compte.
Flower// - 20 août 2011 à 07:05
Le lien est mort... Et tu n'explique pas comment il faut nommer les images des shineys pour que le script en prenne compte.
Salut les pokéfans, je sais que ce forum est assez vieux, mais, je me demandais, dans les images : "pkm [ID].png" comment fait-on quand le pokémon a des différences mâles/femmelle comme Florizarre, ou quand il a plusieurs formes comme Arceus et/ou quand il est shiny ? ??? ??? ??? Je pose cette question car moi, c'est toujours la première forme qui apparaît, quelque sois son genre, sa forme ou son "chromatisme" !!! >:( >:( >:(
Alki - 14 octobre 2014 à 17:49
Mec tu viens de faire un up de 3 ans.
Nuri Yuri - 14 octobre 2014 à 19:32
@WilliX719 : Le script la n'est pas terrible ce pourquoi tu n'as pas la distinction mâle/femelle et chromatique ou non.
Pour le mâle femelle ça va être très compliqué sachant que certains chara n'ont pas été fait pour les femelles (détails trop minimes), pour les chromatiques :
Supprimer les anciens chara des Pokémon et coller les charas de ce pack dans ton dossier Characters (Fais attention à tes évents, si tu as déjà utilisé les anciens chara tu auras des problèmes)
Modifier la ligne :
string = "pkm #{sprintf('%03d', @pkm_id)}.png"
en
string = $pokemon_party.actors[0].shiny ? "#{sprintf('%03ds_%d', @pkm_id,$pokemon_party.actors[0].form)}.png" : "#{sprintf('%03d_%d', @pkm_id,$pokemon_party.actors[0].form)}.png"
Je te conseille vivement de t'intéresser à la programmation en Ruby et à l'utilisation des classes du RGSS (différents "tutos" que j'ai rédigé) si tu veux intégrer des systèmes comme ça car ils ne feront jamais exactement ce que tu veux et tu devras toujours modifier une ligne. (Donc faut être armé sinon ton projet n'avancera pas énormément et compte pas sur les autres pour qu'ils t'aident éternellement.)
WilliX719 - 14 octobre 2014 à 22:51
@Yuri Nuri Même si cette question est un petit peu conne, je la pose, dans le pack de ressources, je ne dois télécharger que les caractères des pokémon, on est d'accord ? Parce que je ne suis pas sûr et je n'aurais pas envie de me tromper
Nuri Yuri - 14 octobre 2014 à 23:05
Oui juste les Pokémon. Après si tu veux plus de chara, pioche dans le reste tu trouveras certainement des choses intéressantes :p (Fais gaffe à l'harmonie entre les styles.)
WilliX719 - 14 octobre 2014 à 23:11
Ok ! Ben merci beaucoup !!! B)
rhenaud33 - 15 novembre 2014 à 01:43
Tant qu'on en est à relancer le sujet, moi aussi j'ai un petit problème : lorsque je lance mon jeu, ils me disent mot pour mot :
Script 'Follow Me' line 11 : NameError occured.
uninitialized constant Follower_Pkm::POKEMON_S
Cela m'indique que la variable Follower_Pkm n'est pas initialisée, mais quelle valeur est-ce que je dois mettre dans cette future variable ? (Disons que je pensais que ce serait inclus dans l'onglet "variable" mais ça n'en a pas l'air... ^^' Eh oui j'ai fait des tests avant de poser la question moi monsieur ! :p Et heureusement d'ailleurs...)
Bref merci de m'aider ! ^^
Nuri Yuri - 15 novembre 2014 à 11:04
Faut installer le script avant MAIN et pas avant Config Pannel.
L'ordre d'arrivée des scripts est très important car tu vois, ruby n'est pas omniscient et les scripts sont évalués les uns après les autres donc si tu met un script dépendant d'un autre script avant le script dont il dépend ça va pas trop marcher. Après les dépendances sont de plusieurs natures :
Les dépendances immédiates et les dépendances futures, dans les dépendances immédiates ont a :
class Machin < Truc
Si Truc n'existe pas ça ne va pas fonctionner, un enfant ne peut pas être conçu sur la mère n'existe pas (cf tous les bordel de paradoxe temporel Hollywoodiens)
include Truc
De même, ici tu demande à ce que les fonctions et constantes de Truc soient importés dans la classe/script, si Truc n'existe pas, Ruby ne pourra pas importer grand choses (c'est comme avoir besoins de ton livre de maths mais tu n'as pas encore acheté ce dit livre).
Les dépendances immédiates le sont car Ruby va chercher ce qu'il faut au moment où il voit ces choses, après il y a les dépendances futures :
variable= POKEMON_S::Pokemon.new(...)
Dans ce cas là, Ruby inscrit juste dans le corps de la fonction qu'il faudra aller chercher la constante POKEMON_S puis chercher la constante Pokemon dans la constante POKEMON_S. Si l'une des deux n'existent pas au moment où Ruby exécute les instructions de recherche, ça marche pas, cela dit à la compilation ça passe crème et heureusement car ça serait assez chiant si t'as des scripts dépendant entre eux dans les deux sens.
Donc, l'endroit où t'as mis ton Follow_Me et ça devrait être bon je pense :p
rhenaud33 - 15 novembre 2014 à 12:47
Owi, ça marche ! :3 Je vais pouvoir continuer ! Merci beaucoup ^^ (Je m'y connais pas énormément en Ruby mais bon... va falloir que j'approfondisse mes connaissances :p)
rhenaud33 - 19 novembre 2014 à 23:11
Désolé du double post, mais est-ce que c'est normal que le pokémon qui me suit ne puisse pas traverser mes events (et donc peut être dissocié du Dresseur) ? Par exemple lorsque je reçois mon Pokémon celui-ci commence avant l'event qui le bloque, c'est-à-dire à l'autre côté de ma map ?
Nuri Yuri - 20 novembre 2014 à 13:28
Oui, totalement normal. Les événements dans RPG Maker ne peuvent pas entrer en collision à moins d'avoir été téléporté les uns sur les autres ou d'être traversables du coup ton Pokémon se retrouve bloqué derrière les évents de blocage.
T'as deux solutions :
Ne pas utiliser d'évents physique pour bloquer le personnage. (En utilisant les positions du héros tu peux l'interdire d'aller à un endroit ou un autre.)
Téléporter les évents de blocage ailleurs quand ils ont fait leur travail.
rhenaud33 - 20 novembre 2014 à 17:31
C'est ce que je pensais. Dans ce cas faudra que je reparamètre mes events pour que la branche "Conditional" se déclenche lorsque mon dresseur sera à une certaine position... (je sais je suis pas compréhensible même moi je me conprends pas xD) ça pourrait se faire. Merci, j'avais pas vu cette option.
Au fait, en parlant de projet, le tien (c'est-à-dire Pokémon Orbe Doré) avance ? J'ai entendu dire que tu étais sur plusieurs projets en même temps. (Je sais je tombe sur du HS là... mais ton projet m'intéresse. :winner: )
Nuri Yuri - 20 novembre 2014 à 18:34
POD fait du stationnaire, priorité à Pokémon SDK et Pokémon Gemme ^^'
Pour les positions tu verras c'est pas trop dur et ça peut être utilisé pour gérer les téléportations d'une map à l'autre sans avoir à créer des tonnes d'évents qu'il faut modifier :p
rhenaud33 - 21 novembre 2014 à 23:12
Ouais, ça pourrait se faire. Juste besoin de mettre plein de conditional branchs ^^ et ok pour ton projet, faudra que je regarde les deux autres alors pour voir l'avancement de ces deux autres projets (et surtout) quelles sont les raisons qui mettent ces jeux en avant par rapport à un RPG Pokémon classique.
Le pb avec moi c'est que j'ai plein d'idées mais j'ai du mal à les mettre en place ^^" (même la nuit je rêve de nouvelles idées le premier jour de codage j'ai fait nuit blanche à cause de l'afflux d'idées dans ma tête : c'était un lundi... ouch xD)
Mais pour ce que je veux faire va ABSOLUMENT falloir me pencher sur le RGSS car je vais pas m'appuyer tout le temps sur les autres, faut que l'oisillon prenne son envol :p Et avec mes idées viennent des propositions de scripts à mettre, mais c'est fou ET c'est en langage Algobox (if, while etc :p) étant donné que mes cours actuels d'ISN sont là-dessus et sur jvs, donc je pense comme ceci, et la retranscription en RGSS me semble dure.
Nuri Yuri - 22 novembre 2014 à 00:08
Pas tant que ça quand tu connais le langage.
Faudra peut être que je fasse deux trois tutoriels là dessus :d (Par contre, si tu veux bien faudrait qu'on continue la conversation dans un autre sujet que celui-ci. http://www.pokemontrash.com/club/rpg-maker/cafe-des-rpg-makers/ )
loucaz - 15 août 2017 à 23:25
Salut je débute et j'ai besoin d'aide, mon script "follow me" fonctionne parfaitement mais j'ai soucis quand mon personnage cour (grâce a un autre script) mon pokemon le suis mais avec du retard car ils n'ont pas la même vitesse de mouvement. Je connais donc le problème mais ne sachant pas comment modifier mon script follow me pour qu'il ai la même vitesse que mon personnage. Merci de votre aide.
Nuri Yuri - 16 août 2017 à 16:49
Le mieux est d'utiliser un évènement commun pour modifier la vitesse du héros, ainsi la vitesse se propagera au follower sauf si ce script est vraiment mal conçu.
loucaz - 16 août 2017 à 22:23
J'ai tester avec un évènement commun et cela ne marche pas non plus , le script qui "est vraiment mal conçu" est celui de ce tuto. Le problème viens ce script ??
Nuri Yuri - 16 août 2017 à 23:59
Je pense ^^'
loucaz - 17 août 2017 à 16:09
voici mon script , jai repris celui de pikachu5000
j'aimerai que se pokemon ai la meme vitesse que le hero..
voici tous les pokemon a mettre dans le dossier Characters: Ici et pour ne le renommer remplacer le script par celui-ci:
[spoiler]
#==============================================================================# ■ Follow Me Pokémon# par Brendan75#-----------------------------------------------------------------------------# Rend le premier pokémon de l'équipe visible sur la map.#==============================================================================PKM_TRANSPARENT_SWITCHES = 50 # Index de l'interrupteur pour rendre invisibleclass Follower_Pkm < Game_Character include POKEMON_S def initialize super() @through = false @step_anime = true @pkm_id = 0 @shiney = false end def update if $pokemon_party.size != 0 @pkm_id = $pokemon_party.actors[0].id @shiney = $pokemon_party.actors[0].shiny if @shiney string = "#\{sprintf('%03d', @pkm_id)\}s_0.png" else string = "#\{sprintf('%03d', @pkm_id)\}_0.png" end if @character_name != string @character_name = string @character_hue = 0 @opacity = 255 @blend_type = 0 end else @character_name = "" end super end def check_event_trigger_touch(x, y) end def passable?(x, y, d) new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0) new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0) unless $game_map.valid?(new_x, new_y) return false end if @through return true end unless $game_map.passable?(x, y, d, self) return false end unless $game_map.passable?(new_x, new_y, 10 - d) return false end for event in $game_map.events.values if event.x == new_x and event.y == new_y unless event.through if self != $game_player return false end if event.character_name != "" return false end end end end return true endend#-----------------------------------------------------------------------------# ● Spriteset Map#-----------------------------------------------------------------------------class Spriteset_Map alias follow_me_initialize initialize def initialize follow_me_initialize @character_sprites.push(Sprite_Character.new(@viewport1, $game_party.follower_pkm)) update endend#-----------------------------------------------------------------------------# ● Scene Map#-----------------------------------------------------------------------------class Scene_Map alias follow_me_transfer_player transfer_player def transfer_player $game_party.erase_moves follow_me_transfer_player end alias follow_me_update update def update follow_me_update $game_party.follower_pkm.update endend#-----------------------------------------------------------------------------# ● Game Player#-----------------------------------------------------------------------------class Game_Player alias follow_me_moveto moveto def moveto(x, y) follow_me_moveto(x, y) $game_party.follower_pkm.moveto(x, y) end def move_down(turn_enabled = true) if passable?(@x, @y, 2) $game_party.move_party_actors $game_party.add_move_list(Input::DOWN, turn_enabled) end super(turn_enabled) end def move_left(turn_enabled = true) if passable?(@x, @y, 4) $game_party.move_party_actors $game_party.add_move_list(Input::LEFT, turn_enabled) end super(turn_enabled) end def move_right(turn_enabled = true) if passable?(@x, @y, 6) $game_party.move_party_actors $game_party.add_move_list(Input::RIGHT, turn_enabled) end super(turn_enabled) end def move_up(turn_enabled = true) if passable?(@x, @y, 8) $game_party.move_party_actors $game_party.add_move_list(Input::UP, turn_enabled) end super(turn_enabled) endend#-----------------------------------------------------------------------------# ● Game Party#-----------------------------------------------------------------------------class Game_Party include POKEMON_S attr_accessor :follower_pkm alias follow_me_initialize initialize def initialize follow_me_initialize @follower_pkm = Follower_Pkm.new @next_move = nil end def move_party_actors case @next_move.type when Input::DOWN @follower_pkm.move_down(@next_move.turn_enabled) when Input::LEFT @follower_pkm.move_left(@next_move.turn_enabled) when Input::RIGHT @follower_pkm.move_right(@next_move.turn_enabled) when Input::UP @follower_pkm.move_up(@next_move.turn_enabled) else return end erase_moves end def add_move_list(type, turn_enabled) @next_move = Move_List_Element.new(type, turn_enabled) end def erase_moves @next_move = nil endend#-----------------------------------------------------------------------------# ● Move List Element#-----------------------------------------------------------------------------class Move_List_Element attr_reader :type attr_reader :turn_enabled def initialize(type, turn_enabled) @type = type @turn_enabled = turn_enabled endend
[/spoiler]ca prendra aussi les brillants(comme moi lol)en compte.