Day.png);">
Apprendre


Vous êtes
nouveau sur
Oniromancie?

Visite guidée
du site


Découvrir
RPG Maker

RM 95
RM 2000/2003
RM XP
RM VX/VX Ace
RM MV/MZ

Apprendre
RPG Maker

Tutoriels
Guides
Making-of

Dans le
Forum

Section Entraide

Sorties: "Dread Mac Farlane", (...) / Tutos: Checklist de la composition (...) / Sorties: Dread Mac Farlane - episode 8 / Sorties: Dread Mac Farlane - episode 7 / Jeux: Ce qui vit Dessous / Chat

Bienvenue
visiteur !




publicité RPG Maker!

Statistiques

Liste des
membres


Contact

Mentions légales

408 connectés actuellement

29448432 visiteurs
depuis l'ouverture

14312 visiteurs
aujourd'hui



Barre de séparation

Partenaires

Indiexpo

Akademiya RPG Maker

Blog Alioune Fall

Fairy Tail Constellations

Le Comptoir Du clickeur

RPG Maker - La Communauté

Tashiroworld

Tous nos partenaires

Devenir
partenaire



forums

Index du forum > Entraide > [RESOLU] [RPG Maker XP] Charger partie SAUF un interrupteur


Grimmelda - posté le 22/03/2024 à 12:17:34 (68 messages postés)

❤ 0

Domaine concerné: Script
Logiciel utilisé: RPG Maker XP
Bonjour, il y a un système avec lequel je galère pour mon jeu, c'est un peu compliqué, je vais essayer d'être concis.
L'histoire du jeu se déroule sur 20 jours, chaque fois qu'on charge une partie et que le jour de la Save n'est pas égal au jour actuel, le numéro du jour augmente de 1 (peu importe si on reprend le jeu dix jours après).

A côté de ça, même si on récupère une sauvegarde le même jour, je voudrais que la perso n'apparaisse pas à l'endroit de la sauvegarde, mais toujours au même endroit, au milieu de la pièce. Certains objets sont rangés, un peu à la manière des pots plus cassés dans zelda.

Le problème dans les deux cas, c'est évidemment que quand on charge une partie, on charge tous les états des switches et des variables, et non pas tous sauf un...

Quelqu'un entrevoit-il un moyen de gruger ? Y aurait-il un petit aménagement de Scene_Load qui permettrait d'exclure une variable du chargement, de ne pas charger game_variables[machin] ou game_switches[bidule] ? Cela me permettrait de faire la mise en scène que je veux, puis de ramener cette variable ou ce switch à OFF ou 0.


Roi of the Suisse - posté le 22/03/2024 à 12:49:46 (29831 messages postés) - honor -

❤ 0

Alerte neige !

Dans Scene_load, tu as la méthode on_decision(filename).
Il charge la scène pour envoyer le héros sur la map :

Portion de code : Tout sélectionner

1
$scene = Scene_Map.new


Juste au dessus tu peux changer une variable ou un interrupteur :

Portion de code : Tout sélectionner

1
2
$game_variables[138] = 42
$game_switches[138] = true


Ce changement sera fait au chargement de partie seulement.

L'essentialisme c'est quand ta voiture a un moteur essence. | Es-tu une star ? | Kujira no Hara | Polaris 03 | Planète Glutko


Grimmelda - posté le 22/03/2024 à 17:37:44 (68 messages postés)

❤ 0

Merci RotS ! Ça fonctionne parfaitement ! Je dirais même que ça fonctionne aussi avec le Script Autosave. Je suis pas encore sorti de l'auberge par rapport à ce que je veux faire, mais c'est déjà un grand pas en avant !


Grimmelda - posté le 04/04/2024 à 10:38:50 (68 messages postés)

❤ 0

(Je n'édite pas mon post pour l'instant car ça me paraît plus clair comme ça, si c'est l'usage d'éviter les double posts dites-le moi)

En fait mon problème de Save n'est finalement pas résolu, du coup je profite d'avoir ouvert un topic d'aide pour en demander plus ! La sauvegarde est empêchée par une modification de script que j'ai fait sur "Interpreter 1". Je voulais qu'apparaisse une boîte de dialogue chaque fois que j'affiche un message, et comme je sais pas coder j'ai initialisé un sprite un peu au pif :

Spoiler (cliquez pour afficher)



En tant que boîte de dialogue c'est parfaitement fonctionnel, sauf que comme il appartient à aucune classe, ça crashe lorsqu'on sauvegarde ou qu'on charge (no_marshall_dump)

J'ai isolé les éléments, c'est bien cette partie qui coince. J'ai demandé à ChatGPT, il me dit que faudrait mettre ce bout de code ailleurs que dans def initialize, mais pour moi s'il faut mettre une partie dans update une autre dans ect, vu que je comprends pas ce que je fais, ça devient vite le bazar. -_-


Roi of the Suisse - posté le 04/04/2024 à 11:08:15 (29831 messages postés) - honor -

❤ 0

Alerte neige !

no_marshall_dump, ça veut dire qu'il ne trouve pas le fichier de sauvegarde, non ?
Marshaller quelque chose, c'est transformer les variables du jeu en fichier texte (sauvegarde) et vice versa (chargement).

Quand tu retires ta bidouille de sprite, l'erreur de marshall_dump disparait ???


Si tu veux afficher une image comme boîte de dialogue, il ne faut pas faire ça dans l'interpréteur. Il faut faire ça dans la classe window_message ou quelque chose comme ça.

L'essentialisme c'est quand ta voiture a un moteur essence. | Es-tu une star ? | Kujira no Hara | Polaris 03 | Planète Glutko


Crystal - posté le 04/04/2024 à 20:08:35 (2097 messages postés) -

❤ 0

Si tu n'es pas trop à l'aise avec Ruby, je te conseille fortement de faire ça via les commandes événementielles, d'autant plus que, comme RotS a dit, ça ne devrait pas être implémenté comme tu l'as fait (il y a aura un Sprite identique de dialogue par événément, ce qui est assez mauvais comme pratique pour les performances). D'autant plus que sans méthode de type destructeur pour l'objet Interpreter dans laquelle dispose est appelé, ces sprites vont rester en mémoire.

Quant à l'erreur en question, j'assume que structurellement les sauvegardes enregistrent les données Interpreter des événements communs, dansquel cas en effet tu auras un crash puisque les sprites RGSS ne peuvent pas être formattés en Marshall (et donc pas enregistrés). Normalement, il faut recréer les sprites à chaque instance de jeu, mais on peut sauvegarder des bitmaps.

Mais bon, pour faire simple, idéalement, tu n'as qu'à gérer l'ouverture et la fermeture d'une boîte de dialogue via des appels d'événements communs qui traitent une image.


Grimmelda - posté le 10/04/2024 à 12:10:46 (68 messages postés)

❤ 0

Merci de vos réponses ! Oui oui j'ai bien isolé les lignes avant de vous demander, c'est effectivement ça qui se passe, le sprite peut pas être formaté en marshall. (si je mets ces lignes en commentaire, ça charge et ça sauve sans pb)
Je sais que je peux afficher la boite de dialogues en events, mais j'essaie d'automatiser pour pas avoir à encadrer tous mes dialogues de "afficher image". En soi ça marche bien à part... qu'on peut pas sauvegarder, ahah. Je vais encore chercher un peu une gruge du type : Marshaller tout sauf ce truc, et si je trouve pas je retournerais vers quelque chose de moins bidouillé.


Crystal - posté le 10/04/2024 à 22:47:05 (2097 messages postés) -

❤ 1

Tu peux mettre une déclaration de Sprite dans Interpreter au début du script:

Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
class Interpreter
    def self.create_dialogue_sprite
        @@dialogue_sprite = Sprite.new
        @@dialogue_sprite.bitmap = RPG::Cache.title('dialogue')
        @@dialogue_sprite.x = 320
        @@dialogue_sprite.y = 480
        @@dialogue_sprite.z = 48
        @@dialogue_sprite.ox = @@dialogue_sprite.bitmap.width >> 1
        @@dialogue_sprite.oy = @@dialogue_sprite.bitmap.height
        @@dialogue_sprite.visible = false
    end
 



Et ensuite pour les méthodes affectées:

Portion de code : Tout sélectionner

1
2
3
4
5
6
def command_101
    Interpreter.create_dialogue_sprite unless @@dialogue_sprite
    @@dialogue_sprite.visible = true
    [...] (code original de la méthode)
    @@dialogue_sprite.visible = false
end



Portion de code : Tout sélectionner

1
2
3
4
5
6
def command_102
    Interpreter.create_dialogue_sprite unless @@dialogue_sprite
    @@dialogue_sprite.visible = true
    [...] (code original de la méthode)
    @@dialogue_sprite.visible = false
end



Je n'ai pas testé, mais laisse-moi savoir s'il y a un problème ! À noter qu'avec cette solution, tu n'auras pas d'effet dynamique comme un fondu. Si jamais tu en veux, ça nécessitera une quantité supplémentaire substancielle de code, ou la solution par événements communs.


Grimmelda - posté le 15/04/2024 à 12:42:19 (68 messages postés)

❤ 0

De son côté, un ami m'a proposé ça :

Portion de code : Tout sélectionner

1
 init_dialogue_layer


Portion de code : Tout sélectionner

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 UNMARSHALED_VARIABLES = [:@mnlay1]
  
  def init_dialogue_layer
    @mnlay1 = Sprite.new
    @mnlay1.bitmap = RPG::Cache.title("dialogue")
    @mnlay1.z = 48
    @mnlay1.opacity = 0
  end  
  
  def marshal_dump
    instance_variables.reject{|m| m == '@mnlay1'}.inject({}) do |vars, attr|
      vars[attr] = instance_variable_get(attr)
      vars
    end
  end
 
  def marshal_load(vars)
    vars.each do |attr, value|
      instance_variable_set(attr, value) unless UNMARSHALED_VARIABLES.include?(attr)
    end
    init_dialogue_layer
  end



qui permet effectivement de sauver et charger sans avoir de conséquence sur l'apparition des boîtes de dialogues. Je serais bien content en tous les cas d'avoir vu vos deux approches dans quelques mois quand il y aura le travail d'ergonomie autour de la save. Pour l'instant, j'avais surtout besoin que save et dialogue marchent conjointement afin de pouvoir tester mon gameplay.
Donc cette fois-ci, c'est bon, mon problème est bel et bien résolu !

Merci à vous deux.


Crystal - posté le 22/04/2024 à 04:25:55 (2097 messages postés) -

❤ 1

Sa solution fonctionne pour éviter au jeu de crasher à cause de la sauvegarde, mais garde essentiellement le même problème qu'auparavant et fera un usage médiocre de la mémoire:

- Un Sprite doit être initialisé par événement (pour une image qui est la même)
- La fonction dispose doit être appelée à chaque déchargement d'événement (ce qui doit être ajouté manuellement dans Game_Map), sinon des Sprites déréférencés seront accumulés en mémoire
- Chaque chargement de sauvegarde ajoute une instance de Sprite par événement commun
- Chaque Sprite accumulé en mémoire qui n'est plus référencé risque de finir par causer un crash RGSS

Avec ma solution tu n'auras pas ces problèmes. En bonus, j'ai également fait en sorte que ta boîte de dialogue soit centrée en bas même si tu modifies la taille de ton image.

Index du forum > Entraide > [RESOLU] [RPG Maker XP] Charger partie SAUF un interrupteur

repondre up

Suite à de nombreux abus, le post en invités a été désactivé. Veuillez vous inscrire si vous souhaitez participer à la conversation.

Haut de page

Merci de ne pas reproduire le contenu de ce site sans autorisation.
Contacter l'équipe - Mentions légales

Plan du site

Communauté: Accueil | Forum | Chat | Commentaires | News | Flash-news | Screen de la semaine | Sorties | Tests | Gaming-Live | Interviews | Galerie | OST | Blogs | Recherche
Apprendre: Visite guidée | RPG Maker 95 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker MV | Tutoriels | Guides | Making-of
Télécharger: Programmes | Scripts/Plugins | Ressources graphiques / sonores | Packs de ressources | Midis | Eléments séparés | Sprites
Jeux: Au hasard | Notre sélection | Sélection des membres | Tous les jeux | Jeux complets | Le cimetière | RPG Maker 95 | RPG Maker 2000 | RPG Maker 2003 | RPG Maker XP | RPG Maker VX | RPG Maker VX Ace | RPG Maker MV | Autres | Proposer
Ressources RPG Maker 2000/2003: Chipsets | Charsets | Panoramas | Backdrops | Facesets | Battle anims | Battle charsets | Monstres | Systems | Templates
Ressources RPG Maker XP: Tilesets | Autotiles | Characters | Battlers | Window skins | Icônes | Transitions | Fogs | Templates
Ressources RPG Maker VX: Tilesets | Charsets | Facesets | Systèmes
Ressources RPG Maker MV: Tilesets | Characters | Faces | Systèmes | Title | Battlebacks | Animations | SV/Ennemis
Archives: Palmarès | L'Annuaire | Livre d'or | Le Wiki | Divers