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

C Discussion :

probleme avec la vitesse du While


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 6
    Par défaut probleme avec la vitesse du While
    Bonjour,

    Je dois faire un jeu qui s' appelle Envahisseur de l'espace (le jeu d arcade). En faite j' arrive à afficher un missile du vaisseau joueur sauf que je voudrai voir le déplacement du missile parce que quand je fais un tire le missile se positionne instantanément à la position final, je pense que c'est à cause du while c'est pour ça que je voudrais réduire la vitesse du while pour que le déplacement du missile soit visible par l œil humain mais il faut que le missile bouge en même temps que les vaisseaux ennemies par exemple le mouvement des missiles ne doivent pas bloquer les mouvements des autres vaisseaux, j ai pensé à utiliser sleep,usleep,nanosleep mais le problème je pense que ça va bloquer les autres mouvements des vaisseaux et je n ai pas le droit d utiliser de thread. Mais je n'arrive pas et je voudrai votre aide svp.
    Voici le code : getTime() est une fonction qui contient une structure timeval et un gettimeofday qui a pour argument la structure et retourne un temps.
    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
     
    struct pollfd fds[1];
    fds[0].fd = STDIN_FILENO;
    fds[0].events = POLLIN;
     
    int v = 1200;
    double oldV =v;
     
    	while(1){
    		clear();
    		print_map(carte);
     
    		double bPoll= getTime();
    		tou = poll(fds, 1, v);
    		t[0] = tou;
     
    		if(t[0] == 0){
                             //mouvements des vaisseaux ennemies qui bougent tous seul en boucle
                   }else read(0, tou, 1);
     
                   if (t[0] == 32){
    		  while(i > 75){// ici mon problème
    		      if(upRock(carte,i,j,vaisseaux[1]) == 0){ // i et j sont les positions de départ du missile et upRock va modifier la position du missile dans la carte 
    				        i--;                                          et affiche au fur à mesure les nouvelles position du missile grâce print_map(carte)
    		     }
    		  }
                  }
     
                    double aPoll= getTime();
    		if(t[0] != 0){
    			v = v - (aPoll-bPoll);
    		}else{
    			v = oldV;
    		}
     
    }
    Merci d' avance .

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 312
    Par défaut
    Tu peux utiliser la fonction sleep qui va attendre le nombre de secondes données en paramètre.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Invité
    Invité(e)
    Par défaut
    sleep() prend un entier en seconde et ça risque d'être un peu long. Si c'est le cas il y a usleep() et nanosleep() qui fonctionnent bien. Voici quelques éléments de départ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdlib.h>
    #include <time.h>
    #include <sys/time.h> // supprime le warning avec C99
    #include <unistd.h>
     
    ...
     
    struct timespec timer;
    timer.tv_sec=0;
    timer.tv_nsec=1e5; // durée en ns
    usleep(100); // temps en µs
    nanosleep(&timer,NULL); // temps en ns
    ...
    Par curiosité tu utilises quelle librairie graphique ?

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 6
    Par défaut
    Bonjour,

    Merci de vos réponses . Le problème si j'utilise un sleep dans le while du missile, ça va bloquer les autres mouvements des vaisseaux ennemies. Alors que tous les déplacements dois se faire en même temps que ce soit le missile ou soit les vaisseaux. Auriez-vous une autre solution ?
    A quoi correspond 1e5 ( timer.tv_nsec=1e5 ?
    J utilise un termios pour l interface graphique.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par maestro94 Voir le message
    Bonjour,

    Merci de vos réponses . Le problème si j'utilise un sleep dans le while du missile, ça va bloquer les autres mouvements des vaisseaux ennemies. Alors que tous les déplacements dois se faire en même temps que ce soit le missile ou soit les vaisseaux. Auriez-vous une autre solution ?
    - modifier le pas de déplacement du missile ?
    - implémenter des threads ?

    Citation Envoyé par maestro94 Voir le message
    A quoi correspond 1e5 ( timer.tv_nsec=1e5 ?
    J utilise un termios pour l interface graphique.
    1e5 signifie 1*10 puissance 5 donc 100 000
    Je ne connaissais pas termios, merci je vais chercher comment ça fonctionne
    Dernière modification par Invité ; 14/05/2017 à 14h57.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 6
    Par défaut
    oui il faut que je modifie le déplacement du missile sans que je bloque le déplacement des autres vaisseaux en gros si je tire mon jeu va se figer sauf le tir du missile. Il faut que tous doit se déplacent en même temps. Je n ai pas le droit d' utiliser de thread.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Ça fait songer à la gestion d'un système multiagent. À chaque pas de temps il faut mettre à jour les positions de chaque agent avec des pas suffisamment faibles pour donner un impression de fluidité et une vitesse compatible avec la vitesse de réaction d'un joueur.

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 6
    Par défaut
    Du coup quelles solutions pouvez vous me proposer ? svp

  9. #9
    Invité
    Invité(e)
    Par défaut
    J'en ai présenté les principes ici mais pour des réponses plus détaillées il faut avoir du code plus détaillé aussi Si j'ai compris le problème, c'est-à-dire qu'il faut ralentir la progression du missile tout en laissant la main au système pour ne pas figer le jeu il suffit de diminuer sensiblement les pas (incréments des positions) jusqu'à une valeur adéquate.

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Fais-toi une liste de projectiles en plus de la liste de vaisseaux. Chacun de ces objets doit contenir des coordonnées et des valeurs indiquant sa vitesse (x, y, dx, dy).
    À chaque "tic" du jeu, tu déplaces chaque objet en ajoutant sa vitesse à ses coordonnées, puis tu fais un usleep() pour attendre le prochain "tic"...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 495
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    À chaque "tic" du jeu, tu déplaces chaque objet en ajoutant sa vitesse à ses coordonnées, puis tu fais un usleep() pour attendre le prochain "tic"...
    Étape suivante : synchroniser les « tics » sur la VBL, mais chut…

  12. #12
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Étape suivante : synchroniser les « tics » sur la VBL, mais chut…
    Une VBL, Sur un pC? Tu ne serait pas un atariphile?

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 6
    Par défaut
    Bonjour j ai un autre probleme, voila je voudrai donner des valeurs à une autre structure mais ça me met une erreur de segmentation fault pouvez vous m aider svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct Vaisseaux{
              Ship* navire;
    }
    et on va dire que Ship est une structure qui contient des donnes (struct Ship { int missile, char* sympbol, ...})

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int maint(....){
           Ship bateau; // contient déjà des donner
           Vaisseau ennemies;
            *ennemies.navire = ship;
    }

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Si tu veux modifier le pointeur, et non pas la donnée pointée, ne met pas l'étoile.

    PS: Est-on supposé pouvoir modifier les structures Ship? Si ce n'est pas le cas, envisage de déclarer le pointeur en tant que const Ship*.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre averti Avatar de no. 26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2017
    Messages : 13
    Par défaut
    Citation Envoyé par maestro94 Voir le message
    Bonjour j ai un autre probleme, voila je voudrai donner des valeurs à une autre structure mais ça me met une erreur de segmentation fault pouvez vous m aider svp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    struct Vaisseaux{
              Ship* navire;
    }
    et on va dire que Ship est une structure qui contient des donnes (struct Ship { int missile, char* sympbol, ...})

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int maint(....){
           Ship bateau; // contient déjà des donner
           Vaisseau ennemies;
            *ennemies.navire = ship;
    }
    Faire attention également que la variable bateau n'est pas une variable ayant été alloué dynamiquement. Dès que tu sors du contexte de ta fonction, cette variable "disparaît", ce qui peut alors provoquer un segfault si tu tentes de lire ton ennemies.navire par la suite..

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 6
    Par défaut
    J ai trouvé une solution mais je voudrais votre avis :

    Voilà un code d un exemple de mon code :

    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
    struct Vaisseaux{
        Ship* navire;
    }
     
    struct Ship{
          int missile;
          int x;
          int y;
    }
     
    int main(int argc, char* argv[]){
          Vaisseaux* bateau = malloc(sizeof(Vaisseaux));
          Ship* ennemies;// on a déjà des contenues au préable dans la variable ennemies par exemple ennemies[1].missile = 1,ennemies[1].x =2,ennemies[1].y= 3
          for(int i = 0; i < 10; i++){
                  bateaux[i].navire = &ennemies[1];
          }
          return 1;
    }
    Si je modifie dans bateaux[1].navire->missile = bateaux[1].navire->missile - 1; c 'est comme si je modifié aussi dans bateaux[2].navire->missil, bateaux[3].navire->missile ... bateaux[i].navire->missile donc tous les bateaux[i].navire->missile auront tous cette nouvelle valeur ?

  17. #17
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Pour commencer, ces valeurs missile, x et y, que représentent-elles?
    Qu'est-ce qu'une structure Ship par rapport à une structure Vaisseaux? Il est difficile de comprendre ce que tu cherches à faire du fait de ton mélange de français et d'anglais, de singulier et de pluriel...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. probleme avec la vitesse du calcul
    Par kroma23 dans le forum Débuter
    Réponses: 6
    Dernier message: 23/10/2008, 19h17
  2. probleme avec la boucle do while
    Par manciaux dans le forum C
    Réponses: 11
    Dernier message: 16/05/2007, 15h04
  3. [VBA-E] PRobleme avec une boucle DO..LOOP WHILE
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 31/07/2006, 01h04
  4. Probleme avec WHILE
    Par beb30 dans le forum C
    Réponses: 14
    Dernier message: 05/04/2006, 14h40
  5. Problème avec un while...
    Par pcdj dans le forum Linux
    Réponses: 7
    Dernier message: 17/10/2005, 22h24

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