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

SDL Discussion :

Problème de temps.


Sujet :

SDL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut Problème de temps.
    Bonjour,

    Je suis entrain de developper un pett moteur 2D en C.
    J'utilise SDL, mais j'ai un problème de conception au niveau du temps dont je n'arrive pas a trouver de solution.

    Pour animer mes sprite j'ai besoin d'un entier temps et next = temps + (1 /FPS).

    Ce sont tous les deux des int. Pour connaitre le temps, j'utilise SDL_GetTicks().

    Seul problème, en faisant cela j'ai un risque d'overflow lié à la taille d'un entier donc je module mon temps et mon next par une constante afin de ne jamais avoir d'overflow.


    Seul problème, quand je fait cela il m'arrive que le temps modulé reviennent à 0 alors que next lui se situe juste avant la limite de module, ce qui entraine au niveau du jeu un blocage de l'animation des sprite car temps n'est pas supérieur à next.

    J'aurais aimé savoir comment dépasser ce problème.

    J'avais penser à user un uint32, mais celà ne change pas qu'a un moment donné je risque un overflow.

    Merci d'avance.

  2. #2
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    En général on fait quelque chose dans ce genre pour rester simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    unsigned int timeToWait = 1000 / 40;               // Affichage à 40 fps
    unsigned int lastTime = 0;
     
    // Dans la boucle
    if(SDL_GetTicks() > (timeToWait + lastTime) )
    {
        lastTime = SDL_GetTicks();
     
        // Opérations à faire dans le timer
    }
    Fiquet
    - FAQ SDL
    - FAQ C++

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pouirquoi risquerais-tu un dépassement de capacité, au juste ?

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    En faite je me dit que je retient le temps dans une variable de type int
    Hors un int a une taille finit au bout de 65 000, il se passe un overflow et je voulais éviter cela, en modulant le resultat de SDL_GetTick() par un certain chiffre.

    Seul problème je me suis rendu compte qu'au momebt de moduler un cas de figure apparaissait, celui ou le temps next n'a pas été modulé (donc on va dire next = 1 999) et la varible temps, elle l'a été.Ce qui fait que pour avoir l'image suivante je dois attendre 1 999 seconde.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    SDL_GetTicks renvoie un entier non signé sur 32 bits, ce qui est largement suffisant pour ne pas avoir de dépassement. En général il est raisonnable de supposer que le type de retour d'une fonction est capable de contenir la valeur renvoyée. Maintenant, si tu récupères ce résultat dans un entier plus petit, et bien... tu sais ce qu'il te reste à faire.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    D'accord, je vais mettre un Uint32 pour le temps eet next
    CA devra duré 4 Millard de second environ

    Merci bien

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Il est a savoir qu'avec SDL_gfx il y a un module super qui gère les FrameRate et tout plein d'autes fonctions assez utiles
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 168
    Points : 140
    Points
    140
    Par défaut
    Merci
    Je me demandais si j'avais oublié de mettre resolu
    Je vais y jeter un coup d'oeil

  9. #9
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    dans la doc de SDL, ils ont eut la bonne idée de preciser que justement on peut faire tourner un programme pendant environ 1 mois avant de depasser la capacitée...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

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

Discussions similaires

  1. Arrêter un prog si temps de connexion trop long
    Par jakouz dans le forum Langage
    Réponses: 4
    Dernier message: 22/10/2002, 19h28
  2. Réponses: 8
    Dernier message: 18/09/2002, 04h20
  3. temps d'un mp3
    Par CorO dans le forum Langage
    Réponses: 6
    Dernier message: 15/09/2002, 19h43
  4. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 12h49
  5. repertoire temp dynamique
    Par killpilot dans le forum C
    Réponses: 2
    Dernier message: 26/04/2002, 17h19

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