Sujet n°10240
Posté par Yorick le 19 Aoû - 23:16 (2011)
Titre : PROBLEME SAVE !
Bonjour, Bonsoir PSPiens !
Ce soir, j'ai eu un très gros problème lors de la sauvegarde de ma partie (nouvelle partie, au passage)






LE LOG >>>

---------- Erreur de script : Pokemon_Save* ----------
----- Version du logiciel : PSP DS v0.4
----- Type
TypeError

----- Message
no marshal_dump is defined for class Window_Base

----- Position dans Pokemon_Save*
Ligne 332

----- Backtrace
Script : Pokemon_Save* | Ligne : 332 | Méthode : in `dump'
Script : Pokemon_Save* | Ligne : 332 | Méthode : in `write_save_data'
Script : Pokemon_Save* | Ligne : 139 | Méthode : in `update'
Script : Pokemon_Save* | Ligne : 87 | Méthode : in `main'
Script : Pokemon_Save* | Ligne : 84 | Méthode : in `loop'
Script : Pokemon_Save* | Ligne : 91 | Méthode : in `main'
Script : Main | Ligne : 58

Posté par Pαlвσlѕку le 19 Aoû - 23:24 (2011)
Je n'ai jamais rencontré ce problème.

Tu as modifié quelque chose ?

Posté par Yorick le 20 Aoû - 06:34 (2011)
Non justement, à part avoir mis le draw_choice_plus !


Maintenant, lorsque je démarre le jeu, ça plante. Voici le log >>>



---------- Erreur de script : Scene_Title ----------
----- Version du logiciel : PSP DS v0.4
----- Type
EOFError

----- Message
End of file reached

----- Position dans Scene_Title
Ligne 652

----- Backtrace
Script : Scene_Title | Ligne : 652 | Méthode : in `load'
Script : Scene_Title | Ligne : 652 | Méthode : in `read_preview'
Script : Scene_Title | Ligne : 517 | Méthode : in `refresh_all'
Script : Scene_Title | Ligne : 491 | Méthode : in `each'
Script : Scene_Title | Ligne : 491 | Méthode : in `refresh_all'
Script : Scene_Title | Ligne : 405 | Méthode : in `wachunga_autofontinstall_st_main'
Script : Autofont_Install* | Ligne : 115 | Méthode : in `main'
Script : Main | Ligne : 58


[EDIT] APRES BEAUCOUP DE TEST >>> J'ai supprimé mes sauvegardes, et c'est APRES le draw_choice_plus. Quand j'essaye de sauvegarder, ça refait pareil. Et quand je démarre le jeu, si la save est présente, alors ça me met le problème ci-dessus.
J'en déduis donc que le draw_choice_plus est la source de mon problème.

Posté par Nuri Yuri le 20 Aoû - 09:44 (2011)
C'est normal que tu ai ce bug, quand le sauvegarde plante, le jeu ne fini pas de sauvegarder le fichier, d'ou l'erreur de chargement.

Posté par Pαlвσlѕку le 20 Aoû - 10:05 (2011)
PSP DS v0.4 dispose déjà de la fonction draw_choice_plus.

Inutile de l'ajouter.

Posté par Yorick le 20 Aoû - 10:25 (2011)
Je me suis mal exprimé. Le problème est que oui le draw_choice_plus est présent, mais quand je l'integre dans un event comme tu dis de le faire, ça marche bien, jusqu'à la sauvegarde. Finalement, j'ai supprimé le draw choice et ma sauvegarde, et c'est bon ! Imbécile heureux

Posté par Pαlвσlѕку le 20 Aoû - 11:02 (2011)
Effectivement, il y a bien un problème.

Par contre, je ne sais pas du tout d'où il vient.
Je n'ai même pas encore trouvé le rapport entre Pokemon_Save et la fonction draw_choice_plus.

Je suis dans le flou.

EDIT :

Bug corrigé !
Il faut remplacer la fonction draw_choice_plus présente dans le script Interpreter Palbolsky par celle-ci :

Code:
#---------------------------------------------------------------------------
# draw_choice_plus
#   Fenêtre de choix améliorée
#   Créé par Sphinx et modifié par Palbolsky
#---------------------------------------------------------------------------  
  def draw_choice_plus(text1="",text2 ="",args=["OUI","NON"],index_cancel=-1)
    if $game_temp.message_text != nil
      return false
    end
    if args.size > 7 and $DEBUG
      print("La commande draw_choice_plus ne peut contenir que 7 arguments maximum. Les arguments 8 à #{args.size} sont donc effacés.")
      for i in 7...args.size
        args[i] = nil
      end 
      args.compact!
    end
    window = Window_Command.new(1, args, $fontsizebig)
    width = []
    for i in 0...args.size
      width.push(window.contents.text_size(args[i]).width)
    end
    width = width.max + 16
    window.dispose
    @dummy = Sprite.new
    @dummy.bitmap = RPG::Cache.picture($options[5])
    @dummy.x = 15
    @dummy.y = 158
    @dummy.z = 9999
    @command = Window_Command.new(width + 32, args, $fontsizebig)
    @command.x = 235 - width
    @command.y = 124 - (15 * args.size)
    @command.z = 10000
    @texte = Window_Base.new(0, 132, 250, 400)
    @texte.z = 10002
    @texte.opacity = 0
    @texte.contents = Bitmap.new(608, 412)
    @texte.contents.font.name = "Pokemon Emerald"
    @texte.contents.font.size = $fontsize       
    @texte.draw_text(13, 8, 212, 32, text1)
    @texte.draw_text(13, 24, 212, 32, text2)
    $game_variables[15] = 1
    $game_variables[14] = 2 
    loop do
      Graphics.update
      Input.update
      @command.update
      if Input.trigger?(Input::C) and @command.index != index_cancel
        $draw_choice_plus = @command.index
        @command.dispose
        @texte.dispose
        @dummy.dispose
        $game_variables[15] = 0 if not $game_variables[15] == 2
        @command = nil
        @dummy = nil
        @texte = nil
        @wait_count = 2
        return $draw_choice_plus
      elsif Input.trigger?(Input::B) and index_cancel == -1
        $game_system.se_play($data_system.buzzer_se)
        @wait_count = 2
      elsif Input.trigger?(Input::B) or (Input.trigger?(Input::C) and @command.index == index_cancel)
        $draw_choice_plus = index_cancel
        @command.dispose
        @texte.dispose
        @dummy.dispose
        $game_variables[15] = 0 if not $game_variables[15] == 2
        @command = nil
        @dummy = nil
        @texte = nil
        @wait_count = 2
        return $draw_choice_plus
      end
    end
  end

J'ai juste rajouté deux lignes, mais ça change tout. Petit saligaud mal élevé

Posté par Yorick le 20 Aoû - 11:43 (2011)
Merci beaucoup à toi. Et oui en effet, deux lignes font la différence ^^

Posté par Sphinx le 20 Aoû - 16:49 (2011)
Clin d'œil foireux Je peux expliquer ce bug :

Voilà un code qui produira la même erreur, et qui vous aidera à comprendre le problème :
Code:
window = Window_Base(160, 120, 320, 240)
file = File.open("MaSauvegarde.rxdata", "wb")
Marshal.dump(window, file) # <= Erreur : "no marshal_dump is defined for class Window_Base"
file.close # Ne sera jamais exécuté, puisque la ligne précédente aura planté

=> Pour l'explication, pour ceux qui chercheraient encore :
Les classes du RGSS (Bitmap, Window, Sprite, Color, Tone, Rect, ...), les classes qui en héritent (Window_Base, Window_Command, Window_Selectable, ... héritent directement ou indirectement de Window) ou encore certaines classes natives du Ruby (File, Proc, Thread, ...) ne sont pas sérialisables (non sérialisable = ne peut en aucun cas être enregistrer en l'état dans un fichier par la fonction Marshal.dump).
Tenter de les sauvegarder entraine donc des erreurs de ce type Clin d'œil foireux