IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API graphiques Discussion :

Animations et vitesse de jeu


Sujet :

API graphiques

  1. #1
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut Animations et vitesse de jeu
    Bonjour,

    Dans le cadre d'un jeu en 2D, je souhaite faire une animation d'attaque à l'épée décomposée en 3 mouvements par direction (gauche, droite, haut et bas).

    J'ai donc mon tableau d'images en mémoire nommé images[4][3] par exemple.

    J'ai séparé l'affichage du "moteur de jeu" qui fait les calculs donc j'ai une boucle évènementielle de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    // init d'un timer qui produit un fps de 60
    install_int_ex(ticker, BPS_TO_TIMER(60));
     
    // boucle de jeu
    while (!key[KEY_ESC])
        {
            while(ticks > 0)
            {
                int old_ticks = ticks;
     
                // traitements des actions (déplacements, animations...)
                doLogics(zoneJeu, menu, all, zelda, mondeCourant, inventaire);
     
                ticks--;
                if(old_ticks <= ticks)
                {
                    break;
                }
            }
     
           // affichage du resultat
          DrawResult();
    }
    Avant de séparer cela, mon animation s'effectuait de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int direction = LEFT; // par exemple pour un attaque sur la gauche
    for (i=0; i<4; i++)
            {
                afficherAnimationEnMemoire(images[direction][i])
                refreshScreen(page);
                rest(80); // attends pour voir le détail de l'animation
            }
    Seulement maintenant ca ne marche plus vu que l'affichage est dissocié du reste.

    Et je n'arrive pas à trouver le bon moyen pour faire des animations fluides... Peu être avec un autre timer ? (mais je suis pas trop timer... trop de timers tue le timer ! )

    Merci à vous !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  2. #2
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Bonjour, et bien généralement, les animations sont cadencées avec le reste de l'application. Par exemple, si nous affichons 60 images par secondes, la durée de la frame est donnée et l'animation avance à chaque frame de ce temps donné. Donc Cela permet d'avoir un seul timer

    Dans ton cas, tu peux définir la durée de ton animation, 1 seconde pour un coup d'épée par exemple, si tu tourne à 60fps ( généralement la fréquence de l'affichage, cela peux causé certains bug sinon, comme des sauts trop court car la fréquence d'affichage est trop petite (déjà vu sur un portage commercial très connu ) ). Cela fera donc 1 mouvements toutes les 0.2 secondes un petit test if suffis ou un événement.

    je ne sais pas si ça répond à ta question, j'espère que ça ta aidé un peu.
    Homer J. Simpson


  3. #3
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Je t'avouerais que j'ai bien bien compris où tu veux un venir

    Pourrais tu me mettre un petit algo en pseudo C pour m'illustrer ton idée ?

    merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  4. #4
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Et bien un psedo code comme ça a froid je pense pas mais une chose qui est utilisé dans les moteurs comme havok animation par exemple:
    Perso je me base sur la fréquence d'affichage pour plusieurs raison.
    1ère : un rafraichissement de 30hz et ~60 fps c'est la moitié d'image inutilement calculé, donc une perte de temps pour d'autre calcul plus important.
    2ème : En environnement mutlithread, ne calculer le rendu que de ~30 fps, généralement un peu plus quand même, ça laisse plus de temps processeur pour les autres calcules ( physique, IA )
    3ème : Sur du mobile, cela économise de l'énergie car moins de calcul inutile, moins de chauffe, moins de consommation
    Récupérer la fréquence d'affichage
    Initilialisé le timer
    Créer les threads, si besoin.
    Debut boucle de jeu fréquencé un peu au dessus de la fréquence d'affichage
    | Lancer les threads ( physique, IA , animation), partie calcul en donnant le temps de rendu de la frame précedente, cela permets de ne pas voir l'animation accélérer ou ralentir sur des changements brusques de framerate et de garder quelque chose de cohérent..
    | Faire le rendu, attendre la fin de tout les threads!
    fin de la boucle
    Pourquoi est-ce si utile? Et bien NTFS, PAL on des fréquences de rafraichissement différente. Les consoles et les pc ont des puissance CPU et GPU différente.
    Utiliser un temps fixe peut causer des problèmes sur des fréquences d'affichages différent.Tony Hawk's pro skater avait eu ce bug ou sur PAL un saut était possible et NTSC pas possible car la gravité avais un impact plus élevé sur les haute fréquences, résultat un passage n'était pas possible sur NTSC et donc pas de chance pour les joueurs .

    Bref sous cette parenthèse, je ne pense pas que ton jeu utilise de la physique, mais tu peux utiliser ce principe pour le cadencement de l'animation. Tu définis pour une animation une séquence d'image, et un temps pour la jouer entièrement. Tu trouveras avec ce temps maximum et le nombre d'image la fréquence d'affichage de chaque image.Une version simple oldschool:

    Creer liste d'image pour l'animation (std::vector et initialiser iterator sur l'élément 0)
    Debut Boucle de jeu
    |
    | Capture(TempsDeJeu)
    | Si tempsFrequence >= TempsDeJeu - TempsFinDerniereAnimation
    | | Rendre l'iterator
    | | ++iterator
    | | Capture(TempsDerniereAnimation)
    | FinSi
    |
    Fin Bouble de jeu
    En espérant t'avoir aidé.

    Edit : j'ai modifié le dernier algo un peu plus compréhensible.
    Homer J. Simpson


  5. #5
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Je reviens pour rajouter qu'il y d'autres méthodes pour gérer le cadencement, une que j'apprécie particulièrement est d'avoir un timer qui averti les modules (animation compris) de se lancer au moyen d'un pattern observer. Le timer dans un thread à part qui peut servir à toute sorte de choses qui demande une tempo. Il faut le stopper lorsque personne n'est inscrit sur ce timer (très rare) et et le lancer lorsqu'une demande de temporisation est demandé. Il avertira au moyen d'un "message" l'inscrit qu'il peut y allez.
    Homer J. Simpson


  6. #6
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Ok merci pour vos infos

    Donc pour gérer deux animations en même temps avec un cadencement de 60 fps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    while (!quit)
    {
        // gestion du candencement ) 60 fps
        while (ticks > 0)
        {
             // make first animation
             if (...)
             {
                 frame_tick++;
                 if (frame_tick >= ticks_per_frame)
                 {
                      frame_tick = 0;
                      frame++;
     
                      if (frame >= MAX_FRAME)
                          frame = 0;
                 }
     
            }
     
            // make second animation
            if (...)
            {
                frame_tick2++;
                if (frame_tick2 >= ticks_per_frame2)
                {
                      frame_tick2 = 0;
                      frame2++;
     
                      if (frame2 >= MAX_FRAME2)
                          frame2 = 0;
                }
            }
     
            ticks--;
        }
     
        // maj de l'écran
        DrawResultOnScreen();
    }
    Mais comme vous le voyez, je duplique les variables, ca marche bien, chaque animation a ses variables ce qui fait que je peux les exécuter simultanément.

    Seulement si je veux faire N animations, je vais pas m'amuser à copier/coller le code N fois ^^

    N'y a t-il pas un moyen de faire une foncion générique pour toues les animations ? ca serait le pied ! Mais je m'arrache les cheveux et je trouve pas

    Merci !
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  7. #7
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    N'y a t-il pas un moyen de faire une foncion générique pour toues les animations ?
    Il y a de grande chance que si mais avec le code là je ne vois pas trop. A ce que je vois la différence entre les frames n'est que le ticks_per_frame, le MAX_FRAME et le frame_tick. une fonction ou tu passe ses variables en paramètres?

    Et si l'animation est étais un objet ou tu encapsules les informations nécessaire à jouer l'animation? avec ses propres images, son propore ticks_per_frame, et son propre MAX_FRAME et son propre frame_tick? ça ne pourrai pas aller?
    Homer J. Simpson


  8. #8
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Points : 1 156
    Points
    1 156
    Par défaut
    Difficile de donner des conseils avec si peu d'infos.
    En C++ tu aurais une classe SpriteAnim avec une fonction display qui prendrais le timer ou la frameCount en param et puis ton objet se chargerais du reste.

    La c'est a toi de voir dans ton archi (en C ?) comment incorporé le concept.

  9. #9
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Je code en C++

    J'ai créé une classe Animation et ca semble fonctionner mais je dois faire des tests.

    Je reviendrais parmi vous si ca marche pas

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

  10. #10
    Expert confirmé
    Avatar de Aspic
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    3 905
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2005
    Messages : 3 905
    Points : 4 388
    Points
    4 388
    Par défaut
    Finalement ca passe en encapsulant tout dans une classe

    Merci
    Qui ne tente rien n'a rien !
    Ce qui ne nous tue pas nous rends plus fort !!
    Mon projet ZELDA en C++/Allegro
    http://www.tutoworld.com - Le Forum -
    Mes ressources Dotnet (cours, sources, tutos)
    --------------------------------------------
    + + =

    Ne pas oublier le Tag !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Animation à plusieurs vitesses
    Par Pouettee dans le forum Android
    Réponses: 9
    Dernier message: 14/11/2014, 11h11
  2. Faire une animation XML dans un jeu
    Par darkpio dans le forum Android
    Réponses: 12
    Dernier message: 03/11/2013, 09h47
  3. Vitesse d'un gif animé
    Par lucas-18 dans le forum Access
    Réponses: 1
    Dernier message: 25/10/2004, 08h29
  4. Réponses: 6
    Dernier message: 30/06/2004, 08h16
  5. [SWT]jeu n'affiche pas l'animation
    Par miel_pops dans le forum SWT/JFace
    Réponses: 4
    Dernier message: 20/05/2004, 19h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo