Coucou, voici un petit système (mon premier!!) que j'ai créé avec RME. Ca permet de créer des coffres pouvant stocker un nombre déterminé d'objets. C'est mon premier systèmes donc soyez clément.
Le système repose sur cette table de la base de données :
Voici un exemple du rendu !
Donc je vous montre comment je fais pour créer un coffre. Dans un événement il faut placer cela:
Event - EV001
La variable locale 1 contiendra la capacité de stockage du coffre. Dans cet exemple le coffre pourra stocker 10 objets !
J'ai essayé d'utiliser un événement commun pour générer le comportement du coffre. Voyons maintenant les événements communs :
CommonEvent - Item-Chest
Oulalala c'est long ! Le code semble assez simple !
La partie un peu chevelue est la création de la Window Selectable. Merci à Ultimo Loco pour son aide et ses commandes !
Je me sers de boucles pour bloquer le héros (et les événements). (Je ne sais pas si c'est une bonne approche)
Observons chaque constituant
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.
je calcule comment centrer la fenêtre (center_x, center_y). Et je tente de créer la fenêtre de choix de dépôt ou de retrait. Je dois me servir de moveto après, car je ne connais 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). Et désactiver le retrait si jamais le coffre est vide!
L'action à l'appui active l'interrupteur Z qui défini 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, j'active l'interrupteur local A, permettant de sortir de cette 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)
Une fois sortit 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... (j'aurais pu me re-servir de A mais ne soyons pas avare).
Ici,je stocke dans la variable locale 4 la liste d'objets en fonction de si on veut retirer on déposer !
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é.
Merci à Elultimo Loco pour la fonction d'écriture de l'objet !
Ensuite il y a une boucle similaire à la précédente.
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 (merci Elultimo, encore une fois!). Sinon on enlève l'objet de la table et on l'ajoute dans l'inventaire. (Merci Elu encore encore encore encore une fois).
La fin est très simple. On efface les fenêtres et voilou :
Après il y a deux petits événements communs pour fermer et ouvrir le coffre visuellement :
CommonEvent - Chest-open
CommonEvent - Chest-close
Voilaaaa si vous avez des questions ! (ou des améliorations)
Edit: Merci Zangther pour l'EventPrinter
Le système repose sur cette table de la base de données :
- Code:
# Define a chest table
class Chest_Storage < Dynamic::Table
pk string :key
string :type
list :integer, :elts
end
Voici un exemple du rendu !
Donc je vous montre comment je fais pour créer un coffre. Dans un événement il faut placer cela:
Event - EV001
| > Appeler Script : SV[1] = 10 |
| > Appeler Événement Commun : [Item-Chest] |
| > |
J'ai essayé d'utiliser un événement commun pour générer le comportement du coffre. Voyons maintenant les événements communs :
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 |
| > |
La partie un peu chevelue est la création de la Window Selectable. Merci à Ultimo Loco pour son aide et ses commandes !
Je me sers de boucles pour bloquer le héros (et les événements). (Je ne sais pas si c'est une bonne approche)
Observons chaque constituant
- Code:
| > Opération : Interrupteur local A = Désactivé
- 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
- 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)
je calcule comment centrer la fenêtre (center_x, center_y). Et je tente de créer la fenêtre de choix de dépôt ou de retrait. Je dois me servir de moveto après, car je ne connais 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). Et désactiver le retrait si jamais le coffre est vide!
L'action à l'appui active l'interrupteur Z qui défini 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, j'active l'interrupteur local A, 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 sortit 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... (j'aurais pu me re-servir de A mais ne soyons pas avare).
- 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,je 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é.
Merci à Elultimo Loco pour la fonction d'écriture de l'objet !
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 (merci Elultimo, encore une fois!). Sinon on enlève l'objet de la table et on l'ajoute dans l'inventaire. (Merci Elu encore encore encore encore une fois).
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 |
| > |
| > 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 |
| > |
Edit: Merci Zangther pour l'EventPrinter