Sujet n°5396
Posté par Sphinx le 11 Nov - 22:42 (2009)
Titre : Générique de fin v1.0
Qui ne s'est jamais dit "Si seulement je pouvais afficher un petit générique de fin pour dire au revoir au joueur ou pour faire un peu de pub pour le board de mon projet..." ? Qui n'a jamais fait de cauchemars parce qu'il ne pouvait pas afficher ses crédits lorsque le joueur fermait son jeu ? Qui ? Ah, tout le monde ? Ok ce n'est pas grave. Faites semblant.

Voici comment, désormais, vous pourrez ajouter un :

Générique de fin ! 



Le générique de fin se présente sous la forme d'images qui se succèderont à l'écran lorsque le joueur quittera sa partie. C'est assez rudimentaire, mais je crois que ca suffira dans 80-90% des cas. Ceux qui savent scripter, bien sur, pourront très facilement personnaliser l'animation.
Bon étant donné que je n'ai plus grand chose à dire pour le moment, passons de suite à la suite.
Revenir en haut 



  1. Script Module, recherchez :
    Code:

        if exception.type == SystemExit
          return
        end

    puis remplacez le par :
    Code:

        if exception.type == SystemExit
          ExitGenerique.start
          return
        end

  2. Dans le script Config Panel (pour 0.7) ou Config Panel 4G+ (pour 4G+) ajoutez :
    Code:

      # --------------------------------------------------------
      # EXIT_TPS
      #   Nbre de secondes max que doit durer le générique de fin.
      #   Pour le confort de vos joueurs, il est recommandé de ne pas
      #     faire de génériques de plus de quelques secondes.
      #   Si le temps total n'est pas divisible par le nombre d'images
      #     alors le temps par image sera arrondi selon les règles
      #     arithmétiques en vigueur.
      # --------------------------------------------------------
      EXIT_TPS = 0
      
      # --------------------------------------------------------
      # EXIT_IMGS
      #   Liste des images qui apparaitront lorsque le joueur quittera le jeu
      #   Mettre [] pour désactiver le générique de fin
      # --------------------------------------------------------
      EXIT_IMGS = []
      
      # --------------------------------------------------------
      # EXIT_MSG
      #   Message qui sera affiché lorsque le joueur tentera de fermer le jeu
      #     pendant le générique de fin
      #   Mettre false pour autoriser le joueur à ne pas regarder le générique
      #     jusqu'au bout
      # --------------------------------------------------------
      EXIT_MSG = false

    juste après :
    Code:

    module POKEMON_S

  3. Dans un nouveau script au dessus de Main, copiez / collez ceci :
    Code:

    #==============================================================================
    # ■ ExitGenerique
    # Pokemon Script Project - Sphinx
    # 11/11/09
    #-----------------------------------------------------------------------------
    # Scène à ne modifier que si vous savez ce que vous faites
    #-----------------------------------------------------------------------------
    # Générique de fin
    #-----------------------------------------------------------------------------

    module ExitGenerique
      include POKEMON_S
      def self.start
        sprite = Sprite.new
        sprite.z = 50000
        bool = true
        i = 0
        while bool
          begin
            while i < POKEMON_S::EXIT_IMGS.size
              Graphics.freeze
              sprite.bitmap = RPG::Cache.title("Generique/#{POKEMON_S::EXIT_IMGS[i]}")
              Graphics.transition(5)
              tmp = 0
              while tmp < (((POKEMON_S::EXIT_TPS.to_f / POKEMON_S::EXIT_IMGS.size) * Graphics.frame_rate).round - 5)
                Graphics.update
                tmp += 1
              end
              i += 1
            end
            bool = false
          rescue SystemExit
            if POKEMON_S::EXIT_MSG
              print POKEMON_S::EXIT_MSG
            else
              return
            end
          end
        end
      end
    end

Et c'est déjà fini ! =)
Revenir en haut 



Amis qui seraient arrivés là parce que le III) suit le II), vous avez parfaitement le droit de passer directement au IV), je ne vous en voudrai pas. ^^
Si vous êtes en train de lire cette phrase, c'est donc que vous voulez rester ici, alors commencons sans plus tarder.
Les plus observateurs auront remarqué que ce bout de code :
Code:

    if exception.type == SystemExit
      return
    end

se trouve dans le module de gestion des erreurs - c'est ce module qui gère la création des sauvegardes automatiques et des rapports de log -. Ce bout de code est une condition. Il teste si le type de l'erreur relevée est du type SystemExit. Etrangement, c'est ce type d'erreur système qui est générée lorsque le joueur ferme le jeu, soit par les touches Alt+F4 de son clavier, soit en cliquant sur la croix qui est en haut à droite de la fenêtre de jeu, soit lorsque la commande exit est exécutée dans RMXP. Bref, c'est l'erreur qui est lancée lorsque le joueur quitte le jeu. Cette condition sert à ne pas générer de rapport d'erreurs lorsque le joueur quitte le jeu.
En ajoutant :
Code:

      ExitGenerique.start

juste avant le return, on demande au programme de lancer le script ExitGenerique.start avant de quitter le programme.
Le dernier détail réellement intéressant dans ce script, c'est cette opération appelée dans la boucle while :
Code:

(((POKEMON_S::EXIT_TPS.to_f / POKEMON_S::EXIT_IMGS.size) * Graphics.frame_rate).round - 5)

POKEMON_S::EXIT_TPS contient la durée totale que doit faire le générique de fin, POKEMON_S::EXIT_IMGS.size retourne le nombre d'images que compose le générique, et Graphics.frame_rate, le nombre de frames affichées à l'écran par secondes. Ca permet d'être au plus près de la réalité (la transition d'une image à l'autre dure 5 frames, d'où le - 5 en fin de calcul), et donc d'avoir un générique qui dure pratiquement tj le même temps d'un PC à un autre, mais aussi dans le cas où un PC aurait une soudaine charge de travail, & passe de 40 fps à 1 fps (<= ce qui aurait multiplié par 40 la durée du générique si le calcul ne s'adaptait pas en fonction du nbre de fps !!!). C'est pour la même raison que j'ai utilisé une boucle while plutôt qu'une boucle for. En effet, si le PC avait perdu de la puissance pendant que tournait la boucle for, le générique s'en serait retrouvé rallongé d'autant. Alors qu'avec la boucle while, quoiqu'il arrive, le générique ne durera pas plus longtemps que prévu.
Ah, j'en vois sourciller ! "Et si le maker ne met aucune image, ca va diviser par 0 !" Oui mais... Non. Et cette protection, c'est la première boucle while qui me la donne :
Code:

    i = 0
#.........
        while i < POKEMON_S::EXIT_IMGS.size


D'abord, on initialise i à 0, puis ensuite on teste si i est inférieur strict au nbre d'images. S'il n'y a aucune image, alors 0 < 0 retournera false, et on entrera jamais dans la boucle while ! Bien sur, i est incrémenté à la fin de cette boucle première while. Ce n'est donc pas non plus une boucle infinie.
Revenir en haut 



    Dans le II), vous avez ajouté quelques lignes au script Config Panel (ou Config Panel 4G+). C'est là que se règlera toutes les options du générique de fin.
    EXIT_TPS : c'est la durée totale (en secondes) du générique. Ca peut être un nombre entier, ou un nombre décimal. Gardez simplement à l'esprit que si cette durée totale ne peut pas être répartie également entre toutes les images (exemple, 5.21 secondes entre 6 images) alors le script se chargera lui même d'arrondir le tout pour que ca colle parfaitement.
    EXIT_IMGS : c'est un tableau qui répertorie l'ensemble des images à afficher. Toutes ces images doivent IMPERATIVEMENT se trouver dans Graphics/Title/Generique et l'ordre dans lequel vous mettrez ces images aura énormément d'importance. C'est dans cet ordre qu'elles s'afficheront. Si vous ne voulez pas activer le générique de fin, il vous suffira de ne rien mettre dans les crochets.
    EXIT_MSG : c'est le message qui sera affiché si le joueur tente de fermer le jeu. Pendant l'affichage de ce message (dans une boite de dialogue classique), le générique sera en pause jusqu'à ce que le joueur clique sur Ok. En mettant false au lieu d'une phrase, vous autoriserez le joueur à fermer le jeu pendant le générique.
    /!\ Par défaut, toutes les options sont réglées de facon à désactiver cette fonction.
    Revenir en haut 



      N'abusez pas du générique ! Ne collez pas un générique d'une demi heure pour raconter votre vie ! Non seulement, ca risque de souler passablement votre joueur, mais en plus il pourra toujours forcer la fermeture de votre jeu (via le gestionnaire des tâches) !
      Je pense qu'au delà de 5 secondes, votre générique sera trop long. A vous de voir, après, ce que vous voulez y mettre. Ca peut être les crédits de votre jeu, ca peut être le nom de votre forum, ca peut être un mot de remerciement, ... Bref, ca peut être pas mal de choses ^o^ On peut en faire défiler, des images, en 5 secondes !
      Souvenez vous aussi que ce générique s'affichera à chaque fois.
      Revenir en haut 



        Je ne sais pas ce que vous penserez de cette petite fonction supplémentaire, mais n'hésitez pas à tester puis à me laisser vos impressions. Je n'ai pas voulu faire un truc plus compliqué (en ajoutant des transitions plus élaborées, entre autre), mais ca n'est pas infaisable.
        Bien sur, comme d'hab, si vous utilisez ce script, pensez à moi =)
        Revenir en haut 

        Posté par Lén le 11 Nov - 23:49 (2009)
        Et si lorsque l'on fini le jeu la dernière commande d'un event est
        ExitGenerique.start
        suivit d'un téléport a la ville de départ par exemple, on ne quitte pas le jeu, mais on a le générique de fin après le conseil des 4 ... non ?

        En tout cas idée géééniale. Vive Sphinx !

        Posté par Angi-MK le 12 Nov - 02:12 (2009)
        Pourquoi les images doivent s'appeler "101", "46", etc... ??

        Posté par Gold le 12 Nov - 02:52 (2009)
        Ou sinon on fait son générique avec des évents.

        Posté par Sphinx le 12 Nov - 06:45 (2009)
        Lén a écrit:
        Et si lorsque l'on fini le jeu la dernière commande d'un event est
        ExitGenerique.start
        suivit d'un téléport a la ville de départ par exemple, on ne quitte pas le jeu, mais on a le générique de fin après le conseil des 4 ... non ?

        Imbécile heureux Ca affichera juste le générique de fin ^o^ Mais le générique de ligue est extrêmement long, d'habitude, donc je ne sais pas si c'est un bon choix que de l'afficher à la fermeture du jeu ^o^

        Angi-MK a écrit:
        Pourquoi les images doivent s'appeler "101", "46", etc... ??

        ? Hein ? Les images peuvent s'appeler comme tu veux ! Dans mes tests, jme suis foutu 5 images de couleurs différentes appelées exit1 à exit5 ^o^ Et du coup, j'ai mis "exit1", "exit2", "exit3", "exit4", "exit5" dans les crochets =)

        Gold a écrit:
        Ou sinon on fait son générique avec des évents.

        Clin d'œil foireux L'évent, faut qd même le lancer à la fermeture du jeu, mais ca peut être une solution

        Posté par Angi-MK le 12 Nov - 07:00 (2009)
        Sphinx a écrit:
        Angi-MK a écrit:
        Pourquoi les images doivent s'appeler "101", "46", etc... ??

        ? Hein ? Les images peuvent s'appeler comme tu veux ! Dans mes tests, jme suis foutu 5 images de couleurs différentes appelées exit1 à exit5 ^o^ Et du coup, j'ai mis "exit1", "exit2", "exit3", "exit4", "exit5" dans les crochets =)


        J'ai fait la même chose mais il persiste a me dire qu'il ne trouve point le fichier nommé "101" ...

        Posté par Sphinx le 12 Nov - 08:15 (2009)
        :? Bizarre... Tu px peut être tenter de refaire l'installation ?

        Ce soir, je testerai ca sous PSP0.7

        Posté par Lén le 12 Nov - 13:47 (2009)
        Le problème vient peut - être du fait que le RGSS attend une string qui sera entourée de guillemets et non un variable qui contient une string déjà entouré de guillemets ... Vous suivez ? :lol:
        Code:

        "maVar" =! "\"maVar\"" 

        Posté par Sphinx le 14 Nov - 17:29 (2009)
        >> ca peut tout aussi bien être
        Code:
        $game_variables[512] #<= variable n°512

        que
        Code:
        "mon_image.png"


        Clin d'œil foireux Le tout, c'est que la var contienne bien une string aussi Clin d'œil foireux


        edit :
        Non, ca marche pas chez vous ? ^^'

        Posté par RevengeOfShadow le 28 Aoû - 12:03 (2010)
        Hmmm j'ai vu que sur PSP DS y'avait un script qui permettait de faire ses crédits juste avec un back, le reste c'était du texte, je suis intéressé pour mon projet, vous pourriez me donner ce script ???