Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'affichage avec la vue de SFML

Sujet résolu
Anonyme
    18 juin 2016 à 10:20:51

    Bonjour à tous, 

    dans un but pédagogique je réalise un jeu 2D avec la SFML, j'essaye de réaliser une base assez dynamique pour que je puisse facilement l'a réutiliser pour d'autres projet.

    Pour le déplacement de mon personnage, j'utilise une vue pour la map et une vue pour le personnage. Lors d'un déplacement c'est la map de la vue qui se déplace pour donner une impression de déplacement du personnage.

    Le soucis c'est que lorsque je déplace ma vue, j'ai un bug d'affichage :

    http://image.noelshack.com/fichiers/2016/24/1466237931-capture.png

    Voici le code, le déplacement de la vue se fait lors de la détection des événements des touches directionnelles :

    void Game::play()
    {
    	gState = GAME_STATE::G_RUNNING;
    	
    	Map map;
    	map.load("./Data/Map/level.map", "tile");
    
    	Character player(sf::Vector2f(0, 0), "player");
    	player.setCenter();
    
    	float v_init = 1.5;
    	float angle_init = Utils::pi/3;
    	float t = 0;
    
    	sf::Vector2f lastPos = player.getPosition();
    
    	sf::Clock clock;
    	int timedelta;
    
    	while (getWindow().isOpen() && gState == GAME_STATE::G_RUNNING)
    	{
    		timedelta = clock.getElapsedTime().asMilliseconds(); // Récupération du temps écoulés entre deux itérations de la boucle while
    
    		clock.restart(); // Réinitialisation de l'horloge
    
    		getWindow().setView(getView()); 
    
    		sf::Event event;
    		while (getWindow().pollEvent(event))
    		{
    			if (event.type == sf::Event::Closed)
    				getWindow().close();
    		}
    
    		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
    		{
    			gState = GAME_STATE::G_PAUSED;
    			break;
    		}
    		if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
    		{
    			getView().move(timedelta*0.1, 0);
    			if (Collisions::checkMapCollisions(player, map) == 1)
    				getView().move(-timedelta*0.1, 0);
    		}
    		else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
    		{
    			getView().move(-timedelta*0.1, 0);
    			if (Collisions::checkMapCollisions(player, map) == 1)
    				getView().move(timedelta*0.1, 0);
    		}
    		else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
    		{
    			getView().move(0, -timedelta*0.1);
    			if (Collisions::checkMapCollisions(player, map) == 1)
    				getView().move(0, timedelta*0.1);
    		}
    		else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
    		{
    			getView().move(0, timedelta*0.1);
    			if (Collisions::checkMapCollisions(player, map) == 1)
    				getView().move(0, -timedelta*0.1);
    		}
    		
    		std::cout << Collisions::checkMapCollisions(player, map) << std::endl;
    
    		/*sf::Vector2f jump, newPos;
    
    		jump.x = v_init * cos(angle_init)*t;
    
    		jump.y = -(-Utils::g*pow(t, 2)/2000 + v_init*sin(angle_init)*t);
    
    		newPos = lastPos + jump;
    
    		player.setPosition(newPos);
    
    		t += timedelta;*/
    
    		getWindow().clear(sf::Color::Black);
    
    		getWindow().draw(map);
    
    		getWindow().setView(getWindow().getDefaultView()); // On remet la vue par défaut pour que le personnage reste au milieu de l'écran et ne se déplace pas avec le scrolling
    
    		getWindow().draw(player);
    
    		getWindow().display();
    
    	
    	}
    }



    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2016 à 12:01:00

      Dans certains cas, lorsque la position de la vue n'est pas entière, le pixel à droite ou en dessous du quad à dessiner est aussi rendu.

      Tu peut facilement couper ce probleme en gardant les coordonnées réels d'un coté, et envoyer la valeur arrondie à ta vue.

      • Partager sur Facebook
      • Partager sur Twitter
      "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
      Anonyme
        18 juin 2016 à 12:28:03

        Merci à toi ça fonctionne très bien, j'ai utilisé la fonction floor et c'est niquel.

        -
        Edité par Anonyme 18 juin 2016 à 12:28:37

        • Partager sur Facebook
        • Partager sur Twitter
          8 août 2017 à 7:31:06

          Bonjour TheArrow20,

          Je vois que tu utilises la fonction getWindow() dans ton morceau de programme. Moi j'essaye de faire une capture d'ecran et j'utilise cette fonction. Mon problème est que j'ai une erreur :

          Erreur    CS0103    Le nom 'getWindow' n'existe pas dans le contexte actuel

          Je n'arrive pas à trouver, peut-être que je n'ai pas la bonne version d'assembly ?

          Peux-tu m'aider ???

          Merci beaucoup

          -
          Edité par l.mnu 8 août 2017 à 7:31:44

          • Partager sur Facebook
          • Partager sur Twitter
            8 août 2017 à 17:58:31

            @I.mnu:
            Premièrement, merci de ne pas déterrer des vieux sujet pour y greffer ton problème, il est préferable de créer un nouveau sujet (les necros, on aime pas trop ca, et les chirugiens fou non plus).

            Ensuite, la fonction getWindow() ne fais pas partie de SFML, mais du programme de l'OP, qui repond à son besoin particulier (forcément differant du tient).
            Merci de te renseigner sur la documentation de SFML, tu y trouveras probablement ton bonheur.

            • Partager sur Facebook
            • Partager sur Twitter
              18 août 2017 à 12:59:21

              @Deedolith

              Merci de m'avoir répondu. Effectivement j'ai ouvert un nouveau sujet pour le même problème et malheureusement personne a répondu. Alors je me suis permis de déterrer ce vieux sujet et là tu m'as répondu.

              Je suis complément dans le flou vu ta réponse avec getwindow(). Je cherche a faire une capture d'ecran sur un phone Android avec Visual Studio (c#) et xamarin. Avec les exemples que je trouve sur le net j'ai toujours une erreur avec getwindow() alors je cherche quelqu'un qui pourrai m'aider.

              Merci

              • Partager sur Facebook
              • Partager sur Twitter

              Problème d'affichage avec la vue de SFML

              × 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