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

GLUT Discussion :

[langage C][débutant] un vaisseau qui tire


Sujet :

GLUT

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut [langage C][débutant] un vaisseau qui tire
    Bonjour,

    je cherche à développer un mini jeu d'avion, mais je suis débutant en langage C et suis en train d'apprendre OpenGL.
    Je ne sais pas comment implanter les tirs du vaisseau, ce vaisseau se déplace uniquement de gauche à droite horizontalement.
    Les tirs vont se déplacer verticalement vers le haut de l'écran.

    Dois-je stocker les tirs dans un tableau puis les afficher au fur et à mesure, ou les créer dynamiquement à chaque pression sur la touche de tir ?

    Des idées svp ?

    Merci .

    EDIT :
    Désolé, j'ai oublié de préciser que j'utilisais GLUT...
    Si un modérateur pouvait déplacer ce topic dans la partie adéquate ce serait sympa, merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Tes questions sont un peu vague, il faudrait que tu cible un peu plus le sujet et ce que tu attend de nous (c'est seulement des idées que tu veux ou peut-être la manière de faire avec l'outil OpenGL/GLUT ... ??? pke si c'est que des idées je sais pas si c'est t'es dans la bonne partie du forum).

    Citation Envoyé par shinkyo
    Dois-je stocker les tirs dans un tableau puis les afficher au fur et à mesure, ou les créer dynamiquement à chaque pression sur la touche de tir ?
    Là il faut à mon avis qe tu les crées dynamiquement et que tu les stockes dans un tableau ou une liste.
    Tu peux par exemple créer une classe tir avec comme attributs des coordonnées. Lorsque le joueur presse le bouton tu initialises un tir avec la position du vaisseau puis tu incrémentes à chaque boucle l'ordonnée de chaque tir pour qu'on est l'impression que le projectile se déplace verticalement.
    Pour afficher les tirs tu n'a qu'à allumer les bons pixels mais après, tout dépend de ce que tu veux (forme, déplacement des projectiles, ...)

  3. #3
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Ca serait plus simple de le faire en C++ à mon avis, pour profiter de l'orienté objet; Ainsi tu pourrais créer une classe projectile, une classe fille missile; tu stockerais tes objets de type missile dans un tableau ou une collection, puis à chaque raffraichissement, tu donnerais la responsabilité au missile de se diriger et de se déplacer lui même

    Avantage : le jour où tu décideras de faire un missile auto guidé, tu n'auras pas à t'arracher les cheveux A+
    K

  4. #4
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut
    Bonjour,

    mon problème est que je dois coder en C (que je ne connais presque pas malheureusement), ce qui est dommage je trouve aussi...l'objet étant intéressant pour ce projet là.
    J'ai pensé à créer une structure tir (à défaut de pouvoir faire des classes), avec les coordonnées du tir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct tir {
       float x;
       float y;
    }
    Je crée ensuite un tableau qui va contenir les tirs.

    C'est pour le déplacement que ça me pose un problème...
    J'ai pensé passer par un timer qui se lance dès qu'on appuie sur la touche tir, par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glutTimerFunc(60, timerTir, 0);
    Et ma méthode timer fait une translation sur y :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void timerTir(int val)
    {
      if (yTir <= 20) /* taille de l'écran */
        yTir += yTir1;
     
      glutPostRedisplay();
      glutTimerFunc(60, timerTir, val);
    }
    Le problème est que je ne peux tirer qu'une seule fois...

    Je recherche des idées d'implémentations, mais aussi des outils GLUT pour les appliquer (dois-je passer par un timer ? y'a t-il autre chose de plus efficace ?)
    Mais c'est vrai qu'à y repenser, j'ai peut-être plus de problèmes algorithmiques que des problèmes techniques liés à GLUT...

    Merci.

  5. #5
    Rédacteur
    Avatar de MrDuChnok
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2002
    Messages
    2 112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 112
    Points : 4 240
    Points
    4 240
    Par défaut
    si j'ai bien compris ton problème c'est que tu ne peux gérer qu'un missile à la fois ? c'est bien ça ?

    Donc tu ferai mieu d'utiliser les listes chaînées (ou au moins les tableaux) pour stocker toutes tes structures de missiles. Si tu ne vois pas comment faire une liste chainée tu peux allez faire un tour sur la FAQ ou dans les tutoriaux tu devrai trouvé ton bonheur.

    Après normalement si tu fait une application opengl, tu doit avoir une fonction principale qui gère les dessins, pourquoi tout simplement tu ne bouge pas ton missile dans cette dernière ?

    A chaque tour dans ta boucle principale, tu parcours ta liste de missiles, tu les bouge si nécessaire, tu les dessine, etc. non ?
    Si vous jugez mon post utile dans la résolution de votre problème, n'hésitez pas à utiliser le système de vote afin d'améliorer la qualité du forum

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut
    Ok...en fait je me disais que je n'avais aucun déplacement...j'avais oublié un glFlush() dans la fonction appelée lorsqu'on appuie sur une touche.
    Maintenant, j'ai un ptit souci à propos de ce qu'a dit Corpio.

    Citation Envoyé par Corpio
    [...]Lorsque le joueur presse le bouton tu initialises un tir avec la position du vaisseau puis tu incrémentes à chaque boucle l'ordonnée de chaque tir pour qu'on est l'impression que le projectile se déplace verticalement.
    Cette boucle dont tu parles, je la fais comment ?
    J'ai mis comme condition "tant que le tir est dans l'écran" (sur l'axe y)...mais le déplacement se fait si vite qu'on ne voit pas le déplacement.
    C'est possible de faire le tour de boucle en un temps donné ? par exemple, si je veux que le tir mette 2 secondes avant de disparaitre ?

    Merci encore.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Quand je parle de boucle c'est par rapport à glutMainLoop.
    Tu as du créer des callback dont un pour les évènements souris et un pour le dessin.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glutDisplayFunc(DisplayGLScene)     # -: Fonction de dessin
    glutMouseFunc(mouseFunc)            # -: Fonction lors d'un événement souris
    Ces fonctions de callback peuvent être appelé dans chaque boucle de glutMainLoop (les boucles et les appels se font tout seul, tu as juste a déclarer ces fonctions, dans mon exemple DisplayGLScene et mouseFunc mais tu les appelles comme tu veux).

    Donc dans la fonction de gestion des évènements souris tu captes le clic gauche et tu initialises un tir.
    Puis dans ta fonction de dessin tu déplaces tes tirs (ou projectiles) et tu les dessines

  8. #8
    Membre expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 851
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 851
    Points : 3 481
    Points
    3 481
    Par défaut
    Salut,

    Je pense que ton programme doit contenir une "boucle de rafraichissement".

    Cette boucle, va dessiner les éléments de ton jeu, par exemple toutes les 1/30 ème de seconde ( afin que tes déplacements soient fluides, tu peux augmenter pour que ce soit encore plus fluide ).

    Ensuite, ton tir, lui, se déplace d'un pixel tous les 15ème de seconde; tu peux ouvrir une thread pour gérer la modification de ses coordonnées, tant qu'il n'est pas sortie de l'écran !

    Je pense que ça devrait marcher !
    K

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par Corpio
    [...]
    Ces fonctions de callback peuvent être appelé dans chaque boucle de glutMainLoop (les boucles et les appels se font tout seul, tu as juste a déclarer ces fonctions, dans mon exemple DisplayGLScene et mouseFunc mais tu les appelles comme tu veux).

    Donc dans la fonction de gestion des évènements souris tu captes le clic gauche et tu initialises un tir.
    Puis dans ta fonction de dessin tu déplaces tes tirs (ou projectiles) et tu les dessines
    Mais le glutDisplayFunc(DisplayGLScene) est appelé dès le lancement de l'application puis à chaque tour de boucle non ?
    Dans ce cas mon tir sera dessiné dès le départ, sans même avoir tiré ?
    Remarque...je pourrai la changer de couleur pour qu'elle paraisse invisible mais...ça me parait un peu bidouille ça :\

    Les Threads...c'est un truc dans le style des sémaphores.. ?
    Certains bout de code sont exécutés sous certaines conditions, et ne peuvent se débloquer que sous d'autres conditions ?

  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
    Citation Envoyé par shinkyo
    Mais le glutDisplayFunc(DisplayGLScene) est appelé dès le lancement de l'application puis à chaque tour de boucle non ?
    Il n'y pas de boucle dans la gestion de glut, l'affichage se fera lorsque glut considérera que quelque chose à changer dans l'état de la fenêtre. Pour avoir une meilleure gestion, il faudrait mieux utiliser SDL.

    Dans ce cas mon tir sera dessiné dès le départ, sans même avoir tiré ?
    Cela dépend de l'implémentation de ton programme

    Remarque...je pourrai la changer de couleur pour qu'elle paraisse invisible mais...ça me parait un peu bidouille ça :\
    Les Threads...c'est un truc dans le style des sémaphores.. ?
    Non, les threads permettent d'avoir plusieurs tâches exécutés simultanément. Les sémaphores servent à :

    Certains bout de code sont exécutés sous certaines conditions, et ne peuvent se débloquer que sous d'autres conditions ?
    Personnellement, je pense que ce projet est encore trop difficile pour toi, si tu apprends le C, tente de faire quelque chose de plus simple sinon tu risques de te frustrer et de renoncer...

    Jc

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut
    Sauf que ce projet est à rendre d'ici 10 jours .
    Je vais aller m'exercer au GLUT et au C, je continuerai le jeu d'avion dans 3-4 jours...

    Merci à vous pour les infos en tout cas, j'en prend bonne note .

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Points : 106
    Points
    106
    Par défaut
    Citation Envoyé par shinkyo
    Dans ce cas mon tir sera dessiné dès le départ, sans même avoir tiré ?
    ?????
    Non, disons que tu stockes les tirs effectués et qui sont encore valables dans un tableau et bien dans la fonction de glutDisplayFunc tu affiches les tirs qui sont dans le tableau (et au départ ton tableau sera vide donc tu n'as rien a afficher !!!!)

  13. #13
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    128
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 128
    Points : 80
    Points
    80
    Par défaut
    Ok, merci beaucoup à vous .
    J'ai enfin réussi à gérer les tirs du vaisseau.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/12/2006, 19h28
  2. Réponses: 7
    Dernier message: 23/10/2005, 22h38
  3. [Débutant(e)]servlet qui instancie une classe personelle
    Par NiBicUs dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/02/2005, 12h00
  4. Réponses: 3
    Dernier message: 21/01/2004, 08h47

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