Accueil - Forum - Bibliothèque de ressources
____

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 :

Code Ruby@new_event = Game_Event.new(ID_Map, Event)


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 :

Code RubyMAP_ID_EVENT = 1
class Create_Event
        def initialize(event_id)

        end
        def create

        end
        def search_new_id
       
        end
end


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" :

Code Rubydef initialize(event_id)
        # Les données de la map MAP_ID_EVENT
        @map = load_data(sprintf("Data/Map%03d.rxdata", MAP_ID_EVENT))
        # Les évènements de la map
        @events = @map.events
        @event_id = event_id
        create
end
 


@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

Code Rubydef create
        # On sélectionne l'ID
        event = @events[@event_id]
        # Position de l'évènement sera les même positions du héros
    event.x =  $game_player.x
    event.y =  $game_player.y
end
 


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) :

Code Ruby# On assigne un nouvel ID à l'évènement
event.id = search_new_id


On créé donc maintenant notre évènement :

Code Ruby@create = Game_Event.new($game_map.map_id, event)


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 :

Code Rubydef search_new_id
        # On initialise "id" à 1
    id = 1
        # Tant que "id" est dans la liste des évènement
    while $game_map.events.include?(id)
         # On incrémente de 1
      id += 1
    end
        # On retourne "id"
    return id
  end
 


"$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 :

Code Ruby$game_map.events[event.id] = @create


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 :

Code Rubydef add_event(event_id)
   sprite = Sprite_Character.new(@viewport1, $game_map.events[event_id])
   @character_sprites.push(sprite)
 end


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" :

Code Rubyattr_accessor :add_event
 attr_accessor :id_add_event


A mettre à la suite des autres attributs et dans la méthode "initialize" :

Code Ruby# Indicateur si on ajouté un évènement
@add_event = false
# L'ID de l'évènement à ajouter
@id_add_event = 0


Revenons le script "Scene_Map". Nous allons mettre dans la méthode "update" donc :

Code Rubyif $game_temp.add_event
    @spriteset.add_event($game_temp.id_add_event)
        $game_temp.add_event = false
end


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 :

Code Ruby$game_temp.add_event = true
 $game_temp.id_add_event = event.id
 end # Fin de la méthode "create"


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" :

Code RubyCreate_Event.new(1)


Note : 1 est l'ID de l'évènement à copier sur la carte MAP_ID_EVENT

5) Le script "Event_Create" complet

Code RubyMAP_ID_EVENT = 1
class Create_Event
        def initialize(event_id)
                # Les données de la map MAP_ID_EVENT
                @map = load_data(sprintf("Data/Map%03d.rxdata", MAP_ID_EVENT))
                # Les évènements de la map
                @events = @map.events
                @event_id = event_id
                create
        end
       
        def create
                # On sélectionne l'ID
                event = @events[@event_id]
                # Position de l'évènement sera les même positions du héros
            event.x =  $game_player.x
            event.y =  $game_player.y
                # On assigne un nouvel ID à l'évènement
                event.id = search_new_id
                # Création de l'évènement
                @create = Game_Event.new($game_map.map_id, event)
                # Ajoute dans liste des évènements de la carte actuelle
                $game_map.events[event.id] = @create
                # Indique qu'on ajoute un Sprite
                $game_temp.add_event = true
                # ID de l'évènement pour le Sprite à ajouter
                $game_temp.id_add_event = event.id
        end
       
        def search_new_id
        # On initialise "id" à 1
    id = 1
        # Tant que "id" est dans la liste des évènement
    while $game_map.events.include?(id)
         # On incrémente de 1
      id += 1
    end
        # On retourne "id"
    return id
  end
end
Informations
Page modifiée (1 fois) le 18 Avril 2010 à 00h 19 | Page vue 7494 fois | Auteur : Samarium

RPG Creative version 5 - Libérez votre créativité ! ; Mai 2005 - Mai 2012
0.077s - Optimisé pour une résolution 1024*728 - Tous droits réservés.

Contact - Partenaires - Historique - A propos