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

Auteur Sujet: Scrolling 2D iso.  (Lu 4191 fois)

0 Membres et 1 Invité sur ce sujet

noclck

  • Newbie
  • *
  • Messages: 1
    • Voir le profil
Scrolling 2D iso.
« 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 :
 
  • Je calcul la position de départ (grace a une sf::View)
  • Je calcul la position maximum en X et Y pour que je reste dans le scope de l’écran
  • Je pars de la position de départ jusqu’à max, et avec une fonction qui convertit ma position pixel en index pour ma map, je détermine si oui ou non ça doit être afficher

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 :






Je vous remercie d'avance.
Cordialement,

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Re : Scrolling 2D iso.
« Réponse #1 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.

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
Re : Scrolling 2D iso.
« Réponse #2 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.

Lo-X

  • Hero Member
  • *****
  • Messages: 618
    • Voir le profil
    • My personal website, with CV, portfolio and projects
Re : Re : Scrolling 2D iso.
« Réponse #3 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.

christophedlr

  • Full Member
  • ***
  • Messages: 151
    • Voir le profil
    • E-mail
Re : Scrolling 2D iso.
« Réponse #4 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 ;)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Scrolling 2D iso.
« Réponse #5 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 ;)
Laurent Gomila - SFML developer

 

anything