Partage
  • Partager sur Facebook
  • Partager sur Twitter

SFML android touch

Sujet résolu
    18 septembre 2022 à 12:56:11

    Bonjour, je fais un jeu en c++ avec la SFML sur Android, mais j'ai un petit souci avec les input, je n'arrive pas à faire un système de touche enfoncée pour le déplacement de mon personnage, voici ma boucle principal:

    while (game_window.isOpen())
                {
                    sf::Event event;
    
                    while (active ? game_window.pollEvent(event) : game_window.waitEvent(event))
                    {
                        switch (event.type)
                        {
                            case sf::Event::Closed:
                                game_window.close();
                                break;
                            case sf::Event::KeyPressed:
                                if (event.key.code == sf::Keyboard::Escape)
                                    game_window.close();
                                break;
                            case sf::Event::MouseLeft:
                                active = false;
                                break;
                            case sf::Event::MouseEntered:
                                active = true;
                                break;
                            case sf::Event::TouchBegan:
                            {
                                sf::Vector2f worldPos = game_window.mapPixelToCoords(sf::Vector2i(event.touch.x, event.touch.y));
    
                                //Gauche
                                if(worldPos.y > 130 && worldPos.y < 165 && worldPos.x > -10 && worldPos.x < 20)
                                    game_player.at(0)->movePlayer(2);
                                    
                                //Droite
                                if(worldPos.y > 130 && worldPos.y < 165 && worldPos.x > 60 && worldPos.x < 90)
                                    game_player.at(0)->movePlayer(1);
                                
                                //Haut
                                if(worldPos.y > 96 && worldPos.y < 130 && worldPos.x > 20 && worldPos.x < 55)
                                    game_player.at(0)->movePlayer(0);
    
                                //Bas
                                if(worldPos.y > 165 && worldPos.y < 200 && worldPos.x > 20 && worldPos.x < 55)
                                    game_player.at(0)->movePlayer(3);
                                    
                                view.setCenter(game_player.at(0)->getPosition());
                            }
                            default:
                                view.setCenter(game_player.at(0)->getPosition());
                                break;
                        }
                        game_player.at(0)->AnimationMove();
    
                        for (size_t i = 0; i < enemies.size(); i++)
                            enemies.at(i)->AnimationMove();
                    }


    Je ne comprend pas comment faire, avez vous une idée ? 

    Merci ^^

    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2022 à 12:00:48

      Hello,

      Parce que le deplacement de ton personnage ne doit pas se faire dans les évènement mais dans ta boucle principale. Si tu appuies sur une touche ou l'écran tu recevras qu'un seul et unique évènement, donc ton processus de déplacement ne peut pas continuer.

      J'imagine que un seul appui sur ton écran démarre un mouvement jusqu'à ce que tu relève le doigt. En gros (si on réflechit comme un clavier avec les touches flechées) :

      • Tu détectes l'appuie d'une touche : tu mets un facteur de deplacement à >= 0.
      • À chaque tour de boucle tu déplaces ton personnage en fonction de critères (velocité, temps, accéleration, ...).
      • Tu détectes le lever de touche/doigt : tu remets un facteur de déplacement à 0.

      À l'inverse, si tu veux que ton personnage se déplace là où ton doigt est, tu dois simplement affecter la position absolue de l'évènement sur l'écran ajustée à la position de ton entité dans ton application.

      -
      Edité par markand 19 septembre 2022 à 12:03:26

      • Partager sur Facebook
      • Partager sur Twitter

      git is great because Linus did it, mercurial is better because he didn't.

        23 septembre 2022 à 20:11:07

        Salut, merci pour le coup de pouce, ça fonctionne super bien  !
        • Partager sur Facebook
        • Partager sur Twitter

        SFML android touch

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown