IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

SDL et Windows 8, problème de résolution


Sujet :

SDL

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut SDL et Windows 8, problème de résolution
    Bonsoir, j'ai un léger problème dans une appli SDL que je suis entrain de coder, lorsque je la lance en plein écran (Je choisis une résolution de 800x600 et j'ai un écran 16/9), la fenêtre n'occupe qu'une partie de l'écran. Le problème vient soudainement d'apparaître sans que je ne touche à la gestion de la fenêtre dans le code et j'ai toujours codé de cette façon sans problème. J'ai l'impression que ce défaut est présent depuis que j'ai redémarré le PC, on dirait bien que Windows décide de maintenir la fenêtre en 4/3, alors que cela ne se produit pas pour une appli qui n'utilise pas SDL.
    A signaler aussi que le problème se pose également avec d'autres applis SDL présentes sur mon PC et auxquelles je n'ai pas touché.

    Pour mettre ma fenêtre en plein écran, je fais simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecran = SDL_SetVideoMode (800,600,32, SDL_FULLSCREEN)
    Voici mon problème résumé en images :

    Avant :

    Nom : Normal.jpg
Affichages : 384
Taille : 157,9 Ko

    Maintenant :

    Nom : Probleme.jpg
Affichages : 435
Taille : 122,1 Ko

    Merci par avance à qui pourra m'aider

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    J'ai pas grand chose a dire sur ce probleme , j'ai jamais trop compris totalement la plein écran de la SDL , vu qu'il a un fonctionnement un peu 'aléatoire' , et j'ai jamais trop utilisé le plein écran pour connaitre totalement le probleme x)

    On tout cas cela résout surement pas ton probleme mais il est plus interessant de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecran = SDL_SetVideoMode (800,600,24, SDL_FULLSCREEN)
    ça prend moi de place le 24 et le 32 m'avait posé quelque souci sur linux avec SDL/OpenGL.
    Et n'oublie pas de libéré ton écran a chaque appel de SDL_SetVideoMode il alloue de la mémoire (quand on switch entre plein écran/fenêtre il faut libéré ecran a chaque fois) .

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Merci pour ce conseil, mais je suis réellement embêté car ce sont tous mes programmes SDL qui ne se mettent plus en plein écran. Quand je lance Stellarium (Qui utilise Qt il me semble), ce problème ne se pose pas. J'ignore ce qui a pu se passer sur ce PC pour que ça change du jour au lendemain et uniquement pour SDL

  4. #4
    Rédacteur/Modérateur

    Avatar de yahiko
    Homme Profil pro
    Développeur
    Inscrit en
    Juillet 2013
    Messages
    1 423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 1 423
    Points : 8 700
    Points
    8 700
    Billets dans le blog
    43
    Par défaut
    Peut-être regarder du côté d'une mise à jour automatique d'un driver...
    Tutoriels et FAQ TypeScript

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Je viens d'essayer de mettre à jour le pilote de la carte graphique et Windows me dit que le pilote est à jour (Avril 2014). Je ne comprends pas, ce problème apparaît d'un coup.
    J'ai testé mon appli sur une tablette Lenovo équipée de Windows 8 et là pas de problème

    Y a-t-il un moyen de réinstaller les pilotes de la carte graphique ?

    Bon je viens de faire une mise à jour depuis le site d'AMD mais ça n'a pas résolu le problème

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 579
    Points
    218 579
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Je pense aussi que c'est à cause de la dernière mis à jour du pilote graphique.
    Du coup, je pense que c'est un mode/option qui doit être configurable dans le panneau du pilote graphique/carte graphique.

    Un autre conseil : pourquoi ne pas passer à la SDL 2, qui gère mieux le plein écran (y a un guide de migration ici). Mais bon, je n'aime pas trop suggéré les migrations, surtout pour un projet qui semble aussi avancé.

    Finalement : il a l'air bien votre projet. On peut jouer ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Ce n'est pas du tout un problème de SDL.

    C'est la gestion de l'écran. Quand tu écris un jeu sur PC il faut gérer tous les cas possibles et tous les ratios d'écrans possibles.

    Si tu ne veux pas le faire, l'OS/GPU/Écran va le faire à ta place et le résultat final va dépendre de la combinaison de tout ça et des settings utilisateurs.

    L'utilisateur peut utiliser les settings OSD (on screen display) pour modifier le comportement du resizing par défaut (si résolution non native) : http://www.tftcentral.co.uk/images/d...713h/osd_8.jpg, http://assets.vr-zone.net/13125/DSCF1767.JPG
    Le GPU aussi a ses settings http://cdn.overclock.net/5/57/5747632d_FPVgc5K.png
    ainsi que l'OS et finalement l'application.

    Idéalement ton application devrait s'adapter aux différents ratios pour ne serait-ce qu’empêcher que tes images soient stretchées en 16/9 (ou 21/9 pour certains !) ou compressées en 4/3. Tu peux aussi laisser le choix de l'utilisateur dans ton application (dans le menu settings+option+visuals) pour qu'il choisisse au mieux la résolution qui lui convient. C'est ce que la plupart des jeux modernes font.

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  8. #8
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Dans mon application, je laisse la possibilité de choisir entre un format 4/3 ou 16/9, j'utilise en fait OpenGL pour un rendu 3D et j'adapte alors le ratio entre le fovy et le fovx avec gluPerpective(), en fonction de l'option choisie (4/3 ou 16/9). Ce n'est donc pas un problème que ma fenêtre soit étirée car les graphismes ne sont pas déformés, si je passe de 4/3 à 16/9, ça augmente simplement le champ de vision horizontal.

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Je me permets de relancer ce sujet car je me penche de nouveau sur le problème en ce moment : Dans mes programmes utilisant SDL et OpenGL, il y a des passages en 2D (Pour afficher des menus), où j'utilise gluOrtho2D() pour avoir un repère 2D compris de 0 à 800 en horizontal et de 0 à 600 en vertical.
    Pour sélectionner une option dans un menu, je récupère les coordonnées du curseur, qui dépendent de la résolution de la fenêtre. Exemple :
    Si je fais gluOrtho2D(0, 800, 0, 600), que j'ai une fenêtre en 800x600 et que le bouton sur lequel cliquer est compris entre 100 et 200 pixels en horizontal, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(evenement.button.x > 100 && evenement.button.x < 200)
    {
     
        ...
    }
    Si ma fenêtre n'est plus en 800x600, ça fausse les coordonnées du curseur.
    Bref je viens tout de même de tenter autrechose, j'ai remplacé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecran = SDL_SetVideoMode(800, 600, 24, SDL_OPENGL | SDL_FULLSCREEN)
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecran = SDL_SetVideoMode(1067, 600, 24, SDL_OPENGL | SDL_FULLSCREEN)
    Car 1067 est la largeur d'une fenêtre de format 16/9 et de hauteur 600. Dans ce cas, le problème de plein écran est résolu, et je modifie alors ma fonction affichant le menu 2D pour qu'elle tienne compte de cette nouvelle résolution lorsque la fenêtre est en plein écran. Un autre problème apparaît alors : Je souhaite remplacer le curseur par une main lorsque celui-ci est sur le bouton, je récupère alors les coordonnées de la souris mais la main apparaît alors à un tout autre endroit. Je ne trouve aucune solution à ce problème, voici le code de la fonction affichant le menu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    void MenuCible(Principale *ptr, SDL_Event *evenement)	//ptr est un pointeur sur une structure contenant toutes les données importantes, comme les textures
    {
        ... //Passage en 2D
     
        if(ptr->format == false)		//Format 4/3
        {
            gluOrtho2D(0, 800, 0, 600);
        	glBindTexture(GL_TEXTURE_2D, ptr->textures[3]);
        	glBegin(GL_QUADS);
        	glTexCoord2i(0, 0);      glVertex2f(200, 150);		//Coordonnées du menu en 800x600
        	glTexCoord2i(0, 1);      glVertex2f(200, 450);
        	glTexCoord2i(1, 1);      glVertex2f(600, 450);
        	glTexCoord2i(1, 0);      glVertex2f(600, 150);
        	glEnd();
        }
     
        if(ptr->format == true)		//Format 16/9
        {
            gluOrtho2D(0, 1067, 0, 600);
        	glBindTexture(GL_TEXTURE_2D,ptr->textures[3]);
        	glBegin(GL_QUADS);
        	glTexCoord2i(0, 0);      glVertex2f(266, 150);		//Coordonnées du menu en 1067x600
        	glTexCoord2i(0, 1);      glVertex2f(266, 450);
        	glTexCoord2i(1, 1);      glVertex2f(800, 450);
        	glTexCoord2i(1, 0);      glVertex2f(800, 150);
        	glEnd();
        }
     
        if(evenement->type == SDL_MOUSEMOTION)
        {
            if(format == false)
    	{
    	    if(evenement->motion.x>= 213 && evenement->motion.x <= 400 && evenement->motion.y >= 278 && evenement->motion.y <= 314)
                {		//Coordonnées du bouton en 800x600
                    SDL_ShowCursor(false);		//Curseur masqué
     
                    glBindTexture(GL_TEXTURE_2D,ptr->textures[4]);		//Dessin de la main aux coordonnées du curseur
                	glBegin(GL_QUADS);
                	glTexCoord2i(0, 0);      glVertex2f(evenement->motion.x, (600-evenement->motion.y)-20);
                	glTexCoord2i(0, 1);      glVertex2f(evenement->motion.x, (600-evenement->motion.y));
                	glTexCoord2i(1, 1);      glVertex2f(evenement->motion.x+15, (600-evenement->motion.y));
                	glTexCoord2i(1, 0);      glVertex2f(evenement->motion.x+15, (600-evenement->motion.y)-20);
                	glEnd();
                }
                else
                    SDL_ShowCursor(true);            //Dans les autres cas, le curseur n'est pas masqué
    	}
     
            if(format == true)
    	{
    	    if(evenement->motion.x>= 284 && evenement->motion.x <= 532 && evenement->motion.y >= 278 && evenement->motion.y <= 314)
                {		//Coordonnées du bouton en 1067x600
                    SDL_ShowCursor(false);
                    glBindTexture(GL_TEXTURE_2D,ptr->textures[4]);
     
                	glBegin(GL_QUADS);
                	glTexCoord2i(0, 0);      glVertex2f(evenement->motion.x, (600-evenement->motion.y)-20);
                	glTexCoord2i(0, 1);      glVertex2f(evenement->motion.x, (600-evenement->motion.y));
                	glTexCoord2i(1, 1);      glVertex2f(evenement->motion.x+15, (600-evenement->motion.y));
                	glTexCoord2i(1, 0);      glVertex2f(evenement->motion.x+15, (600-evenement->motion.y)-20);
                	glEnd();
                }
                else
                    SDL_ShowCursor(true);
    	}
        }
     
        ...
    }
    Le même problème se pose avec SDL_GetMouseState()

    Si quelqu'un sait comment résoudre ce problème de plein écran ou bien pourquoi la main n'apparaît pas au même emplacement que le curseur ...

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 579
    Points
    218 579
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    Vous devriez caché votre curseur, une et une unique fois.
    De plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(ptr->format == false)		//Format 4/3
    Vous êtes sur que ce test fonctionne comme vous l'attendez ? Notamment, j'ai peur que votre décalage soit à cause de la mauvaise exécution du gluOrtho2D().
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2013
    Messages
    309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2013
    Messages : 309
    Points : 105
    Points
    105
    Par défaut
    Je m'excuse pour cette réponse tardive, juste pour préciser que j'ai fini par opter pour la décision qui s'imposait : Renoncer au flag SDL_FULLSCREEN. La fonction SDL_GetVideoInfo() permet d'obtenir la résolution du bureau si elle est appelée avant SDL_SetVideoMode(), après quoi je crée une fenêtre centrée, sans bordure et barre de titres, et de la résolution obtenue avec SDL_GetVideoInfo(). Il m'a juste fallu reprendre toutes les fonctions de mes projets SDL/OpenGL qui faisaient la conversion des coordonnées SDL en coordonnées OpenGL car la résolution n'est plus de 800x600 mais celle de mon bureau.
    Bref merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème X window après chgt de résolution
    Par je®ome dans le forum Matériel
    Réponses: 2
    Dernier message: 04/07/2007, 13h51
  2. [WINDOWS XP] Problème de boot
    Par Hoegaarden dans le forum Windows XP
    Réponses: 44
    Dernier message: 16/11/2005, 09h27
  3. Probléme de résolution avec virtual PC
    Par wikers dans le forum Autres Logiciels
    Réponses: 4
    Dernier message: 19/08/2005, 10h04
  4. [Windows 2000] Problème pour le formatage
    Par banzaii dans le forum Windows XP
    Réponses: 16
    Dernier message: 13/07/2005, 16h09
  5. [Turbo Pascal] [Windows XP] Problème avec l'unité GRAPH
    Par themofleur dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 29/03/2003, 22h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo