Créer un évènement mais durant le jeu
But : Il est très facile de créer un évènement avec RPG Maker mais plus difficile de le faire durant le jeu. Ce tutorial expliquera comment le faire en RGSS. Ce système peut être intéressant pour un jeu où on peut créer des objets à l'infini sur une carte (construction d'une ville par exemple) ou pour autre chose ... :)
Avant tout :
- Connaitre les bases du Ruby
- Avoir la documentation RGSS
1) Evènement déjà créé or not ?
Doit on créé entièrement l'évènement comme lorsque vous le faites dans RPG Maker ou non ? La réponse est non :)
En fait, l'évènement vous le créez déjà ... mais pas sur une carte à part où le héros n'ira jamais dessus ! Cette carte servira seulement à copier l'évènement et à le mettre sur la carte que vous souhaitez. Ainsi vous pouvez créer le même évènement à l'infini tout en changeant des caractéristiques si vous le souhaitez.
Mais, n'ayez crainte ! car le RGSS
fait déjà tout pour vous ! En effet, pour créer un évènement, il suffit d'utiliser le code magique suivant :Facile, n'est ce pas ? Enfin, c'est surtout les paramètres le plus difficle à définir :
ID_Map => Le numéro de la Map où l'évènement sera
Event => Caractéristiques de l'évènement de type RPG::Event
Bref, savoir l'ID de la map, ça sera très simple, il suffira d'utiliser la variable "$game_map.map_id" mais le paramètre "Event" sera le plus gros morceau.
2) Le script
Nous avons vu seulement les grandes lignes mais maintenant soyons plus précis et créons le petit script pour la création d'évènement. Nous allons faire une classe nommé "Create_Event" avec les méthodes suivantes :
- initialize
- create : Création de l'évènement
- search_new_id : pour chercher un nouvel ID
Voici la structure :
La constante MAP_ID_EVENT sera l'ID de la carte où il y a l'évènement déjà créé à copier.
a) La méthode "initialize"
Nous allons prendre toutes les données de la carte n°1 (donc de MAP_ID_EVENT). Dit "toutes les données" dit "les données des évènements" :
@map est du type "RPG::Map". Regardez dans la documentation, vous verrez que la méthode "events" permet de prendre la liste des évènements de cette carte.
@events est donc cette liste, plus précisément un Hash
contenant une clé, qui est l'ID de l'évènement, et d'une valeur qui est le type "RPG::Event".Et oui !! La valeur est du type "RPG::Event", c'est ce qui nous faut pour le paramètre de "Game_Event" pour la création d'évènement !
@event_id est l'ID de l'évènement quand on appellera la classe "Create_Event".
Enfin, sans plus attendre, on appelle la prochaine méthode "create" pour commencer à créer l'évènement.
b) La méthode "create"
La méthode "create" est intéressante car vous pouvez l'optimiser comme par exemple changer les caractéristiques de l'évènement. Ici, nous allons changer ses positions.
Note : Les positions par défaut sont évidemment celles de l'évènement dans la map MAP_ID_EVENT
Pour savoir tout les propriétés que vous pouvez faire à l'évènement, regardez la documentation à "RPG::Event"
Problème : Et si l'ID de l'évènement créé est le même qu'un évènement sur la carte ?
Bien vu ! Oui, on peut avoir deux fois le même ID. Par exemple, si vous avez un évènement d'ID 1 sur la carte et que vous créez un évènement qui lui aussi à l'ID 1, ça causera un problème ...^^'
Evidemment, il faut chercher un nouvel ID. Pour cela, on va appeler la méthode "search_new_id" qui donnera un nouvel ID à notre évènement (on créera cette méthode après) :
On créé donc maintenant notre évènement :
Nous allons créer la méthode "search_new_id" pour donner un nouvel ID. Attention ! La méthode "create" n'est pas fini.
c) La méthode "search_new_id"
Le principe est simple, nous allons incrémenter une variable qu'on nommera "id". On regardera si "id", ID de l'évènement, est présent dans la liste des évènement de la carte. Dès qu'on trouve un ID qui n'est pas dans cette liste donc libre, on retourne "id".
La méthode :
"$game_map.events" est une liste (ou Hash) des évènement de la carte en cours. "include?" permet de vérifier si la "id" est présente dans cette liste.
d) Ajouter l'évènement dans la liste des évènements de la carte actuelle
Continuons la méthode "create". Après avoir créé l'évènement, on va l'ajouter dans la liste des évènements de la carte actuelle. Pour cela, le code est le suivant :
On ajoute dans la liste, l'objet "@create" comme valeur et "event.id", l'ID de l'évènement comme clé.
Attention : Ce n'est pas "event_id" mais "event.id". En effet, "event_id" est l'évènement avec l'ID de cette variable qu'on a copié alors que "event.id" est le nouveau ID.
La méthode n'est pas fini, nous allons d'abord aller dans un autre script pour afficher le nouveau évènement sur la carte.
3) Le montrer sur la carte
a) Le Sprite
Oui, on ajouté virtuellement un nouvel évènement mais pas visuellement. Pour cela, il faut ajouter un Sprite. Il existe un tableau dans le script "Spriteset_Map" nommé "@character_sprites" contenant tout les évènements et le héros. La seule chose à faire et de rajouter dans ce tableau notre évènement. Allons dans le script "Spriteset_Map" et créeon une nouvelle méthode :
Ainsi, on ajoute un sprite avec "Sprite_Character.new(@viewport1, $game_map.events[event_id]" où
- @viewport1 est la partie sur l'écran où notre évènement sera visible (ici, tout l'écran)
- $game_map.events[event_id] : Notre évènement à ajouter
On ajoute à la fin du tableau "@character_sprites" avec "push"
b) Ajouter le Sprite via "Scene_Map"
Maintenant, il faut appeler cette méthode. Le script "Scene_Map" propose déjà une variable lors de l'initialisation nommé @spriteset. Il suffit de l'utiliser pour ajouter notre évènement. Nous allons le faire dans la méthode "update" car, comme cela, notre évènement sera affiché automatiquement mais attention ! il faut le faire qu'une fois alors que la méthode "update" est appelé en boucle.
Nous allons alors créer deux variables :
- Une pour signaler qu'on ajoute un nouvel évènement
- Une pour savoir quel est l'ID de l'évènement à ajouter.
Ces deux variables, globales, seront initialisés dans le script "Game_Temp" :
A mettre à la suite des autres attributs et dans la méthode "initialize" :
Revenons le script "Scene_Map". Nous allons mettre dans la méthode "update" donc :
Ainsi, on ajoute l'évènement et de suite, on met "$game_temp.add_event" à false pour indiquer qu'on a fini d'ajouter et qu'on n'ajoutera plus pour le moment.
c) Ajouter le Sprite quand on le créer
Revenons pour la dernière fois dans la méthode "create" de la classe "Create_Event". Nous allons indiquer donc qu'il faut ajouter le Sprite sur la carte ainsi que l'ID :
4) Créer un évènement via un évènement
Pour créer l'évènement par l'intermédiaire d'un autre évènement, il suffira d'appeler notre classe "Create_Event" grâce à la commande "Insérer un script" :
Note : 1 est l'ID de l'évènement à copier sur la carte MAP_ID_EVENT
5) Le script "Event_Create" complet
Page modifiée (1 fois) le 18 Avril 2010 à 00h 19 | Page vue 7494 fois | Auteur : Samarium

