Le Deal du moment : -17%
Casque de réalité virtuelle Meta Quest 2 ...
Voir le deal
249.99 €

Aller en bas
Zangther
Zangther
Membre

Nombre de messages : 913
Distinction : aucune
Date d'inscription : 06/02/2013

RPG Maker VX Ace [VXAce][RME] Créer un coffre de stockage

Dim 3 Sep 2017 - 23:28
Ce système est un coffre de stockage dans lequel le joueur pourra déposer des objets puis les retirer.

Rendu

Tout d'abord voici un exemple du rendu !
[VXAce][RME] Créer un coffre de stockage Customstorage-4b4a445

Utilisation

Pour créer un coffre, il faut créer un évènement dans lequel il faut placer cela:
Event - EV001

| > Appeler Script : SV[1] = 10
| > Appeler Événement Commun : [Item-Chest]
| >
La variable locale 1 contiendra la capacité de stockage du coffre. Dans cet exemple le coffre pourra stocker 10 objets !

Prérequis

Le système repose sur cette table de la base de données (pour plus d'explications voir : https://github.com/RMEx/RME/wiki/Base-de-donn%C3%A9es-extensible).
Code:
# Define a chest table
class Chest_Storage < Dynamic::Table
    pk string :key
    string :type
    list :integer, :elts
end
A ajouter dans un nouveau script, en dessous de ceux de RME.

Code de l'event

CommonEvent - Item-Chest

| > Commentaire : /!\ Utiliser la variable SV[1] pour définir la capacité maximum
| > Commentaire :     du coffre
| > Commentaire :  
| > Commentaire : Activation de l'interrupteur pour bloquer la boucle  
| > Opération : Interrupteur local A = Désactivé
| > Commentaire : Création du record s'il n'existe pas !
| > Appeler Script : SV[2] = "#{map_id}-#{event_id}"
| > Appeler Script : Chest_Storage.insert(SV[2], "item",[]) unless Chest_Storage[SV[2]]
| > Commentaire : Modification visuelle du coffre
| > Appeler Événement Commun : [Chest-open]
| > Commentaire : On supprime les fenêtres !
| > Appeler Script : remove_all_windows
| > Commentaire : Récupérer le nombre d'objets stockés
| > Appeler Script : SV[3] = Chest_Storage[SV[2]].elts.length
| > Commentaire : Définition du choix
| > Appeler Script : center_x = (screen_width / 2) - (100)
| > Appeler Script : create_commands_window(1, 0, 0, 200,  
| > Appeler Script :    "Déposer un objet" => {
| > Appeler Script :         enabled?:(SV[3] < SV[1] && length(items_possessed) > 0),
| > Appeler Script :         action: action{
| > Appeler Script :                  SS["Z"] = true
| > Appeler Script :                  SS["A"] = true
| > Appeler Script :                }
| > Appeler Script :         },  
| > Appeler Script :    "Retirer un objet" => {
| > Appeler Script :         enabled?:(SV[3] > 0),
| > Appeler Script :         action: action{
| > Appeler Script :                  SS["Z"] = false
| > Appeler Script :                  SS["A"] = true
| > Appeler Script :                 }
| > Appeler Script :         }
| > Appeler Script : )
| > Appeler Script : height = window_height(1)
| > Appeler Script : center_y = (screen_height / 2) - (height/2)
| > Appeler Script : window_moveto(1, center_x, center_y, 1)
| > Commentaire : Attente de la sélection de l'action
| > Boucle
| >| > Attendre : 1 Frames
| >| > Condition : Interrupteur local A == Activé
| >| >| > Sortir de la Boucle
| >| >| >
| >| > Fin - Condition
| >| > Condition : la touche B est pressée
| >| >| > Aller à l'Étiquette : quit
| >| >| >
| >| > Fin - Condition
| >| >
| > Fin - Boucle
| > Commentaire : Suppression de la fenêtre de sélection
| > Appeler Script : remove_window(1)
| > Appeler Script : SS["B"] = false
| > Commentaire : Construction de la liste d'objets a afficher
| > Condition : Script : SS["Z"]
| >| > Appeler Script : SV[4] = items_possessed
| >| >
| > Sinon
| >| > Appeler Script : SV[4] = Chest_Storage[SV[2]].elts
| >| >
| > Fin - Condition
| > Commentaire : Création de la fenêtre de sélection d'objet
| > Appeler Script : center_x = (screen_width / 2) - 150
| > Appeler Script : center_y = (screen_height / 2) - 150
| > Appeler Script : create_selectable_window(
| > Appeler Script :   1, center_x, center_y, 300, 300,  
| > Appeler Script :   data:SV[4],  
| > Appeler Script :   action:action {|i|  
| > Appeler Script :      SS["B"] = true
| > Appeler Script :      SV[5] = i
| > Appeler Script :   },
| > Appeler Script :   draw:action{|i|
| > Appeler Script :      item =  $data_items[item(i)]
| > Appeler Script :      write_with_icon(i, item.name, item.icon_index)
| > Appeler Script :   }
| > Appeler Script : )
| > Commentaire : Attente de la sélection de l'objet
| > Boucle
| >| > Attendre : 1 Frames
| >| > Condition : Interrupteur local B == Activé
| >| >| > Sortir de la Boucle
| >| >| >
| >| > Fin - Condition
| >| > Condition : la touche B est pressée
| >| >| > Aller à l'Étiquette : quit
| >| >| >
| >| > Fin - Condition
| >| >
| > Fin - Boucle
| > Appeler Script : SV[6] = item_name(SV[5])
| > Condition : Script : SS["Z"]
| >| > Appeler Script : give_item(SV[5], -1)
| >| > Appeler Script : Chest_Storage[SV[2]].elts << SV[5]
| >| > Message : Ø, Ø, Normal, Haut
| >| > Message : L'objet \SV[6] a été stocké
| >| >
| > Sinon
| >| > Appeler Script : index = Chest_Storage[SV[2]].elts.index(SV[5])
| >| > Appeler Script : Chest_Storage[SV[2]].elts.delete_at(index)
| >| > Appeler Script : give_item(SV[5], 1)
| >| > Message : Ø, Ø, Normal, Haut
| >| > Message : L'objet \SV[6] a été retiré
| >| >
| > Fin - Condition
| > Commentaire : Quitter la scene
| > Étiquette : quit
| > Appeler Script : remove_all_windows
| > Appeler Événement Commun : [Chest-close]
| > Attendre : 5 Frames
| >

Explications

La partie la plus complexe est celle sur les Window Selectable. Elle n'est pas encore correctement documentée (à l'écriture de ce tuto) mais c'est quelque chose que l'on doit travailler.
Tout d'abord il faut utiliser une boucle pour bloquer le héros (et les événements).

Observons chaque constituant

Code:
| > Opération : Interrupteur local A = Désactivé
Cette ligne définit l'interrupteur qui sert a sortir de la boucle de la sélection "déposer-retirer".

Code:
| > Appeler Script : SV[2] = "#{map_id}-#{event_id}"
| > Appeler Script : Chest_Storage.insert(SV[2], "item",[]) unless Chest_Storage[SV[2]]

Ici on crée l'enregistrement correspondant au coffre, uniquement s'il n'existe pas !
Sa clé primaire est simplement "map_id-event_id" (par exemple, sur la carte 1, l'événement 4 la clé sera : 1-4). On garantit donc qu'elle sera unique.

Code:
| > Appeler Script : SV[3] = Chest_Storage[SV[2]].elts.length
Ici on stocke dans la variable locale trois, le nombre d'objets stockés dans le coffre.

Code:
| > Commentaire : Définition du choix
| > Appeler Script : center_x = (screen_width / 2) - (100)
| > Appeler Script : create_commands_window(1, 0, 0, 200,  
| > Appeler Script :    "Déposer un objet" => {
| > Appeler Script :         enabled?:(SV[3] < SV[1] && length(items_possessed) > 0),
| > Appeler Script :         action: action{
| > Appeler Script :                  SS["Z"] = true
| > Appeler Script :                  SS["A"] = true
| > Appeler Script :                }
| > Appeler Script :         },  
| > Appeler Script :    "Retirer un objet" => {
| > Appeler Script :         enabled?:(SV[3] > 0),
| > Appeler Script :         action: action{
| > Appeler Script :                  SS["Z"] = false
| > Appeler Script :                  SS["A"] = true
| > Appeler Script :                 }
| > Appeler Script :         }
| > Appeler Script : )
| > Appeler Script : height = window_height(1)
| > Appeler Script : center_y = (screen_height / 2) - (height/2)
| > Appeler Script : window_moveto(1, center_x, center_y, 1)

On calcule comment centrer la fenêtre (center_x, center_y) puis on tente de créer la fenêtre de choix de dépôt ou de retrait. Ensuite on déplace la fenêtre avec moveto, car on ne connait pas la taille de la fenêtre à sa création.
Les actions sont désactivées si l'utilisateur ne possède aucun objet (ou que le coffre de stockage est plein) ou encore désactiver le retrait si jamais le coffre est vide!

L'action à l'appui active l'interrupteur Z qui définit s'il vaut true, si on veut ajouter un objet dans le coffre, false si on veut retirer un objet du coffre.
Si on appuie sur une touche, l'interrupteur local A est activé, permettant de sortir de cette boucle:
Code:
| > Commentaire : Attente de la sélection de l'action
| > Boucle
| >| > Attendre : 1 Frames
| >| > Condition : Interrupteur local A == Activé
| >| >| > Sortir de la Boucle
| >| >| >
| >| > Fin - Condition
| >| > Condition : la touche B est pressée
| >| >| > Aller à l'Étiquette : quit
| >| >| >
| >| > Fin - Condition
| >| >
| > Fin - Boucle

Cette boucle permet de bloquer le jeu durant la sélection. Elle ajoute une condition pour quitter le système si on appuie sur ECHAP. (la touche B)

Code:
| > Commentaire : Suppression de la fenêtre de sélection
| > Appeler Script : remove_window(1)
| > Appeler Script : SS["B"] = false

Une fois sorti de la boucle, on peut supprimer la fenêtre de choix. Et on désactive l'interrupteur B, qui aura le même rôle que l'interrupteur A mais pour la boucle suivante.

Code:
| > Commentaire : Construction de la liste d'objets a afficher
| > Condition : Script : SS["Z"]
| >| > Appeler Script : SV[4] = items_possessed
| >| >
| > Sinon
| >| > Appeler Script : SV[4] = Chest_Storage[SV[2]].elts
| >| >
| > Fin - Condition

Ici, on stocke dans la variable locale 4 la liste d'objets en fonction de si on veut retirer on déposer !

Code:
| > Commentaire : Création de la fenêtre de sélection d'objet
| > Appeler Script : center_x = (screen_width / 2) - 150
| > Appeler Script : center_y = (screen_height / 2) - 150
| > Appeler Script : create_selectable_window(
| > Appeler Script :   1, center_x, center_y, 300, 300,  
| > Appeler Script :   data:SV[4],  
| > Appeler Script :   action:action {|i|  
| > Appeler Script :      SS["B"] = true
| > Appeler Script :      SV[5] = i
| > Appeler Script :   },
| > Appeler Script :   draw:action{|i|
| > Appeler Script :      item =  $data_items[item(i)]
| > Appeler Script :      write_with_icon(i, item.name, item.icon_index)
| > Appeler Script :   }
| > Appeler Script : )

Ici on crée la fenêtre de sélection, avec la liste d'objets précédemment définie. L'action active l'interrupteur local B (pour sortir de la boucle suivante) et stocke dans la variable locale l'identifiant de l'objet validé.

Ensuite il y a une boucle similaire à la précédente.

Code:
| > Appeler Script : SV[6] = item_name(SV[5])
| > Condition : Script : SS["Z"]
| >| > Appeler Script : give_item(SV[5], -1)
| >| > Appeler Script : Chest_Storage[SV[2]].elts << SV[5]
| >| > Message : Ø, Ø, Normal, Haut
| >| > Message : L'objet \SV[6] a été stocké
| >| >
| > Sinon
| >| > Appeler Script : index = Chest_Storage[SV[2]].elts.index(SV[5])
| >| > Appeler Script : Chest_Storage[SV[2]].elts.delete_at(index)
| >| > Appeler Script : give_item(SV[5], 1)
| >| > Message : Ø, Ø, Normal, Haut
| >| > Message : L'objet \SV[6] a été retiré
| >| >
| > Fin - Condition

Cette partie est assez simple. Si on est en dépôt. On enlève l'objet de l'inventaire et on l'ajoute dans la table. Sinon on enlève l'objet de la table et on l'ajoute dans l'inventaire.
La fin est très simple. On efface les fenêtres et voilou :
Code:
| > Commentaire : Quitter la scene
| > Étiquette : quit
| > Appeler Script : remove_all_windows
| > Appeler Événement Commun : [Chest-close]
| > Attendre : 5 Frames

Après il y a deux petits événements communs pour fermer et ouvrir le coffre visuellement :

CommonEvent - Chest-open

| > Jouer SE : 'Chest', Volume : 80, Tempo : 100
| > Déplacer évènement : Cet événement (Attendre la fin)
| > Déplacer évènement : > Direction fixe OFF
| > Déplacer évènement : > Regarde vers la Gauche
| > Déplacer évènement : > Attendre : 3 Frames
| > Déplacer évènement : > Regarde vers la Droite
| > Déplacer évènement : > Attendre : 3 Frames
| >
CommonEvent - Chest-close

| > Jouer SE : 'Chest', Volume : 80, Tempo : 100
| > Déplacer évènement : Cet événement (Attendre la fin)
| > Déplacer évènement : > Direction fixe OFF
| > Déplacer évènement : > Regarde vers la Droite
| > Déplacer évènement : > Attendre : 3 Frames
| > Déplacer évènement : > Regarde vers la Gauche
| > Déplacer évènement : > Attendre : 3 Frames
| > Déplacer évènement : > Regarde vers le Bas
| >
Hinola
Hinola
Modérateur

Nombre de messages : 969
Age : 30
Distinction : Gagnant invaincu à ce jour de tous les concours de mapping de ce forum fait par Coco'
[Coco' Smile]
Grande figure du Mapping Show .
Grand admirateur de notre mascotte Vehyxine
STI Haruhiste like me [Hamu' Wink]
et fier de l'être ! [bibi ^^]
Un fier Homme du désert sans foi ni loi è_é [:3]
Date d'inscription : 21/05/2009

RPG Maker VX Ace Re: [VXAce][RME] Créer un coffre de stockage

Ven 8 Sep 2017 - 2:28
Très bon tuto, avec des bons commentaires on peut comprendre et personnaliser le système à souhait :3

[VXAce][RME] Créer un coffre de stockage Coffre
Zangther
Zangther
Membre

Nombre de messages : 913
Distinction : aucune
Date d'inscription : 06/02/2013

RPG Maker VX Ace Re: [VXAce][RME] Créer un coffre de stockage

Ven 8 Sep 2017 - 10:24
Vraiment sympa. N'hésite pas à en faire un tuto si tu le souhaite !
Contenu sponsorisé

RPG Maker VX Ace Re: [VXAce][RME] Créer un coffre de stockage

Revenir en haut
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum