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

Auteur Sujet: [Résolu][SF::View] Comment on utilise un viewport ?  (Lu 3788 fois)

0 Membres et 1 Invité sur ce sujet

nirito

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
[Résolu][SF::View] Comment on utilise un viewport ?
« le: Août 01, 2015, 02:00:58 pm »
Bonjour,
depuis quelques semaines, j'essaye de m'entrainer à utiliser la SFML (en c++) mais je bloque toujours dans l'utilisation de sf::View donc je viens à vous afin d'avoir des réponse à mes questions. (je précise que j'ai été voir le tutoriel que Sfml-dev.org propose et celui du github d'une personne qui fait des tuto à propos de sfml)

Je ne comprends pas le fonctionnement et l'utilité de la méthode setViewport() ?
j'ai cru comprendre qu'elle sert à afficher la partie d'une vue que l'on veut sur une partie de l'écran mais je ne comprends pas ce que représente les deux dernières valeurs.
Pouvez vous m'expliquer ?
« Modifié: Août 02, 2015, 09:57:47 pm par nirito »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : [SF::View] utilisation de setViewport
« Réponse #1 le: Août 01, 2015, 02:32:42 pm »
Les 2 dernières valeurs de quoi ? Du sf::FloatRect que tu passes à setViewport ?
C'est la largeur et la hauteur de la zone où tu veux afficher ta vue. C'est une valeur relative entre 0 et 1.



Par exemple sur cette image de jeu, on pourrait dira qu'il y a 2 viewport, un qui prend la moitié gauche de l'écran, un qui prend la moitié droite de l'écran.
Admettons que tu veuilles définir le viewport de droite :
horizontalement il commence à la moitié de l'écran (0.5), et sa largeur est la moitié de l'écran (0.5)
verticalement il commence tout en haut (0), et sa hauteur prend tout l'écran (1)
ce qui donne pour le viewport un sf::FloatRect(0.5f, 0.f, 0.5f, 1.f)
(Pour rappel, les 4 valeur que tu donnes à sf::FloatRect c'est le x, le y, la largeur, et la hauteur)

nirito

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [SF::View] utilisation de setViewport
« Réponse #2 le: Août 01, 2015, 03:43:11 pm »
Merci donc si j ai bien compris
Si j'ai une view (avec une image ayant la taille de la view)  et une fenêtre plus petite. (800*400 et 400*400)
je dois mettre une viewport comme ça (0,0,tailleVue/tailleFenetre,1) pour l afficher sans redimensionement? mais dés lors je ne peux pas mettre les positions que je veux directement ? je dois trouver un moyen ? (-(positionQueJeVeux/tailleFenetre),0,2,1) comme ça ?

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : [SF::View] utilisation de setViewport
« Réponse #3 le: Août 01, 2015, 04:15:27 pm »
Désolé j'ai pas compris grand chose de ce que tu racontes.  :D

Définir un viewport sert uniquement si tu ne veux pas que ta vue occupe toute la fenêtre. Par exemple une minimap dans un coin de la fenêtre, ou un écran splitté. Dans la plupart des cas on laisse le viewport par défaut (= la vue prend toute la fenêtre)

Si tu veux pas que ce que tu dessines sur ta vue soit "redimensionné", tu fais une vue de la même taille que la fenêtre et tu laisses le viewport par défaut. (en fait c'est déjà ce que fait la vue par défaut)

Et impossible que ton viewport ait 2 comme largeur, il dépasserait de la fenêtre !  :o
« Modifié: Août 01, 2015, 04:20:48 pm par G. »

nirito

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [SF::View] utilisation de setViewport
« Réponse #4 le: Août 01, 2015, 06:09:19 pm »
viewport sert seulement à ça ? Mais donc si j'ai une vue qui est plus grande que la fenêtre , comment puis-je l'afficher sans qu'elle soit redimensionné afin qu'après je puisse la faire défiler ?
« Modifié: Août 01, 2015, 06:43:28 pm par nirito »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SF::View] utilisation de setViewport
« Réponse #5 le: Août 01, 2015, 07:33:05 pm »
Tu ne peux pas avoir une vue plus grande que la fenêtre, une vue sert justement à définir ce que tu affiches dans la fenêtre. Donc tu la mets plus ou moins petite ou grande selon le niveau de "zoom" que tu veux, c'est tout. Relis bien le tutoriel, c'est vraiment bien expliqué normalement.
Laurent Gomila - SFML developer

nirito

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [SF::View] utilisation de setViewport
« Réponse #6 le: Août 01, 2015, 07:54:43 pm »
Ah d'accord. Je pensais (bien que j'ai lu le tuto mais j'ai du mal le saisir) que cela fonctionnait un peu comme les NSView de l'objective-c.
Mais sinon en faisant ma manip précédemment écrite, j'arrive à afficher une zone de ma vue et en la bougeant j'arrive à afficher le reste.

Est-ce un problème de détourner l'utilisation du sf::View pour arriver à mes fins ?
donc en gros je fais ça
sf::RenderWindow window1(sf::VideoMode(400, 400), "level", sf::Style::Titlebar | sf::Style::Close);
sf::View vue1(sf::FloatRect(0, 0, 800, 400));
vue1.setViewport(sf::FloatRect(-300/400, 0, 2,1));
je mets 2 car 400*2+800 et ça permet d'avoir toute la vue sans redimensionnement
Le -300/400 car 400 = la taille de la fenêtre, 300 = la position que je veux, et je prends l'opposé pour reculé la vue.
En faisant ça, ça ressemble plus au NSView de l'objective-c et j'arrive à faire ce que je veux mais est-ce un problème ? (exemple s'il y a une mise à jour ou si cela peut provoquer quelques fois des erreurs)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SF::View] utilisation de setViewport
« Réponse #7 le: Août 01, 2015, 10:28:54 pm »
Ca marche mais c'est compliqué et ça ne sert à rien : tu as une vue 2x plus large que la fenêtre et tu l'affiches dans un viewport 2x plus large que la fenêtre. Tu ne ferais rien, ça aurait le même effet.

Au final tu veux juste bouger ta vue c'est ça ?

sf::View vue1(sf::FloatRect(-300, 0, 400, 400));
// et c'est tout
Laurent Gomila - SFML developer

nirito

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [SF::View] utilisation de setViewport
« Réponse #8 le: Août 02, 2015, 11:09:03 am »
Oui je veux la bouger mais en faisant cela, si je dessine quelque chose en dehors de la vue1, cela va être dessiné sur quoi ? la vue par défaut de l'écran ? Et donc mes objets dessinés ne seront pas sur les mêmes vues ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SF::View] utilisation de setViewport
« Réponse #9 le: Août 02, 2015, 11:33:21 am »
T'as vraiment rien compris aux vues en fait ;D

Il n'y pas de "en dehors de la vue", la vue définit ce que tu vois dans la fenêtre donc ce qui est en "dehors" n'est simplement pas visible dans la fenêtre, ce ne sera pas affiché.

Une vue ce n'est qu'une transformation. Par défaut tu vois la zone de ton monde qui correspond à la taille de la fenêtre, et qui a pour origine (0, 0). Mais si tu veux voir une autre partie de ton monde, par exemple ce qui se passe en (5000, 5000), alors tu vas simplement déplacer ta vue vers ces nouvelles coordonnées. La vue c'est comme tes yeux : si tu en as marre de fixer ton clavier alors tu vas bouger tes yeux ailleurs, pour voir ta souris par exemple. Et si tu veux tout voir d'un coup alors tu vas reculer pour agrandir ton champ de vision. Mais ta souris et ton clavier seront toujours là, au même endroit. C'est juste que selon où tu vas regarder, tu vas les voir ou non, à un endroit ou un autre de ton champ de vision.

Je ne sais vraiment pas comment l'expliquer autrement... c'est vraiment très simple comme concept, n'imagine pas des choses compliquées.
Laurent Gomila - SFML developer

nirito

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [SF::View] utilisation de setViewport
« Réponse #10 le: Août 02, 2015, 09:05:46 pm »
Aaah d'accord, je comprends enfin pourquoi cela s'appelle caméra 2d.
Mais une dernière question, est-ce normale de devoir set ma view à chaque modification de celle-ci ?
vue1.move(200,0);
window1.setView(vue1); //ça marche pas sans
Et j'ai pu voir sur d'autre topics que je pourrais avoir plusieurs vues et les superposées.(notamment sur le tuto du site)
Comment est-ce possible si ce ne sont que des caméras ? A moins que je puisse afficher ce que je veux par la caméra en faissant un window.setView(vue1) puis window.draw(monObjet) et ensuite changer de view ?

+ merci de votre aide à vous et à G.  :)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : [SF::View] utilisation de setViewport
« Réponse #11 le: Août 02, 2015, 09:33:20 pm »
Citer
Mais une dernière question, est-ce normale de devoir set ma view à chaque modification de celle-ci ?
C'est expliqué dans une grosse boîte rouge dans le tutoriel...

Citer
Et j'ai pu voir sur d'autre topics que je pourrais avoir plusieurs vues et les superposées.(notamment sur le tuto du site)
Comment est-ce possible si ce ne sont que des caméras ? A moins que je puisse afficher ce que je veux par la caméra en faissant un window.setView(vue1) puis window.draw(monObjet) et ensuite changer de view ?
Oui. Comme je te l'ai dit, une vue ce n'est qu'une transformation. Donc tu mets une vue, tu dessines, tu mets une autre vue, tu dessines autre chose, etc. Chaque objet sera dessiné en fonction de la vue qui est active au moment où tu le dessines.
Laurent Gomila - SFML developer

nirito

  • Newbie
  • *
  • Messages: 7
    • Voir le profil
Re : [SF::View] utilisation de setViewport
« Réponse #12 le: Août 02, 2015, 09:51:02 pm »
Ah oui, j'avais seulement lu la fin de la boite rouge sur le fait qu'en créer beaucoup n'était pas un problème. ::)
Donc merci pour vos réponses et j'espère pouvoir vous en poser d'autres une prochaine fois.  :)