Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: Negatio le Mai 19, 2013, 06:23:42 pm

Titre: Problème de keyrepeat
Posté par: Negatio le Mai 19, 2013, 06:23:42 pm
Bonjour/bonsoir;

Je me trouve confronté a un problème assez handicapant. Lorsque j'appuie sur une touche mon "personnage" avance d'un pixel il se passe rien pendant environ une seconde puis mon personnage avance normalement.

Je ne peut pas encore poster mon code (je ne suit pas sur mon ordi). Mais je voudrait savoir si quelqu'un a déjà eu ce problème et a quoi ca peut être du. En attendant dites moi quelle-est la meilleur manière de vous faire acquérir mon code (étant assez gros et en plusieurs fichier).

Merci de votre participation ^^
Titre: Re : Problème de keyrepeat
Posté par: kimci86 le Mai 19, 2013, 06:42:02 pm
Bonjour,
Au lieu d'utiliser les évènements Event::KeyPressed comme tu sembles le faire, utilise la fonction Keyborad::isKeyPressed (http://www.sfml-dev.org/documentation/2.0-fr/classsf_1_1Keyboard.php#a80a04b2f53005886957f49eee3531599).
Lorsque l'on garde une touche enfoncée, Event::KeyPressed est émis une fois puis, après un court instant, il est réémis en continu si la répétition automatique des touches est activée. Avec isKeyPressed, tu peux savoir à tout moment si une certaine touche est enfoncée.
Titre: Re : Problème de keyrepeat
Posté par: Negatio le Mai 19, 2013, 06:45:50 pm
Merci de ta réponse mais je ne comprend pas vraiment. Event::KeyPressed sert juste a vérifier si l'evénement est 'une touche a été pressée' non? Comment voudrait tu que je teste quelle touche a eté pressé avec Event::KeyPressed? De toute façons j'utilise Keyborad::isKeyPressed.
Titre: Re : Problème de keyrepeat
Posté par: kimci86 le Mai 19, 2013, 06:54:31 pm
Je t'invite à lire le tutoriel.
Les évènements KeyPressed et KeyReleased (http://www.sfml-dev.org/tutorials/2.0/window-events-fr.php#les-evenements-keypressed-et-keyreleased)
Le clavier (http://www.sfml-dev.org/tutorials/2.0/window-inputs-fr.php#le-clavier)
Titre: Re : Problème de keyrepeat
Posté par: Negatio le Mai 19, 2013, 07:16:19 pm
Citer
Je t'invite à lire le tutoriel.
Deja fait de nombreuses fois et je me répète j'utilise sf::Keyboard::isKeyPressed() et non sf::Event::KeyPressed() :)
Titre: Re : Problème de keyrepeat
Posté par: Laurent le Mai 19, 2013, 08:20:52 pm
Citer
En attendant dites moi quelle-est la meilleur manière de vous faire acquérir mon code (étant assez gros et en plusieurs fichier).
Puisque ton problème se situe au niveau de la fonction Keyboard::isKeyPressed, écris un main() tout simple qui déplace une forme simple en utilisant cette fonction. Pour le moment on se fiche un peu de tout ce qu'il y a d'autre dans ton gros code ;)
Et si ce code marche (ce qui sera sûrement le cas), alors là commence à voir quelles différences il y a entre ce code qui marche et ton code original qui ne marche pas. Et là si tu es rigoureux tu tomberas forcément sur le bug.
Titre: Re : Re : Problème de keyrepeat
Posté par: G. le Mai 19, 2013, 11:59:03 pm
Citer
Je t'invite à lire le tutoriel.
Deja fait de nombreuses fois et je me répète j'utilise sf::Keyboard::isKeyPressed() et non sf::Event::KeyPressed() :)
Ton isKeyPressed, il est à l'intérieur de ta boucle d'évènement ? Si oui, c'est probable que c'est pas là que tu veux vraiment l'y mettre.
Titre: Re : Problème de keyrepeat
Posté par: Negatio le Mai 20, 2013, 11:51:41 am
Citer
Puisque ton problème se situe au niveau de la fonction Keyboard::isKeyPressed, écris un main() tout simple qui déplace une forme simple en utilisant cette fonction. Pour le moment on se fiche un peu de tout ce qu'il y a d'autre dans ton gros code
Et si ce code marche (ce qui sera sûrement le cas), alors là commence à voir quelles différences il y a entre ce code qui marche et ton code original qui ne marche pas. Et là si tu es rigoureux tu tomberas forcément sur le bug.
Au début de mon projet j'avais tout mis dans le main et tout fonctionnait mais c'est depuis que séparais mon code en plusieurs classe que ca foire. Donc entre trouvais la différence entre presque rien et un code de plusieurs classe je vais un peu galérer mais bon.

Citer
Ton isKeyPressed, il est à l'intérieur de ta boucle d'évènement ? Si oui, c'est probable que c'est pas là que tu veux vraiment l'y mettre.
Non il est dans une fonction qui est appelé par certaine classe
bool EngineControl::isPressed(string keyString)
{
    if(Keyboard::isKeyPressed(keysConfig[keyString]))
    return true;

    else
    return false;
}
Bon je retourne essayer de trouver le caillou dans le bouillon.
Merci vous en tout cas :)
Titre: Re : Problème de keyrepeat
Posté par: Laurent le Mai 20, 2013, 05:56:24 pm
Citer
Donc entre trouvais la différence entre presque rien et un code de plusieurs classe je vais un peu galérer mais bon.
Ben... et nous tu crois qu'on ferait quoi pour trouver la cause de ton problème ? ;)
Les forums c'est pas magique, pour ce genre de problème, si tu ne passes pas un peu de temps à faire des tests poussés, il est probable que personne n'arrive à t'aider.
Titre: Re : Problème de keyrepeat
Posté par: TheNoob le Mai 21, 2013, 12:05:02 am
Lol c'est pas faux ça si y a une erreur dans ton code c'est pas aux autres de la chercher a ta place, surtout que si tu as écris le code, tu es probablement le plus apte à trouver rapidement d'où vient le problème.
Bonne continuation.
Titre: Re : Problème de keyrepeat
Posté par: Laurent le Mai 21, 2013, 08:03:23 am
Citer
Lol c'est pas faux ça si y a une erreur dans ton code c'est pas aux autres de la chercher a ta place
Si, quand même, sinon à quoi bon venir poster sur le forum ? Mais on peut le faire sur un code qui a déjà été réduit à son minimum, pas dans gros projet dont 99% du code est sans rapport avec l'erreur.
Titre: Re : Problème de keyrepeat
Posté par: TheNoob le Mai 21, 2013, 01:28:19 pm
Ce que je veux dire par la c'est que si son erreur n'est pas due à ses conaissances mais à une faute qu'il est autant apte à repérer qu'une autre personne, il n'y a pas de raison de demander de l'aide. Après c'est peut être pas le cas içi et dans ce cas je m'excuse.
Titre: Re : Problème de keyrepeat
Posté par: Laurent le Mai 21, 2013, 01:33:09 pm
Disons que la plupart des erreurs qui bloquent les débutants peuvent être trouvées en un rien de temps par nos yeux d'experts ;)

Mais, je le répète, il faut que je posteur prépare le terrain ; jeter un gros projet à la figure du forum ne l'aidera pas, bien au contraire.
Titre: Re : Problème de keyrepeat
Posté par: Negatio le Mai 21, 2013, 05:43:41 pm
Je suis désoler si j'ai pu paraître un peu abrupte mais je voulais juste savoir si mon problème était du a une "erreur courante", un bug ou si c’était réellement mon architecture qui posais problème.
Citer
Donc entre trouvais la différence entre presque rien et un code de plusieurs classe je vais un peu galérer mais bon.
Ben... et nous tu crois qu'on ferait quoi pour trouver la cause de ton problème ? ;)
Les forums c'est pas magique, pour ce genre de problème, si tu ne passes pas un peu de temps à faire des tests poussés, il est probable que personne n'arrive à t'aider.
Je ne voulait pas dire par là "j'ai flemme de chercher donc débrouiller-vous" je voulais dire que entre un code "normal" et mon ramassis de classe incohérentes il y'a beaucoup de differences. Mais maintenant que je sait que c'est pas mon utilisation des events qui est foireuse je vais pouvoir chercher une réponse par moi même. Je suis d'accord que nous somme dans un forum dédié a la SFML et donc que ce n'est pas l'endroit pour trouver LE problème qui n'a rien a voir avec la SFML. En tout cas merci pour ces réponses et je reviendrais si je comprend toujours pas mon(mes?) erreur(s?).
PS: Veuillez excuser mon orthographe, en relisant mes sujets je me suis aperçu que ca piquer un peu les yeux parfois.

EDIT:
Apres avoir fait un code minimal je m'aperçois que ca ne fonctionne toujours pas(même problème qu'avant) (ca doit vraiment venir de moi qui sait pas se servir de la sfml).
    RenderWindow m_window;
    m_window.create(sf::VideoMode(1920, 1080), "test 3", sf::Style::Fullscreen);
    m_window.setKeyRepeatEnabled(true);
    m_window.setFramerateLimit(50);
    m_window.setVerticalSyncEnabled(true);
    Texture m_texture;
    Sprite m_sprite;
    Image img;
    img.create(50, 50, Color::Blue);
    m_texture.loadFromImage(img);
    m_sprite.setTexture(m_texture);
    m_window.draw(m_sprite);
    Event m_event;
    while(m_window.isOpen())
    {
        while(m_window.pollEvent(m_event))
        {
            m_window.clear();
            m_window.draw(m_sprite);
            m_window.display();
            if(m_event.Closed)
            m_window.close();
            if(Keyboard::isKeyPressed(Keyboard::Escape))
            m_window.close();
            if(Keyboard::isKeyPressed(Keyboard::Down))
            {
                m_sprite.setPosition(m_sprite.getPosition().x, m_sprite.getPosition().y + 1);
            }
        }
    }
(du coup c'est un code vraiment minimal  ;D)
Je laisse ce code et son erreur qui doit être énorme sous vos yeux d'experts.
Titre: Re : Problème de keyrepeat
Posté par: G. le Mai 22, 2013, 07:34:20 pm
Wow.
Tu as TOUT mis dans la boucle d'évènement. Pas sûr que tu aies lu les tutoriels "de nombreuses fois", car même la façon dont tu check l'évènement Closed ressemble à rien. :o
Titre: Re : Problème de keyrepeat
Posté par: Negatio le Mai 22, 2013, 07:44:25 pm
Comme je le (re)dit c'est un code minimal donc comme dirait quelqu'un: "c'est caca".
Dans mon vrai code je n'utilise pas les events de cette façons. J'insiste: je ne nécessite pas de critiques sur ce code (a part s'il sont en rapport avec mon problème) puisqu'une fois mon problème réglé ce code sera effacer sans vergogne.
PS: Juste comme ça comment peut-on vérifier l'event de fermeture autrement?
Titre: Re : Problème de keyrepeat
Posté par: G. le Mai 22, 2013, 07:53:43 pm
Bah comme dans le chapitre "l'évènement closed" sur les évènements : http://www.sfml-dev.org/tutorials/2.0/window-events-fr.php
Ton if(event.Closed) il vient de nul part et il veut rien dire.

C'est pas parce que c'est un code minimal que c'est censé être incohérent. Enfin bon, je sais pas trop quoi te dire, je te dis de sortir tes isKeyPressed de la boucle d'évènements, tu dis que c'est pas le cas, et tu sors un code avec TOUT dans la boucle d'évènements... en me disant que tu veux pas en entendre parler lol.

Ton code est censé ressembler à ça :

main
   initialisations diverses
   boucle principale
      boucle d'évènements
          fermer si l'évenement est Closed
      gérer tes déplacements avec isKeyPressed
      clear la fenetre
      dessiner tes sprites
      display
Titre: Re : Problème de keyrepeat
Posté par: Negatio le Mai 22, 2013, 08:21:40 pm
Hourra je viens enfin de comprendre que la boucle "while(m_window.isOpen())" sert a quelque chose (et que accessoirement c'est la boucle principale). Mon problème c'est que je confondais la boucle d'event et la boucle principale!

Merci a vous, et spécialement a G qui a s'est évertuer a m'expliquer des choses aussi simples.

En ce qui concerne le if(event.Closed) ca marche et je comprend pas pourquoi (c'est vrai que ca n'a aucun sens).

Dernière question: je ne vois mention d'aucun label "résolu" je doit le mettre moi-même ou c'est normal?
Titre: Re : Problème de keyrepeat
Posté par: Laurent le Mai 22, 2013, 08:44:42 pm
Hmm... tout ça me laisse perplexe, car si tu avais réellement lu les tutoriels et la documentation, tu aurais eu des explications claires sur le sujet, et surtout un bon nombre d'exemples de boucle principale et d'évènements. Je peux pas croire que tu aies pondu un code pareil en ayant au préalable potassé la doc, beaucoup de choses que tu as écrites ne sont écrites nulle part, contrairement à leur version correcte :P

Citer
En ce qui concerne le if(event.Closed) ca marche et je comprend pas pourquoi (c'est vrai que ca n'a aucun sens).
event.Closed (en fait sf::Event::Closed) est une constante qui vaut zéro, ton test sera toujours faux. Note qu'un compilateur bien paramétré devrait te le signaler en avertissement.

Citer
Dernière question: je ne vois mention d'aucun label "résolu" je doit le mettre moi-même ou c'est normal?
Non, il n'y a rien à faire de spécial. Si tu veux éditer le titre pour mettre [RESOLU] tu peux toujours le faire, mais je m'en fiche un peu ;)
Titre: Re : Problème de keyrepeat
Posté par: Negatio le Mai 23, 2013, 07:41:43 pm
Citer
beaucoup de choses que tu as écrites ne sont écrites nulle part
Sincèrement appart mes if(Keyboard::isKeyPressed) très mal placés mon code minimal n'avait rien a voir avec mon "vrai" code. En faite le problème c'est que j'avais mal compris la différence entre les deux fameuses boucles et le pire c'est que j'ai retrouvé un "vieux" projet ou j'avais bien utiliser les events (et dont je m'inspire pour mon projet actuel). Au début j'étais persuadé que mon problème était lié au fait que j'avait séparer mon code en millier de classes.

J'ai lu la doc il y'a un moment déjà, j'ai cru comprendre qu'il y'a eu quelque changement, il serait temps que j'y rejette un oeil(ou tout simplement que je reprenne tout de zéro).

Citer
event.Closed (en fait sf::Event::Closed) est une constante qui vaut zéro, ton test sera toujours faux. Note qu'un compilateur bien paramétré devrait te le signaler en avertissement.
Il faut vraiment que je fasse quelque chose avec mon compilo, il me met jamais les bons avertissements quand il faut.

Encore une fois merci pour l'aide apportée :)