RMEx
RMEx

Community


Vous n'êtes pas connecté. Connectez-vous ou enregistrez-vous

Coffre de stockage !!

Voir le sujet précédent Voir le sujet suivant Aller en bas  Message [Page 1 sur 1]

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

Code:
| > Opération : Interrupteur local A = Désactivé
Cette ligne défini 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)

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
| >
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
| >
Voilaaaa si vous avez des questions ! (ou des améliorations)

Edit: Merci Zangther pour l'EventPrinter

Voir le profil de l'utilisateur

Joke

avatar
Admin
Wow... enfin quelqu'un qui sait lire le WIKI ! Laughing

Très belle présentation et très joli système !

Je ne sais pas si tu utilise liceCAP pour tes gif, si oui je te conseille d'augmenter le framerate (n'ait pas peur de mettre 60) et faire un gif plus court voir deux gifs courts plutôt qu'un long, histoire d'avoir des captures fluides. Very Happy

Voir le profil de l'utilisateur

Voir le sujet précédent Voir le sujet suivant Revenir en haut  Message [Page 1 sur 1]

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