2017-10-01 6 views
1

Ma question est quelle est la manière la plus solide d'implémenter l'entrée directionnelle dans SDL2.Quelle est la meilleure et la plus solide façon de traduire les flèches SDL2/WASD en mouvements de joueurs?

Le problème avec mon code actuel est que vous vouliez déplacer le lecteur vers la gauche. Une pression sur a diminuerait sa valeur x et une fois que vous relâcherez la touche a, elle cessera de diminuer la valeur x. Cependant, si vous vouliez vous déplacer vers la gauche et ensuite vous déplacer immédiatement vers la droite, le joueur s'arrêterait juste pendant un certain temps et continuerait ensuite à se déplacer vers la droite.

Tout conseil serait très utile.

Ma fonction clavier:

class KeyboardController : public Component { 

public: 
TransformComponent* transform; 

void init() override { 
    transform = &entity->getComponent<TransformComponent>(); 
} 

void update() override { 

    if (MainGame::evnt.type == SDL_KEYDOWN) { 
     switch (MainGame::evnt.key.keysym.sym) 
     { 
     case SDLK_w: 
      transform->velocity.y = -1; 

      break; 
     case SDLK_a: 
      transform->velocity.x = -1; 

      break; 
     case SDLK_s: 
      transform->velocity.y = 1; 

      break; 
     case SDLK_d: 
      transform->velocity.x = 1; 

      break; 
     } 
    } 

    if (MainGame::evnt.type == SDL_KEYUP) { 
     switch (MainGame::evnt.key.keysym.sym) 
     { 
     case SDLK_w: 
      transform->velocity.y = 0; 

      break; 

     case SDLK_a: 
      transform->velocity.x = 0; 

      break; 

     case SDLK_s: 
      transform->velocity.y = 0; 

      break; 

     case SDLK_d: 
      transform->velocity.x = 0; 

      break; 
     } 
     } 
    } 
}; 

Ma fonction de vitesse:

/* class */ 

Vector2D position; 
Vector2D velocity; 

/* other code */ 

void update() override { 
    position.x += velocity.x * speed; //speed = 3 
    position.y += velocity.y * speed; 
} 
+4

Le titre de la question "comment faire une saisie au clavier en SDL" ne correspond pas au contenu de la question "comment corriger une erreur dans les calculs de vitesse de mon lecteur". De même, il n'est pas clair à partir de ce code si 'velocity' défini dans les premier et deuxième appels' update' fait référence à la même vitesse ou non, ou quand ces appels 'update' sont effectués. L'extrait donné est loin de [Exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve). – VTT

+0

@VTT Si vous pouvez trouver une façon évidente d'améliorer une question ou une réponse, allez-y et éditez-la! J'ai appliqué votre suggestion moi-même. –

+0

@VTT Dépassement de pile classique lol – Cobblestonie

Répondre

0

Au lieu d'agir sur les événements de changer immédiatement la vitesse, envisager d'ajouter l'état supplémentaire (un tableau) qui mémorise les clés sont vers le bas à un moment donné. Chaque fois qu'un événement d'entrée est reçu, mettez à jour le tableau et recalculez la vélocité en fonction de cela. Par exemple, selon le jeu que vous faites, vous pouvez vouloir que le joueur arrête de bouger si vous appuyez simultanément sur la gauche et la droite. Alternativement, un événement de clavier pour une touche de direction ferait que le joueur commence immédiatement à se déplacer dans cette direction, mais vous devrez quand même garder la trace quand plus aucun bouton n'est maintenu pour savoir quand le joueur devrait s'arrêter de bouger.

+0

Vous pouvez l'essayer et voir s'il résout mon problème. – Cobblestonie