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 :

[Thread] deux joueurs sur le même clavier


Sujet :

SDL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut [Thread] deux joueurs sur le même clavier
    Bonsoir,

    Voilà j'aurais voulu connaitre la méthode à adopter lorqu'on désire que deux joueurs puissent intérargir avec deux personnages via les événements claviers.

    Je veux dire que l'un puisse bouger un joueur avec les fleches directionnelles et l'autre avec 4 autres touches.

    J'avais pensé à un thread comportant une boucle while infini pour scruter les événements claviers pour le joueur A puis une fois cela fait, appellé dans le programme principal une bouche while infini scrutant aussi les événements claviers pour le joueur B.

    J'ai mis cela en oeuvre mais les résultats sont nulles...Seulement la boucle infini du programme principal fonctionne. Quoique parfois, ca me fait des trucs bizarres avec la boucle du thread, d'un coup le personnage va partir dans une direction mais imposible de le rediriger, c'est comme si les événements dans le thread ne sont pas pris en compte ou très rarement.

    Quel serait donc la méthode afin que deux joueurs puissent intérargir sur deux personnages en même temps via les événements claviers?

    Bonne soirée

    Nicolas

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 23
    Par défaut
    moi j'aurais fait une seule boucle qui s'occuperais des deux joueurs...
    A mettre dans un thread si besoin est, mais un seul thread.
    En fait je pense qu'il faut s'interroger sur le mode de fonctionnement du buffer clavier.
    En effet que se passe-t-il si un premier utilisateur appuie sur la fleche du haut, puis que le second joueur appuie sur la touche 8 de pavé numérique ? puis si le premier utilisateur relache la touche, que se passe-t-il ?
    A voir...
    Si tu as une solution, ca m'interesse...

  3. #3
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Oui, il faut que tu traites tous les événements dans la même boucle...

    Si tu récupères un événement clavier dans ta boucle principale, et que cet événement concerne le joueur 1, la boucle du thread correspondant au joueur 1 ne pourra plus le récupérer...

  4. #4
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par Eusebe
    Oui, il faut que tu traites tous les événements dans la même boucle...

    Si tu récupères un événement clavier dans ta boucle principale, et que cet événement concerne le joueur 1, la boucle du thread correspondant au joueur 1 ne pourra plus le récupérer...
    Oui c'est ce que j'avais fait au tout départ mais le problème, c'est que les appuis de touches rentrent en conflit et que ca bloque un des deux joueurs à chaque fois. Puis avec la méthode que j'ai implémenté manuellement pour gérer l'appui continue d'une touche (FAQ SDL), celle ci tombe à l'eau.

    Pourtant des jeux comme "tron" ou "pong" doivent permettre à deux joueurs de jouer sur le même clavier. Je pense qu'avec SDL il est possible de mettre cela en oeuvre en contournant d'une certaine manière le pràblème.

    Je vais chercher différentes manières mais vos suggestions sont les bienvenues.


  5. #5
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 48

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Comment gères tu actuellement l'appui des touches ?
    Je ne vois pas pourquoi un joueur ayant appuyé sur une touche, l'autre ne peut plus rien faire...

    Je pense qu'il faudrait que tu captes les événements d'appui / relâchement des touches.

    Quand le joueur A appuies sur la flêche gauche, tu mets à jour une variable indiquant que le joueur A veut se déplacer à gauche.

    Quand le joueur A relâche la touche, tu remets à jour cette variable.

    Et dans la boucle de rendu du jeu, si le joueur A veut se déplacer à gauche, tu le déplaces...

  6. #6
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Citation Envoyé par Eusebe
    Comment gères tu actuellement l'appui des touches ?
    J'utilise la solution deux expliquée en partie dans la FAQ:
    Comment savoir si une touche reste enfoncée ?

    Quand le joueur A appuies sur la flêche gauche, tu mets à jour une variable indiquant que le joueur A veut se déplacer à gauche.
    Dois je donc faire un variable associée à chaque touche? Ca me semble lourd...

    Mon soucis se trouve dans le fait que j'aimerais que les deux joueurs puissent rester appuyer en même temps sur un touche pour diriger leurs personnages respectifs.

    Voici le code réalisé à ce jour et qiu évidemment n'est pas au point mais permet de donner une idée et d'avoir une base pour la suite.

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
     
    bool CMoteur::Jeu(void)
    {
       // program main loop
       bool done = false;
       bool Pressed = false;
     
       while (!done)
       {
          // message processing loop
          SDL_Event event;
          while (SDL_PollEvent(&event))
          {
             // check for messages
             switch (event.type)
             {
                // exit if the window is closed
                case SDL_QUIT:
                   done = true;
                   break;
     
                // check for keypresses
                case SDL_KEYDOWN:
                   // exit if ESCAPE is pressed
                   if (event.key.keysym.sym == SDLK_ESCAPE)
                      done = true;
     
                   Pressed = true;
                   break;
     
                case SDL_KEYUP:
                   Pressed = false;
                   break;
     
             } // end switch
          } // end of message processing
     
          // DRAWING STARTS HERE
          if (Pressed)
          {
             if (event.key.keysym.sym == SDLK_UP)
             {
                oTux.y -= 3;
                if (oTux.collision(oArbre)) {
                   texte = TTF_RenderText_Solid( font, "Trop forte!!!", textColor );
                   apply_surface( SCREEN_WIDTH/2-100, SCREEN_HEIGHT/2-75, texte, affichage,NULL );
                   actualiser();
                   SDL_Delay( 2000 );
                   //oArbre.y -= 3;
                   if(oArbre.detection_bord()){ deplacementArbre();}
                }
             }
     
             else if (event.key.keysym.sym == SDLK_DOWN)
             {
                oTux.y += 3;
                if (oTux.collision(oArbre)) {
                   oArbre.y += 3;
                   if(oArbre.detection_bord()) deplacementArbre();
                }
             }
     
             else if (event.key.keysym.sym == SDLK_LEFT)
             {
                oTux.x -= 3;
                if (oTux.collision(oArbre)){
                   oArbre.x -= 3;
                   if(oArbre.detection_bord()) deplacementArbre();
                }
             }
     
             else if (event.key.keysym.sym == SDLK_RIGHT)
             {
                oTux.x += 3;
                if (oTux.collision(oArbre)) {
                   oArbre.x += 3;
                   if(oArbre.detection_bord())  deplacementArbre();
                }
             }
     
             /*Mouvement de l'arbre*/
             else if (event.key.keysym.sym == SDLK_e)
             {
                oArbre.y -= 3;
                /*if (oTux.collision(oArbre)) {
                   oArbre.y -= 3;
                   if(oArbre.detection_bord()) deplacementArbre();
                }*/
             }
     
             else if (event.key.keysym.sym == SDLK_d)
             {
                oArbre.y += 3;
                /*if (oTux.collision(oArbre)) {
                   oArbre.y += 3;
                   if(oArbre.detection_bord()) deplacementArbre();
                }*/
             }
     
             else if (event.key.keysym.sym == SDLK_s)
             {
                oArbre.x -= 3;
                /*if (oTux.collision(oArbre)){
                   oArbre.x -= 3;
                   if(oArbre.detection_bord()) deplacementArbre();
                }*/
             }
     
             else if (event.key.keysym.sym == SDLK_f)
             {
                oArbre.x += 3;
                /*if (oTux.collision(oArbre)) {
                   oArbre.x += 3;
                   if(oArbre.detection_bord())  deplacementArbre();
                }*/
             }
     
             apply_surface( 0, 0, background, affichage,NULL );
             apply_surface( oArbre.x, oArbre.y, arbre, affichage,NULL );
             oTux.detection_bord();
             apply_surface( oTux.x,oTux.y, Tux, affichage, NULL);
             actualiser();
          }
       } // end main loop*/
       return true;
    }

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

Discussions similaires

  1. Problème: Deux joueur sur un même clavier
    Par Bhinouze dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 06/03/2014, 10h43
  2. Deux squid sur le même serveur
    Par photorelief dans le forum Administration système
    Réponses: 5
    Dernier message: 21/07/2009, 11h39
  3. Comment disposer deux formulaires sur la même ligne ??
    Par soad029 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 05/05/2007, 04h14
  4. Réponses: 6
    Dernier message: 28/09/2005, 10h24
  5. installation de deux serveurs sur une même machine
    Par desdak dans le forum Installation
    Réponses: 1
    Dernier message: 29/06/2005, 23h09

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