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

Auteur Sujet: [SFML 2.0]Problème d'affichage de plusieurs vues  (Lu 5243 fois)

0 Membres et 3 Invités sur ce sujet

lolitroll

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
[SFML 2.0]Problème d'affichage de plusieurs vues
« le: Juin 15, 2013, 07:07:35 pm »
Boujour,
Voila mon problème : J'utilise la SFML 2.0 et j'ai commencé à faire un petit jeu à plusieurs mais j'ai un problème avec les vues. Je n'arrive pas à appliquer plusieurs vues en même temps :-\

Voila le bout de code concerné :
window.setView(redCarView);
window.setView(blueCarView);
window.display();

Merci d'avance pour votre aide.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #1 le: Juin 16, 2013, 11:08:55 am »
Tu ne peux pas appliquer plusieurs vues en même temps. Tu voulais faire quoi exactement ?
Laurent Gomila - SFML developer

lolitroll

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #2 le: Juin 16, 2013, 11:32:14 am »
Je voulais faire un jeu de voiture avec 2 vues : 1 à gauche et 1 à droite.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #3 le: Juin 16, 2013, 11:40:51 am »
Il faut afficher la scène deux fois, une fois pour chaque vue. Tu ne peux pas dessiner un objet une seule fois et le voir apparaître magiquement à deux endroits différents dans ta fenêtre ;)
Laurent Gomila - SFML developer

lolitroll

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #4 le: Juin 16, 2013, 11:52:42 am »
donc je dois alterner entre chaque tour de boucle le vue que j'affiche  :o ?

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #5 le: Juin 16, 2013, 12:10:41 pm »
oui.

window.setView( une vue );
affichage...
window.display();

window.setView( une autre vue );
affichage...
window.display();
« Modifié: Juin 16, 2013, 12:33:13 pm par Laurent »

lolitroll

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #6 le: Juin 16, 2013, 12:26:47 pm »
Oui mais du coup les vues clignotent...   ???

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #7 le: Juin 16, 2013, 12:33:03 pm »
Non, il faut afficher à chaque itération les deux vues.
Laurent Gomila - SFML developer

lolitroll

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #8 le: Juin 16, 2013, 12:54:41 pm »
Désolé si je me trompe mais ça n'affiche que la 2eme vue quand je fais :
window.setView(blueCarView);
window.display();
window.setView(redCarView);
window.display();
:-\

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #9 le: Juin 16, 2013, 01:16:19 pm »
window.setView(blueCarView);
// dessine ta scène

window.setView(redCarView);
// redessine ta scène

window.display();
Laurent Gomila - SFML developer

lolitroll

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #10 le: Juin 16, 2013, 01:21:33 pm »
Ça revient à ce que j'ai posté au début...
Citer
Boujour,
Voila mon problème : J'utilise la SFML 2.0 et j'ai commencé à faire un petit jeu à plusieurs mais j'ai un problème avec les vues. Je n'arrive pas à appliquer plusieurs vues en même temps :-\

Voila le bout de code concerné :
window.setView(redCarView);
window.setView(blueCarView);
window.display();

Merci d'avance pour votre aide.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #11 le: Juin 16, 2013, 01:35:27 pm »
Si ton premier bout de code est complet alors il manque le principal : dessiner des choses sur chaque vue. Dans mon code j'ai bien indiqué les endroits où tu dois dessiner ta scène.

Ensuite si tu veux qu'on arrête de deviner, et qu'on se concentre sur du concret, alors fournis un code complet minimal qui démontre ton problème.
Laurent Gomila - SFML developer

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #12 le: Juin 16, 2013, 01:46:16 pm »
oops , j'ai mis un display en trop ^^

lolitroll

  • Newbie
  • *
  • Messages: 8
    • Voir le profil
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #13 le: Juin 16, 2013, 02:15:18 pm »
Voila mon code :
bool multiplayer(sf::RenderWindow & window, sf::Font font)
{
        sf::Texture redCarTex, blueCarTex, grassTex, roadTex;
        sf::Sprite redCarSprite, blueCarSprite, grassSprite, roadSprite;

        bool overview = false;
        int mapX = 0;
        int mapY = 0;
        int map[WIDTH_MAP_TILE][HEIGHT_MAP_TILE] = {0};

        // Loading the map
        if(!loadLevel(map))
        {
                return false;
        }

        // Loading Textures

        // Grass
        if(grassTex.loadFromFile("ressources/grass.png"))
        {
                grassSprite.setTexture(grassTex);
        }
        else
        {
                return false;
        }


        // Road
        if(roadTex.loadFromFile("ressources/road.png"))
        {
                roadSprite.setTexture(roadTex);
        }
        else
        {
                return false;
        }

        // Red car
        if(!redCarTex.loadFromFile("ressources/car red.png"))
        {
                return false;
        }
        else
        {
                redCarTex.setSmooth(true);
                redCarSprite.setTexture(redCarTex);
                redCarSprite.setScale(0.5f, 0.5f);
                redCarSprite.setOrigin(CAR_WIDTH / 2, CAR_HEIGHT / 2);
                redCarSprite.setRotation(270);
        }

        // Blue car
        if(!blueCarTex.loadFromFile("ressources/car blue.png"))
        {
                return false;
        }
        else
        {
                blueCarTex.setSmooth(true);
                blueCarSprite.setTexture(blueCarTex);
                blueCarSprite.setScale(0.5f, 0.5f);
                blueCarSprite.setOrigin(CAR_WIDTH / 2, CAR_HEIGHT / 2);
                blueCarSprite.setRotation(270);
        }

        Car redCar(35 * WIDTH_TILE, 15 * HEIGHT_TILE, 90, 0);
        Car blueCar(36 * WIDTH_TILE, 15 * HEIGHT_TILE, 90, 0);

        // VIEWS

        sf::Vector2f quartSize(SCREEN_WIDTH / 4, SCREEN_HEIGHT / 2);

        // Red car view
        sf::Vector2f redCarCenter(redCar.getX(), redCar.getY());
        sf::View redCarView(redCarCenter, quartSize);
        redCarView.setViewport(sf::FloatRect(0, 0, 0.5f, 1));
       
        window.setView(redCarView);

        // Blue car view
       
        sf::Vector2f blueCarCenter(blueCar.getX(), blueCar.getY());
        sf::View blueCarView(blueCarCenter, quartSize);
        blueCarView.setViewport(sf::FloatRect(0.5f, 0, 0.5f, 1));

        window.setView(blueCarView);

        // Overview
        sf::Vector2f centerMap((WIDTH_MAP_TILE * WIDTH_TILE) / 2, (HEIGHT_MAP_TILE * HEIGHT_TILE) / 2);
        sf::Vector2f sizeMap( WIDTH_MAP_TILE * WIDTH_TILE, HEIGHT_MAP_TILE * HEIGHT_TILE);
        sf::View overviewCircuit(centerMap, sizeMap);

        window.setFramerateLimit(60);


        // Main loop
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Escape))
                {
                        return true;
                }

                redCar.move();
                blueCar.move();

                redCarView.setCenter(redCar.getX(), redCar.getY());
                blueCarView.setCenter(blueCar.getX(), blueCar.getY());

                if(redCar.getX() < SCREEN_WIDTH / 2)
                {
                        redCarView.setCenter(SCREEN_WIDTH / 2, redCar.getY());
                }

                if(redCar.getY() < SCREEN_HEIGHT / 2)
                {
                        redCarView.setCenter(redCar.getX(), SCREEN_HEIGHT / 2);
                }

                if(redCar.getX() < SCREEN_WIDTH / 2 && redCar.getY() < SCREEN_HEIGHT / 2)
                {
                        redCarView.setCenter(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);
                }

                // Red car speep up
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Z))
                {
                        redCar.speedUp();
                }
                // Red car speed down
                else
                {
                        redCar.speedDown();
                }

                // Red car slow down
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::S))
                {
                        redCar.slowDown();
                }

                // Red car turn right
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::D))
                {
                        redCar.turnRight();
                        redCarSprite.setRotation(redCar.getAngle());
                }

                // Red car turn left
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Q))
                {
                        redCar.turnLeft();
                        redCarSprite.setRotation(redCar.getAngle());
                }

                // Blue car speep up
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
                {
                        blueCar.speedUp();
                }
                // Blue car speed down
                else
                {
                        blueCar.speedDown();
                }

                // Blue car slow down
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
                {
                        blueCar.slowDown();
                }

                // Blue car turn right
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
                {
                        blueCar.turnRight();
                        blueCarSprite.setRotation(blueCar.getAngle());
                }

                // Blue car turn left
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
                {
                        blueCar.turnLeft();
                        blueCarSprite.setRotation(blueCar.getAngle());
                }
               
                // Switch view
                if(sf::Keyboard::isKeyPressed(sf::Keyboard::V))
                {
                        if(!overview)
                        {
                                overview = true;
                        }
                       
                }
                else
                {
                        overview = false;
                }

        window.clear();
               
                for(mapY = 0; mapY < HEIGHT_MAP_TILE; mapY++)
                {
                        for(mapX = 0; mapX < WIDTH_MAP_TILE; mapX++)
                        {
                                switch(map[mapX][mapY])
                                {
                                        // Grass
                                        case '0':
                                                grassSprite.setPosition(mapX * WIDTH_TILE, mapY * HEIGHT_TILE);
                                                window.draw(grassSprite);
                                                break;
                                       
                                        // Road
                                        case '1':
                                                roadSprite.setPosition(mapX * WIDTH_TILE, mapY * HEIGHT_TILE);
                                                window.draw(roadSprite);
                                                break;
                                }
                        }
                }

                redCarSprite.setPosition(redCar.getX(), redCar.getY());
                window.draw(redCarSprite);
                blueCarSprite.setPosition(blueCar.getX(), blueCar.getY());
                window.draw(blueCarSprite);

                if(!overview)
                {
                        window.setView(blueCarView);
                        window.setView(redCarView);
                        window.display();
                       
                }
                else if(overview)
                {
                        window.setView(overviewCircuit);
                        window.display();
                }
        }
        return true;
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SFML 2.0]Problème d'affichage de plusieurs vues
« Réponse #14 le: Juin 16, 2013, 02:26:42 pm »
Ca n'est pas du tout ce que je t'ai montré précédemment :P

Lorsque tu appelles setView, il ne se passe strictement rien. En l'occurence, tes objets ne sont pas redessinés dans la nouvelle vue. Donc appeler setView sans rien dessiner ensuite est inutile.

Il faut vraiment que tu dessines ce que tu veux voir dans ta vue après l'avoir mise en place. Si ce que tu veux voir dans tes vues c'est toute la scène, alors il faudra dessiner celle-ci plusieurs fois.

Dans mon code précédent, les commentaires "// dessine ta scène" c'est ce que toi tu dois faire, pas ce que setView fait.
Laurent Gomila - SFML developer

 

anything