Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
390 connectés actuellement
30677640 visiteurs depuis l'ouverture
2384 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
Grimmelda -
posté le 22/03/2024 à 12:17:34 (68 messages postés)
| | 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.
|
| Chanter l'hyperchleuasme | Dans Scene_load, tu as la méthode on_decision(filename).
Il charge la scène pour envoyer le héros sur la map :
Juste au dessus tu peux changer une variable ou un interrupteur :
1
2
| $game_variables[138] = 42
$game_switches[138] = true |
Ce changement sera fait au chargement de partie seulement.
|
Es-tu une star ? | Kujira no Hara | Muma|Rope | Polaris 03 | La 7e porte |
Grimmelda -
posté le 22/03/2024 à 17:37:44 (68 messages postés)
| | 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)
| | (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) class Interpreter
#--------------------------------------------------------------------------
# ● オブジェクト初期化
# depth : ネストの深さ
# main : メインフラグ
#--------------------------------------------------------------------------
def initialize(depth = 0, main = false)
#AJOUT (ici, gestion y ligne 151 et ligne 219)
@mnlay1 = Sprite.new
@mnlay1.bitmap = RPG::Cache.title("dialogue")
@mnlay1.z = 48
@mnlay1.opacity = 0
#FIN D'AJOUT
@depth = depth
@main = main
# 深さは 100 レベルまで
if depth > 100
print("L'évènement commun dépasse la limite autorisée (100).")
exit
end
# インタプリタの内部状態をクリア
clear
end
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. -_-
|
| Chanter l'hyperchleuasme | 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.
|
Es-tu une star ? | Kujira no Hara | Muma|Rope | Polaris 03 | La 7e porte |
Crystal -
posté le 04/04/2024 à 20:08:35 (2137 messages postés)
- | | 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)
| | 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 (2137 messages postés)
- | | Tu peux mettre une déclaration de Sprite dans Interpreter au début du script:
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:
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 |
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)
| | De son côté, un ami m'a proposé ça :
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 (2137 messages postés)
- | | 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
|
|
|