Forum de la communauté SFML

Aide => Graphique => Discussion démarrée par: noclck le Août 07, 2012, 01:33:59 pm

Titre: Scrolling 2D iso.
Posté par: noclck le Août 07, 2012, 01:33:59 pm
Bonjour,

Je suis en train de faire divers test sur de la 2D isometrique, mais j'ai un gros soucis avec le scrolling.
En gros avant j'avais une Map de 100 par 100 j'affichais toute la cartes avec 200 FPS. Mais j'ai decider de corser un peu les choses, et de n'afficher que les sprites qui ont besoin d'etre afficher donc j'en ai une de 900 par 900.

Pour le scrolling, je suis partie sur plusieurs piste de reflexion et celle que j'ai juger simple et meilleur a mettre en place (vous me direz si j'ai tort), en gros :
 

Le problème c'est que j'ai des gros soucis lors du scrolling, ou tout est decaller quand on se deplace et ca fait 2 jours que je cherches une solutions donc je viens demander un peu d'aide.

Au niveau du code voila la partie intéressante :

- J'utilise SFML 2.0 .
- map est de type boost::multi_array<sf::Sprite, 2>
- La positions des sprites est calculer avant la boucle de jeu.
- SPR_W et SPR_H sont des #define des tailles de mes tiles


        app.clear(sf::Color(0, 0, 0));
        app.setView(camera);
        //POSITION DE DEPART
        startCoor.y = camera.getCenter().y - (app.getSize().y / 2);
        startCoor.x = camera.getCenter().x - (app.getSize().x / 2);

        //POSITION MAXIMUM
        int maxY = (camera.getCenter().y - (app.getSize().y / 2)) + app.getSize().y;
        int maxX = (camera.getCenter().x - (app.getSize().x / 2)) + app.getSize().x;
       
        for (int j = startCoor.y; j < maxY; j += SPR_H / 2) { // POUR CHAQUE LIGNE
            for (int i = startCoor.x; i < maxX; i += SPR_W / 2) { //POUR CHAQUE COLONE
                //ON DETERMINE LES COORDONEES REEL DANS LA MAP
                sf::Vector2<float> mapCoor = positionIso(app.getSize(), camera.getCenter(), i, j);

                //ON VERIFIE SI CELA DOIT ETRE AFFICHER OU NON
                if ((mapCoor.x >= 0 && mapCoor.y >= 0)
                    && (mapCoor.y < map.size() && mapCoor.x < map[mapCoor.y].size()))
                    app.draw(map[mapCoor.y][mapCoor.x]); // ON DRAW
            }
        }

        app.setView(app.getDefaultView());
 

Des screenshot pour vous aidez a comprendre mon soucis :

(https://dl.dropbox.com/u/25370506/Screen/position_initial.png)
(https://dl.dropbox.com/u/25370506/Screen/deplace_1.png)
(https://dl.dropbox.com/u/25370506/Screen/deplacement_2.png)


Je vous remercie d'avance.
Cordialement,
Titre: Re : Scrolling 2D iso.
Posté par: Lo-X le Août 29, 2012, 11:37:26 pm
Je ferais comme ça :

1) Je dessine toute ma map sur un sf::RenderTexture. Comme ça elle est dessinée une fois pour toute, même si tu peux la changer quand y'a besoin.
2) Afficher la RenderTexture à l'écran est trivial et en plus ne sera affiché que ce qui tient à l'écran (le reste est ignoré)
3) Je déplace ma vu du point A au point B, ça donne l'impression que c'est la map qui bouge sans avoir à changer quoi que ce soit aux coordonnées des tiles.
Titre: Re : Scrolling 2D iso.
Posté par: christophedlr le Septembre 04, 2012, 04:41:55 pm
Lo-X, le problème c'est qu'avec les vues il faut recalculer les positions non ? C'est en tout cas pour SFML 1.6 ce que j'en ai compris.
Titre: Re : Re : Scrolling 2D iso.
Posté par: Lo-X le Septembre 04, 2012, 05:40:46 pm
Lo-X, le problème c'est qu'avec les vues il faut recalculer les positions non ? C'est en tout cas pour SFML 1.6 ce que j'en ai compris.

Pas du tout normalement. C'est la vue qui bouge, pas les tiles. C'est tout le principe de la vue d'ailleurs.
Titre: Re : Scrolling 2D iso.
Posté par: christophedlr le Septembre 04, 2012, 07:29:13 pm
En fait j'ai pas trop compris comment fonctionne les vues, j'ai posté justement et j'attend l'aide de Laurent pour comprendre comment les utiliser ;)
Titre: Re : Scrolling 2D iso.
Posté par: Laurent le Septembre 04, 2012, 08:01:09 pm
Citer
En fait j'ai pas trop compris comment fonctionne les vues, j'ai posté justement et j'attend l'aide de Laurent pour comprendre comment les utiliser
Donc c'est peut-être pas la peine de répondre aux autres tant que tu n'as pas compris ;)