Forum de la communauté SFML

Aide => Fenêtrage => Discussion démarrée par: Quetzakol le Août 06, 2012, 08:15:55 pm

Titre: Passer en mode plein écran sans étirer
Posté par: Quetzakol le Août 06, 2012, 08:15:55 pm
Bonjour,
Voici mon problème : je crée une fenêtre de taille fixe (par exemple 500x500). J'aimerais par la suite pouvoir passer le programme en mode plein écran. Jusque là ça va. Mais le problème est que l'image de départ est étirée aux dimensions de l'écran, et donc la fenêtre qui au départ était carrée est redimensionnée en rectangle.

Je voudrais que l'image soit agrandie mais reste carrée et que sur les côtés, des bandes noires apparaissent, mais j'ignore si cela est possible facilement avec la SFML...  :-\

Quelqu'un aurait-il une solution ?
Merci d'avance,
Quetzakol.
Titre: Re : Passer en mode plein écran sans étirer
Posté par: Laurent le Août 06, 2012, 08:21:58 pm
Pour ajuster la vue à la taille de la fenêtre, il faut chopper l'évènement sf::EVent::Resized, et changer la vue (sf::View) pour qu'elle ait la nouvelle taille de la fenêtre. C'est une question fréquente, si tu veux des détails tu devrais en trouver pas mal sur le forum.

Pour les bandes, deux rectangles noirs font l'affaire, ou bien jouer avec le viewport si tu utilises SFML 2.
Titre: Re : Passer en mode plein écran sans étirer
Posté par: Quetzakol le Août 06, 2012, 09:59:45 pm
Merci, ça marche  ;)
Par contre j'ai essayé d'utiliser le viewport mais je n'ai absoolument rien compris à son fonctionnement...
Titre: Re : Passer en mode plein écran sans étirer
Posté par: Laurent le Août 06, 2012, 11:06:20 pm
Le viewport définit la partie de la fenêtre dans laquelle le contenu de la vue s'affiche. Par défaut c'est toute la fenêtre.

Petite particularité au niveau des coordonnées : au lieu d'être en pixels, elles sont normalisées entre 0 et 1. Donc un viewport qui fait toute la fenêtre est défini par le rectangle qui va de (0, 0) à (1, 1). Ca permet au viewport de garder toujours les mêmes proportions lorsque la fenêtre est redimensionnée.
Titre: Re : Passer en mode plein écran sans étirer
Posté par: Armulis le Octobre 16, 2014, 03:51:03 pm
Salut!
J'ai utilisé sf::View et la fonction "Viewport()" pour faire des bandes noires. Avec ce bout de programme, l'image est ajustée à la fenêtre en laissant des bandes noires horizontales ou verticales, selon la proportion entre la fenêtre et l'image.
Voici l'extrait:
// Je passe la déclaration des variables; leur nom devrait être explicite


// Dimensions du "output" de "view_1"
View_1.setSize(largeur_ecran, hauteur_ecran);


// Position du centre du "input" de "view_1"
View_1.setCenter(largeur_image/2, hauteur_image/2);


// Déterminer s'il faut des bandes horizontales ou verticales
if (hauteur_ecran/largeur_ecran < hauteur_image/largeur_image)
// Fenêtre plus large que l'image (relativement à leur hauteur)
// Bandes à-gauche et à-droite
{   // Définir la proportion entre le "input" et le "output" de "view_1" pour que le haut et le bas correspondent
     View_1.zoom(hauteur_image/hauteur_ecran);


    // Ne représenter que la zone "input" (et pas un élément extérieur pouvant par-exemple glisser dedans), et la représenter au-centre de la fenêtre
    View_1.setViewport({(1-largeur_image*hauteur_ecran/hauteur_image/largeur_ecran)/2, 0, largeur_image*hauteur_ecran/hauteur_image/largeur_ecran, 1});
}
else
// Fenêtre plus haute que l'image (relativement à leur largeur), ou formats équivalents
// Bandes en-haut et en-bas
{   // Définir la proportion entre le "input" et le "output" de "view_1" pour que la gauche et la droite correspondent
     View_1.zoom(largeur_image/largeur_ecran);


    // Ne représenter que la zone "input" (et pas un élément extérieur pouvant par-exemple glisser dedans), et la représenter au-centre de la fenêtre
    View_1.setViewport({0, (1-hauteur_image*largeur_ecran/largeur_image/hauteur_ecran)/2, 1, hauteur_image*largeur_ecran/largeur_image/hauteur_ecran});
}


// Attribuer "view_1" à "RenderWindow_1"; je crois qu'il n'y a pas besoin de le refaire en cas de modification de "view_1", mais il faudrait vérifier
RenderWindow_1.setView(View_1);