2017-07-22 1 views
-1

Comment faire pour que mon "jeu" prenne 2 entrées clés, par exemple si l'utilisateur clique sur w et qu'il se déplace vers la droite. BTW, la eventCheck variable est un objet EventPrendre 2 entrées clavier avec sfml

voici mon code actuel (évidemment pas le code complet que le code de l'événement):

while (window.isOpen()) { 


Event eventCheck; 
      while (window.pollEvent(eventCheck)) { 
       switch (eventCheck.type) { 
       case Event::Closed: 
        window.close(); 
        break; 
       case Event::KeyPressed: 
        switch (eventCheck.key.code) { 
         case Keyboard::W: 
         if (Keyboard::isKeyPressed(Keyboard::A)) { 
          const Vector2f spritePos = sprite.getPosition(); 
          sprite.setPosition(spritePos.x, spritePos.y - 5);} 
          break; 
         case Keyboard::A: 
         if (Keyboard::isKeyPressed(Keyboard::A)) { 
          const Vector2f spritePos = sprite.getPosition(); 
          sprite.setPosition(spritePos.x - 5, spritePos.y);} 
          break; 
         case Keyboard::S: 
         if (Keyboard::isKeyPressed(Keyboard::S)) { 
          const Vector2f spritePos = sprite.getPosition(); 
          sprite.setPosition(spritePos.x, spritePos.y + 5);} 
          break; 
         case Keyboard::D: 
         if (Keyboard::isKeyPressed(Keyboard::D)) { 
          const Vector2f spritePos = sprite.getPosition(); 
          sprite.setPosition(spritePos.x + 5, spritePos.y);} 
          break; 
            } 
          } 
          break; 
      } 

      window.clear(Color(0,0,0,255)); 

      window.draw(sprite); 
      window.display(); 
    }  
return 0; 
+0

'sf :: Keyboard :: isKeyPressed' est indépendant des événements. Vous pouvez l'appeler dans votre boucle principale. – Gambit

Répondre

0

1.) SFML a sondages d'événement par le biais sf::Event et clé en temps réel accès d'état fourni via sf::Keyboard. Si vous n'avez besoin de manipuler qu'une seule touche, il est préférable de les passer par window.pollEvent sinon il est toujours préférable d'obtenir l'état d'une clé et de réagir en fonction de l'état. Dans ce cas, vous mélangez l'interrogation d'événement avec les états du clavier. Choisis l'un ou l'autre.

2.) Ne pas utiliser sf :: supprime beaucoup de clarté à partir du code

maintenant sur le code!

Je n'interrogerais aucune entrée utilisateur dans les événements. Je recevrais l'état des clés:

// Once per game loop 
void ProcessInput() 
{ 
    int keyCount = 0; 
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::W)) 
    { 
     keyCount++; 
     //Move Character Up, The more keys are pressed, the more i would mess around with speed/velocity here 
    } 
    if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)) 
    { 
     keyCount++; 
     //Move Character Left, The more keys are pressed, the more i would mess around with speed/velocity here 
    } 
     if(sf::Keyboard::isKeyPressed(sf::Keyboard::S)) 
    { 

     keyCount++; 
     //Move Character Down, The more keys are pressed, the more i would mess around with speed/velocity here 
    } 
     if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) 
    { 
     keyCount++;  
     //Move Character Right, The more keys are pressed, the more i would mess around with speed/velocity here 
    } 
} 

En fonction de la quantité de clés que l'utilisateur pressé, vous voulez déplacer votre personnage moins car ils pourraient se déplacer plus en diagonale que verticalement/horizontalement, mais mess avec vitesse et la vitesse comme vous le souhaitez.

0

Je fini par faire

bool moveL = false; 
    bool moveU = false; 
    bool moveD = false; 
    bool moveR = false; 
    while (window.isOpen()) { 
     Event eventCheck; 
     while (window.pollEvent(eventCheck)) { 
      switch (eventCheck.type) { 
      case Event::Closed: 
       window.close(); 
       break; 
      case Event::KeyReleased: 
       switch (eventCheck.key.code) { 
       case Keyboard::A: 
        moveL = false; 
        break; 
       case Keyboard::W: 
        moveU = false; 
        break; 
       case Keyboard::S: 
        moveD = false; 
        break; 
       case Keyboard::D: 
        moveR = false; 
        break; 
       } 

       break; 
      case Event::KeyPressed: 
       switch (eventCheck.key.code) { 
       case Keyboard::A: 
        moveL = true; 
        break; 
       case Keyboard::W: 
        moveU = true; 
        break; 
       case Keyboard::S: 
        moveD = true; 
        break; 
       case Keyboard::D: 
        moveR = true; 
        break; 
       case Keyboard::Space: 
        jump(sprite, window); 
        break; 
       } 

       const Vector2f spritePos = sprite.getPosition(); 

       if (moveD && moveR) { 

        sprite.setPosition(spritePos.x + 5, spritePos.y + 5); 
       } 
       else if (moveL && moveU) { 
        sprite.setPosition(spritePos.x - 5, spritePos.y - 5); 

       } 
       else if (moveU && moveD) { 
        sprite.setPosition(spritePos.x, spritePos.y); 
       } 
       else if (moveU && moveR) { 
        sprite.setPosition(spritePos.x + 5, spritePos.y - 5); 
       } 
       else if (moveD && moveL) { 
        sprite.setPosition(spritePos.x - 5, spritePos.y + 5); 
       } 
       else if (moveL) { 
        sprite.setPosition(spritePos.x - 5, spritePos.y); 
       } 
       else if (moveR) { 
        sprite.setPosition(spritePos.x + 5, spritePos.y); 
       } 
       else if (moveU) { 
        sprite.setPosition(spritePos.x, spritePos.y - 5); 
       } 
       else if (moveD) { 
        sprite.setPosition(spritePos.x, spritePos.y + 5); 
       } 



       break; 
      } 
     } 

     window.clear(Color(0,0,0,255)); 

     window.draw(sprite); 
     window.display(); 
    } 
    return 0; 
}