1
Graphique / 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 :
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
Des screenshot pour vous aidez a comprendre mon soucis :
Je vous remercie d'avance.
Cordialement,
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());
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,