Je suis sur un projet SDL2 que je veux faire en basse définition (320*224 en 4/3 - 336*210 en 16/10 et 426*240 en 16/9) pour avoir du gros pixel du genre du jeu kingdom classic.
Certains éléments du jeu sont issues d'une texture appliquée plusieurs fois en subissant une mise à l'échelle allant de 0.1 à 1.0.
Lorsque le jeu est dans une fenêtre, les plus petits éléments résultent en un unique pixel, c'est logique et ça me va très bien.
Le souci est que lors du passage en plein écran, ces éléments sont affichés à une résolution supérieure à celle attendu.
Par exemple en 16/10 chez moi, un pixel "jeu" correspond à 5*5 pixels moniteur, je supposais donc que le plus petit élément affiché ferait au minimum 5*5 pixels affichés, hors ces éléments sont affichés avec la résolution d'affichage, j'ai donc des pixels en dessous de 5*5.
ici en fenêtre on voit que la plus petite goutte de pluie fait 1 pixel :
En plein écran, on voit que la plus petite a une définition plus élevée, le perso en référence donne les dimension du pixel "jeu" :
J'ai testé différents paramètres que j'ai trouvés dans la doc, mais rien n'y fait...
Quelqu'un aurait-il une solution à ce genre de problème ?
Ce que je trouve étrange, c'est que visiblement, ton bonhomme a bien été zoomé et pixelisé (ce que tu attends), mais pas ta goutte d'eau.
Comment sont ces deux ressources en mémoire ?
Est ce que tu es passé par la même fonction pour les charger et les afficher ? c'est tous les deux des SDL_Texture ? ou fais tu varier des paramètres ?
Ce sont bien toutes des textures. Je ne passe pas par les même fonctions, l'une est une gestion de mes sprites et l'autre est en charge des particules de la météo, une texture unique affichée à différents ratios avec une rotation.
Les formats sont standards, je passe tous mes chargements de fichier par des fonctions à moi dans laquelle je fais en sorte de tout formater pour être certain de toujours être compatible avec le reste de ma lib. Question de pratique pour ne pas avoir à gérer les différents formats lorsque j'ai besoin d'attaquer une texture ou une surface.
Je pense que le problème vient du fait que mes particules ont une échelle décimale. Mais même les plus grosses ne respectent pas les placements des pixels logiques. Elles présentent des pixels inclinés :
alors que le résultat attendu serait plutôt de ce style :
Là, c'est une impression d'écran du fenêtré par 5.
En relevant des paramètres, je me suis rendu compte que la taille "logique" (via SDL_RenderGetLogicalSize) du render reste inchangée (336*210) en fullscreen, mais la taille d'affichage (SDL_GetRendererOutputSize) correspond à celle de mon écran 1680*1050.
Du coup, je pense que l'application des textures se fait sur la définition d'affichage et non la définition "logique". Les textures appliquées doivent être étirées proportionnellement à l'output/logic, ce qui n'interdit plus l'affichage d'un pixel inférieur en taille au pixel logique.
J'ai essayé avec les SDL_RenderSetScale, SDL_SetIntegerScale pour voir les différents cas de mise à l'échelle mais rien n'y fait.
Je n'ai pas bossé dessus aujourd'hui, mais j'ai eu une idée à tester pour voir si passer par une texture intermédiaire (336*210) via SDL_SetRenderTarget ne pourrait pas résoudre le souci. Une fois finalisée, c'est elle qui serait étirée et appliquée sur le renderer.
J'y ai pensé plus tard, mais tester un SDL_DrawPoint() en fullscreen devrait me permettre d'étayer mes suppositions... ou pas.
Je testerai demain et je te dirai quoi...
Merci.
EDIT (24 h):
Re,
Bon effectivement, passer par une texture basse définition en guise de renderer avant la poser sur le renderer final a fait le boulot.
Par contre, le drawPoint créé bien un pixel logique (le jaune), donc de 5*5 pixels affichés en fullscreen...
Bon... Mystère à noter dans un coin pour la prochaine fois.
Encore une journée de perdue sur un truc à la con alors que ça apparaît évident après un peu de repos... Vendredi, j'ai passé 2 heures à ne pas voir un point-virgule en fin de ligne d'un for()... Faut pas vieillir...
Ouais, c'est vrai que c'est bizarre tout ça. J'ai pas eu le temps d'essayer.
Mais pour les gouttes, on aurait dit que l'une avait été tournée de manière software, et l'autre de manière hardware (avec antialiasing et autres corrections qui vont bien).
Un peu comme si dans un cas tu tournes an mode CPU sans aucun filtre, et puis tu balances à la carte
et l'autre tu balances à la carte et tu lui dis de tourner.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Bonhomme !! | Jeu de plateforme : Prototype.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
Bonhomme !! | Jeu de plateforme : Prototype.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html