Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: Nerhows le Avril 30, 2018, 06:40:22 pm

Titre: Problème avec la méthode sf::View::zoom
Posté par: Nerhows le Avril 30, 2018, 06:40:22 pm
Bonjours a tous,

Je souhaite faire un système de "map" sur laquelle les joueurs pourront zoomer et dé-zoomer à leur guise, ainsi j'utilise une view prenant tout mon écran dans laquelle une sf::RectangularShape sert de map.

Pour zoomer j'utilise la fonction sf::View::zoom sur cette vue avec par exemple un coefficient de 1.25 et pour dé-zoomer j'inverse la tendance avec un coefficient de 0.8.

Les valeurs de zoom max et min sont gérées via une autre variable que j'incrémente moi même pour chaque zoom et dé-zoom étant donné qu'il n'est pas possible de récupérer le zoom actuel d'une view via par exemple une méthode sf::View::getView...

Mon problème est qu'en exécutant une suite de zoom puis une suite de dé-zoom plusieurs fois, ma carte devient de plus en plus petite ...
Ainsi en exécutant cette manip un nombre de fois tendant vers l'infinie ma map tend à disparaître due au fait qu'elle soit de plus en plus petite.

Si quelqu'un à une idée voilà mon code ^^ :

void World::zoomWorld(bool flag_direction)
{
        if (flag_direction == true && zoom >= MIN_ZOOM) {
                this->world_view.zoom(0.8);
                zoom *= 1-ZOOM_RATIO;
        }
        if (flag_direction == false && zoom <= MAX_ZOOM) {
                this->world_view.zoom(1/0.8);
                zoom *= 1+ZOOM_RATIO;
        }
}

avec ::

#define MAX_ZOOM 1.40
#define MIN_ZOOM 0.60
#define ZOOM_RATIO 0.05
Titre: Re: Problème avec la méthode sf::View::zoom
Posté par: Laurent le Avril 30, 2018, 07:36:07 pm
Pourquoi est-ce que tu n'utilises pas ta variable zoom en paramètre de View::zoom ?
Titre: Re: Problème avec la méthode sf::View::zoom
Posté par: Nerhows le Mai 02, 2018, 12:25:18 am
Alors si j'ai bien compris, la méthode sf::View::zoom nous permet de zoomer en étant dans le référentiel actuel sur le zoom et non basé sur un " zoom de départ de 1" ainsi je dois forcement avoir une valeur fixe > 1 pour zoomer et son inverse soit 1/(cette même valeur) pour revenir au niveau de zoom de départ donc je ne peut pas utiliser ma variable "zoom" qui me permet de savoir quand j'atteins un certain niveau de zoom ou de dézoom défini par mes constante "MAX_ZOOM" et "MIN_ZOOM".

Mais j'ai trouvé mon erreur, en gros elle venait de ces deux lignes :

zoom *= 1-ZOOM_RATIO;
..
zoom *= 1+ZOOM_RATIO;

Et oui ! mon niveau en math est tel que pour moi : 1 * (1+a) * (1-a) = 1, sauf que non !
d'ou le décalage que j'obtenais au fur et à mesure de zoom et de dézooms successifs.

les nouvelles lignes sont donc :

void World::zoomWorld(bool flag_direction)
{
   if (flag_direction == true && zoom >= MIN_ZOOM) {
      this->world_view.zoom(0.9);
      zoom -= ZOOM_RATIO;
   }
   if (flag_direction == false && zoom <= MAX_ZOOM) {
      this->world_view.zoom(1/0.9);
      zoom += ZOOM_RATIO;
   }
}

Et là ça marche beaucoup mieux.

(Je m'excuse d'avance je ne trouve pas la balise pour mettre le code sous format "code c++" .. ^^' )