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 :

Gérer plusieurs mouvements "en même temps"


Sujet :

SDL

  1. #1
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut Gérer plusieurs mouvements "en même temps"
    Bonjour,
    Je suis toujours à mon petit programme de pacman. Le pacman (personnage) fonctionne mais je n'arrive pas à faire bouger les fantômes comme il faut. Il faudrait qu'ils bougent même quand pacman est à l'arrêt à une vitesse qui augmenterait à chaque niveau. J'ai regardé sur le site et j'ai trouvé ceci:
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Tant que le jeu continue:
       Si assez de temps s'est écoulé depuis la dernière boucle
          Mettre à jour le joueur
          Mettre à jour le monde (monstres & co)
          Afficher
       Sinon
          Attendre un tout petit peu
       Fin si
    Fin tant que
    J'ai bien la boucle tant que le jeu continue, mais je ne vois pas comment mettre la boucle avec le temps en place.

    Auriez-vous un code exemple ou un tutoriel plus complet à me montrer ? J'ai déjà cherché sur ce site, sur Google,... mais rien d'assez explicatif pour moi.

    Merci d'avance encore pour votre aide.

  2. #2
    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 : 40
    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
    Cette boucle contient plein de code inutile pour débuter, en gros elle régule le temps de mise à jour pour ne pas surcharger le CPU. Tu peux faire simple pour commencer, et te préoccuper de ça après.

    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Tant que le jeu continue:
       Mettre à jour le joueur
       Mettre à jour le monde (monstres & co)
       Afficher
    Fin tant que

    As-tu également jeté un oeil à nos tutoriels SDL ?
    http://jeux.developpez.com/tutoriels/#a_sdl

  3. #3
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    J'en suis déjà là

    Mais les fantômes bougent seulement quand le pacman bouge donc je réagis avec le clavier uniquement en ce moment. Il faudrait que le mouvement des fantômes soit indépendant, non? Je vois mal comment je pourrais le faire autrement.

    P.S: Je débute avec SDL ça fait 5 jours que je suis dessus.

    Edit:
    As-tu également jeté un oeil à nos tutoriels SDL ?
    http://jeux.developpez.com/tutoriels/#a_sdl
    Oui, mais je n'ai pas trouvé comment reproduire ce que je cherche.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Normalement, le monde extérieur et le joueur sont, je pense, distinct.
    Le monde extérieur ne doit pas réagir aux évennement, contrairement au joueur.

    Dans "Mettre à jour le joueur" il va falloir gérer un éventuel évennement (conditions sur les touches appuyées puis calcul de colision, de nouvelle coordonnées...) mais dans "Mettre à jour le monde (monstres & co)" la routine sera toujours active, quelque soit l'évennement produit par le joueur.

  5. #5
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Je vais vous faire un résumé de mon code actuel:
    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
     while (continuer){
        SDL_WaitEvent(&event);
        switch(event.type){
        case SDL_QUIT:
          continuer =0;
          break;
        case SDL_KEYDOWN:
          switch(event.key.keysym.sym){
          case SDLK_ESCAPE:
    	continuer =0;
    	break;
          case SDLK_UP:
    	pacmanActuel = pacman[HAUT];
    	deplacerJoueur(carte, &positionJoueur, HAUT,pscore);
    	break;
          case SDLK_DOWN:
    	...
          default:
    	break;
          }
        default:
          break;
        }
     
        // Effacement de l'ecran
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
     
        //Déplacement des fantômes
        for (i =0 ; i<4; i++){
          deplacementFantome(carte,&ghost[i],&positionJoueur);
        }
     
        // Placement des objets a l'ecran
        ....
    }
    Et comme il est là, les fantômes bougent seulement quand j'appuie sur une touche. Ce n'est pas normal puisque ce n'est pas dans le switch...

  6. #6
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Si tu utilises SDL_WaitEvent, c'est normal, il faut utiliser SDL_PollEvent. Attention de bien tester le retour de la fonction :

    http://www.developpez.net/forums/sho...d.php?t=276536

    Jc

  7. #7
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Avec la méthode à ne pas faire, les fantômes bougent bien. Mais beaucoup trop vite et il me bouffe 45% du CPU.

    Mais avec SDL_PollEvent dans une boucle, ça revient au même qu'avec SDL_WaitEvent (bouger pacman pour faire bouger les fantômes).

    Pour les retours de fonction, je vais le faire. Il faut le faire avec tous les appels SDL? Ca va en faire quelque uns.

    Edit: quelques minutes de bidouille plus tard:
    Juste pour m'assurer que c'est bien comme celà pour imbriquer les boucles:
    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
     while (continuer){
        while (SDL_PollEvent(&event)){
          switch(event.type){
          case SDL_QUIT:
    	continuer =0;
    	break;
          case SDL_KEYDOWN:
    	switch(event.key.keysym.sym){
    	case SDLK_ESCAPE:
    	  continuer =0;
    	  break;
    	case SDLK_UP:
    	  pacmanActuel = pacman[HAUT];
    	  deplacerJoueur(carte, &positionJoueur, HAUT,pscore);
    	  break;
    	case SDLK_DOWN:
              ....
          } //fin switch
         } //fin while PollEvent
     
         // Effacement de l'ecran
          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
     
          //Déplacement des fantômes
          for (i =0 ; i<4; i++){
    	deplacementFantome(carte,&ghost[i],&positionJoueur);
          }
          ...
    } //fin while continuer
    Dans ce cas-ci, les fantômes bougent à toute vitesse et j'atteinds les 45% du CPU.

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par v4np13
    Avec la méthode à ne pas faire, les fantômes bougent bien. Mais beaucoup trop vite et il me bouffe 45% du CPU.
    Je ne sais pas de quelle méthode tu parles. Ajoute un SDL_Delay pour faire descendre l'utilisation CPU ou utilise SDL_framerate qui se trouve dans la bibliothèque SDL_gfx.

    Mais avec SDL_PollEvent dans une boucle, ça revient au même qu'avec SDL_WaitEvent (bouger pacman pour faire bouger les fantômes).
    Non, ce n'est pas pareil, SDL_PollEvent est non bloquant.

    Pour les retours de fonction, je vais le faire. Il faut le faire avec tous les appels SDL? Ca va en faire quelque uns.
    Et oui mais c'est une bonne pratique et si tu avais fais cela depuis le début, y aurait moins à faire maintenant .

    Jc

  9. #9
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Citation Envoyé par v4np13
    Juste pour m'assurer que c'est bien comme celà pour imbriquer les boucles:
    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
     while (continuer){
        while (SDL_PollEvent(&event)){
          switch(event.type){
          case SDL_QUIT:
    	continuer =0;
    	break;
          case SDL_KEYDOWN:
    	switch(event.key.keysym.sym){
    	case SDLK_ESCAPE:
    	  continuer =0;
    	  break;
    	case SDLK_UP:
    	  pacmanActuel = pacman[HAUT];
    	  deplacerJoueur(carte, &positionJoueur, HAUT,pscore);
    	  break;
    	case SDLK_DOWN:
              ....
          } //fin switch
         } //fin while PollEvent
     
         // Effacement de l'ecran
          SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
     
          //Déplacement des fantômes
          for (i =0 ; i<4; i++){
    	deplacementFantome(carte,&ghost[i],&positionJoueur);
          }
          ...
    } //fin while continuer
    Dans ce cas-ci, les fantômes bougent à toute vitesse et j'atteinds les 45% du CPU.
    Nos posts se sont chevauchés C'est pour avoir confirmation avant de me lancer dans la suite.

  10. #10
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Oui c'est comme cela qu'il faut faire. Ajoute un gestionnaire de nombres d'images par seconde, un exemple :

    http://fearyourself.developpez.com/t...e-moteur/#L2.2

    Et il faudra que ton déplacement des personnages soit fait par rapport au temps, comment le géres-tu ?

    Jc

  11. #11
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Merci pour ta réponse

    Pour le déplacement des personnages, j'ai activé la répétition du clavier à 80ms pour le pacman, je vais essayer de mettre au point un truc avec SDL_Delay pour qu'il aille à la même vitesse pour les fantômes.

    Cette vitesse changera d'un niveau à l'autre.

    Mais ce sera pour demain

    Encore merci pour ton aide et bonne nuit

  12. #12
    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 : 40
    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
    Pour le déplacement des personnages, j'ai activé la répétition du clavier à 80ms pour le pacman, je vais essayer de mettre au point un truc avec SDL_Delay pour qu'il aille à la même vitesse pour les fantômes
    SDL_Delay va bloquer toute ton appli, il vaut mieux calculer les déplacements proportionnellement au temps écoulé depuis le dernier tour de boucle pour assurer une vitesse constante.

  13. #13
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Je me suis basé sur ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       if (SDL_GetTicks() > (checkTime + 1000/1)){ // 1 fois par seconde
    	/* On remet à jour le temps à contrôler */
    	checkTime = SDL_GetTicks();
    	//Déplacement des fantômes
    	for (i =0 ; i<4; i++){
    	  deplacementFantome(carte,&ghost[i],&positionJoueur);
    	}
        }
    Ca se trouve dans le while continuer.

  14. #14
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par v4np13
    Je me suis basé sur ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
       if (SDL_GetTicks() > (checkTime + 1000/1)){ // 1 fois par seconde
    	/* On remet à jour le temps à contrôler */
    	checkTime = SDL_GetTicks();
    	//Déplacement des fantômes
    	for (i =0 ; i<4; i++){
    	  deplacementFantome(carte,&ghost[i],&positionJoueur);
    	}
        }
    Ca se trouve dans le while continuer.
    Oui mais comme le disait Laurent, ce n'est pas la bonne méthode puisque tu bloque le programme complet. Il vaut mieux faire bouger plus lentement tes fantômes.

    Jc

  15. #15
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Le pacman peut bouger et s'arreter tandis que les fantômes bougent toutes les secondes indépendamment aux mouvements du pacman.

    C'est bien le but recherché, le if est indépendant au reste. Il teste, si oui, les fantômes bougent, si non on continue avec l'affichage du pacman, des décors,...

  16. #16
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par v4np13
    Le pacman peut bouger et s'arreter tandis que les fantômes bougent toutes les secondes indépendamment aux mouvements du pacman.

    C'est bien le but recherché, le if est indépendant au reste. Il teste, si oui, les fantômes bougent, si non on continue avec l'affichage du pacman, des décors,...
    Exact, j'avais lu en diagonale. Par contre, si tu veux ajouter une gestion d'animations cela va devenir tout de suite plus compliqué, non ?

    Jc

Discussions similaires

  1. [VS2008] Ajout de plusieurs solutions items en même temps
    Par Scheid dans le forum Visual Studio
    Réponses: 1
    Dernier message: 04/04/2008, 22h33
  2. Executer un code en java sur plusieurs fichiers xml en même temps
    Par med_ellouze dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 12/08/2007, 16h33
  3. Plusieurs requêtes INSERT en même temps
    Par jeyce dans le forum JDBC
    Réponses: 3
    Dernier message: 06/11/2006, 09h42
  4. Réponses: 7
    Dernier message: 05/06/2006, 13h44

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