Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [RESOLU] Configuration de touche  (Lu 2578 fois)

0 Membres et 1 Invité sur ce sujet

leroivi

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
[RESOLU] Configuration de touche
« le: Août 12, 2015, 03:41:14 pm »
Bonjour, je suis nouveau sur sfml et comme tout le monde je vais commencer par faire un pong  ;D
Dans mon idée, je souhaitais faire un menu de configuration des touches pour que le joueur puisse décider de ses contrôles, seulement avec le système d'évènement de sfml j'ai du mal à voir comment bouger mes fonctions d'un case à l'autre :/

J'ai une petite idée derriere la tête mais je ne l'ai pas testé et je sens déjà la panique me gagner : Une map contiendrait en clé la keycode et en valeur un pointeur vers une fonction, ainsi lorsque l'évènement se produit j'appelle la fonction qui est à la keycode. Ainsi pour configurer les touches je pourrais swapper les pointeurs.
Pensez vous ce système viable ou je vais me donner du mal pour rien ?

Mais je suppose qu'il doit y avoir des gens qui ont déjà construit des menu d'assignation de touche, j'aimerai également savoir quelle à été leur stratégie.

Merci d'avance pour vos réponses.
« Modifié: Août 18, 2015, 10:59:42 am par leroivi »
Mamma, i've just killed a man. Put a gun against his head, pulled my trigger and now he's dead.
Mamma, life has just begun, but now I've gone and thrown it all away.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : Configuration de touche
« Réponse #1 le: Août 12, 2015, 05:13:37 pm »
J'ai pas lu grand chose, mais pourquoi se compliquer la vie ? Dans la boucle d'événements si le joueur presse la flèche de haut, tu fais ta fonction, si il fait la flèche bas, tu fais ton autre fonction.
Simple.

Kernel panik

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
    • E-mail
Re : Configuration de touche
« Réponse #2 le: Août 12, 2015, 05:24:50 pm »
Bonjour,

Pour un jeu simple où le nombre de fonction clavier reste limité, passer par une map comme tu le pensais est suffisant. Même si le code de sauvegarde et de chargement des paramètres risque de ne pas être des plus élégant ^_^

Personnellement, j'ai réglé ce problème en implémentant un pattern de commande. Il permet d'avoir un fonctionnement générique et permet d'ajouter des commandes très facilement et indépendant du paramétrage. De plus, il peut être couplé à une gestion de script pour élargir son utilité.
Mais bon, pour un pong, ça semble disproportionné x_-'

leroivi

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Configuration de touche
« Réponse #3 le: Août 12, 2015, 06:25:51 pm »
Merci pour les réponses,

@S66 Oui effectivement avec des touches fixés c'est simple et c'est comme ça que j'ai commencé à developper et tester ma création, mais ce que je voudrais c'est que l'utilisateur puisse choisir sa touche, par défaut les flèches mais s'il veut utiliser "z" pour monter et "s" pour descendre ou encore le joystick d'une manette et bien il pourra le configurer au travers un menu

@Kernel panik Je ne connais pas le pattern de commande mais en googlant un peu j'ai trouvé des trucs intéressant alors je me pencherais dessus quand j'aurais un peu de temps libre et que je serais plus motivé que ce soir. Merci pour la piste

En effet, pour un pong certaines choses peuvent paraitre disproportionné mais le pong en lui même ne m'intéresse pas, je cherche à trouver des techniques dans le développement de jeux vidéo en commençant par un jeu simple afin de ne pas se trouver dans une impasse mais je cherche du code, des méthodes, une façon de penser qui seront applicable dans des jeux de plus grande ampleur. C'est dans cette optique que pour mon pong je vais ajouter ce menu de configuration, un menu d'acceuil, un menu de pause, une gestion du son, et une gestion de collision que je tente de faire générique (et peut être plein d'autre chose qui me viendront à l'esprit).

Merci pour votre aide, j'espère pouvoir un jour être suffisament à l'aise pour faire partie de la communauté sfml et venir en aide à mon tour.
Mamma, i've just killed a man. Put a gun against his head, pulled my trigger and now he's dead.
Mamma, life has just begun, but now I've gone and thrown it all away.

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : Configuration de touche
« Réponse #4 le: Août 12, 2015, 07:14:28 pm »
Ce petit tutoriel du wiki va probablement t'intéresser : Manage dynamic key binding.

leroivi

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Configuration de touche
« Réponse #5 le: Août 13, 2015, 08:27:43 am »
Merci, cette solution me parait pas mal, c'est plutôt simple et efficace.  :)

J'ai tout de même une petite question pour ceux qui l'ont lu : pourquoi passer par ses structures pour retenir la touche au lieu de stocker directement un Event ?  ???
Sa map pourrait être un std::map<std::String, sf::Event> (ou une clé plus rapide mais la string a l'avantage d'être claire) et son Test deviendrait juste

if(Event==Keys["Shoot"])
{
    shoot();
}

ou bien si l'opérateur == n'est pas implémenté, ou s'il veut être plus rigoureux, on compare champs par champs.

bool TestEvent(sf::Event k, sf::Event e)
{
   if(e.type == k.type)
   {
      switch(e.type)
      {
      case sf::Event::MouseButtonPressed:
      case sf::Event::MouseButtonReleased:
         if(k.mouseButton.button==e.mouseButton.button) return true;
         break;
      case sf::Event::KeyPressed:
      case sf::Event::KeyReleased:
         if(k.key.code == e.key.code) return true;
         break;
      default:
         break;
      }
   }
   return false;
}

On tombe sur une fonction à peu près similaire, certes, mais on a plus de structure différente, on peut pleinement profiter des nuances que propose la classe sf::Event et on a un Event de stocké que l'on pourrait utiliser à d'autre fin (on sait jamais, j'ai pas d'application qui vienne en tête mais je suis sur que ça peut être utile de donner un event qui s'est pas réellement produit). 8)
Mamma, i've just killed a man. Put a gun against his head, pulled my trigger and now he's dead.
Mamma, life has just begun, but now I've gone and thrown it all away.

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : Configuration de touche
« Réponse #6 le: Août 13, 2015, 02:22:38 pm »
En relisant attentivement, l'utilisation d'une classe dédiée n'est pas clairement justifiée.
En effet, on peut utiliser directement des sf::Event mais alors il faut choisir quelles données sont utilisées. Par exemple, on peut ignorer la position de la souris lors d'un clic. Du coup c'est un peu de la bidouille.
C'est probablement ce qui a motivé la création d'une classe dédiée : ne pas manipuler de données inutiles. Cela me semble plus propre.

leroivi

  • Newbie
  • *
  • Messages: 5
    • Voir le profil
Re : Configuration de touche
« Réponse #7 le: Août 18, 2015, 10:55:30 am »
Merci pour tout, je pense que je peux passer le sujet en résolu (si je trouve comment on fais)

De plus j'aimerai revenir sur mon précédent message pour éviter la confusion dans ceux qui le liront : sf::Event est une union et non une classe donc pour comparer 2 sf::Event il faut le faire champ par champ car le comparer dans sa globalité est dangereux. En effet, par exemple probablement inexact mais représentatif, si vous appuyer sur 'r', les champs vont se remplir selon la structure Keypressed puis vous bougez la souris, les champs vont se remplir selon la structure Mousemove qui est plus grande que Keypressed, puis vous rappuyer sur 'r' vous n'obtiendrez pas la même valeur dans la globalité de l'union que la première fois puisque la mémoire que n'utilise pas Keypressed sera comparé également, alors que les champs qui vous interressent seront identique. Voici pourquoi il faut comparé en champ par champ.
Mamma, i've just killed a man. Put a gun against his head, pulled my trigger and now he's dead.
Mamma, life has just begun, but now I've gone and thrown it all away.