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 :

Conversion de palettes couleur


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 Conversion de palettes couleur
    Bonsoir, je fais appel à vous car malgré de nombreuses recherches, je n'arrive pas à résoudre mon problème : Je suis entrain de coder une fonction GIF_Load() qui doit avoir le même rôle que IMG_Load() de SDL mis à part le fait qu'elle doit charger des GIF animés.
    Pour cela, j'utilise un tableau de pointeurs sur SDL_Surface (Chacune représentant une image du GIF). Le souci, c'est que la palette de couleurs utilisée est en 8 bits, alors que les données stockées dans une SDL_Surface sont en RVB (Voire en RVBA il me semble). D'après ce que j'ai compris à travers mes recherches, le codage en 8 bits correspond à 3 bits pour le rouge, 3 bits pour le vert, et 2 bits pour le bleu, mais je n'arrive pas à faire la correspondance avec le RVB. Exemple : La couleur de l'arrière-plan de mon GIF vaut F7 en hexadécimal, ce qui donne 11110111 en binaire. Si je sépare par paquets de 3, 3 et 2 bits, j'obtiens :

    111 pour le rouge
    101 pour le vert
    11 pour le bleu

    Mais comment passer de 3 à 8 bits ? J'ai essayé en ajoutant des 0 de sorte à obtenir :

    00000111 pour le rouge
    00000101 pour le vert
    00000011 pour le bleu

    Mais la couleur obtenue est totalement différente de celle de l'arrière-plan, qui vaut en RVB (D'après Photoshop) :

    00001110 pour le rouge
    01000101 pour le vert
    01110010 pour le bleu

    J'ai besoin d'un coup de pouce please

    Edit : Je me suis trompé : La couleur de l'arrière-plan n'est pas F7 mais 00 (Offset 0Bh d'après ce site : https://www.gladir.com/LEXIQUE/FICHIERS/Gif.htm)

  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
    euh non tout faux , la palette de couleur représente seulement une couleur qui se trouve dans la palette , par exemple 0 = blanc , 1 = noir etc.
    La couleur de la palette se trouve dans la structure palette tout simplement (qui est en RGB 24 bits ) .
    https://www.libsdl.org/release/SDL-1...xelformat.html

    La palette de couleur permet d'avoir les même effet que les jeux 8/16 bits si on la manipule bien (de plus son coût est faible vu que modifier la palette est très rapide) en 8bits il y'a 256 couleurs.
    La SDL ne le gere pas mais a l'époque il exister des palette de 4 bits et 2 bits (16 ou 4 couleurs donc).

    Sinon si je peux me permettre c'est une mauvaise idée d'utiliser le GIF pour l'animation ,je conseille un png (avec seulement un découpage propre en 32x32 par exemple) , enfin moi je dis ça je dis rien mais c'est ce que faisait les pro a l'époque en tout cas

  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 ta réponse.

    la palette de couleur représente seulement une couleur qui se trouve dans la palette , par exemple 0 = blanc , 1 = noir etc.
    Si je comprends bien, on a une valeur précise par couleur.

    qui est en RGB 24 bits
    Euh là je comprends pas : On est en RVB donc ?

    Sinon si je peux me permettre c'est une mauvaise idée d'utiliser le GIF pour l'animation
    Merci pour le conseil.

  4. #4
    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
    Pour faire plus clair la la valeur représente une couleur dans la palette.

    par exemple ton image est 0,1,0,3

    Dans ta palette tu aura par exemple :
    0 : R :255 G : 0 B:255
    1 : R :123 G :20 B:222
    2 : R :255 G :55 B:444
    3 : R :45 G :222 B:12

    Les couleurs dans la palette sont en RGB 24 bits (encore heureux sinon je vois mal comment tu met des couleurs vec 0 , des 2 ou de 3 :p ).

  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
    D'accooooooord, je comprends mieux : La palette fait l'association entre chaque couleur codée en RVB et sa valeur en 8 bits, c'est bien ça ?
    Dans ce cas, qu'est-ce que je suis censé écrire dans le champ pixels lors de la lecture de mon fichier ? J'écris les valeurs telles qu'elles sont dans le fichier ou je convertis en RVB ?

  6. #6
    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
    Pas sur de comprendre ce que tu veux , une palette 8 bits et juste une façon de représenter une image.
    Ou alors tu veux connaître un algo qui convertit du RGB 24 bits en palettes 8 bits (ou l'inverse) ?

  7. #7
    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
    En gros, je veux refaire la fonction IMG_Load() mais à partir d'un GIF (Ou PNG) animé et tout stocker dans un tableau de pointeurs sur SDL_Surface.

  8. #8
    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
    Ben je vois pas ce qui t'en empêche de le faire , sur le GIF la SDL sait le lire (après je ne pense pas qu'elle lit toute les anim nativement).

    Pour la lecture du GIf je me suis jamais intéressé a ce format , mais je pense pas que le gif soit complexe a lire , il faudra juste le mettre sur un SDL_Surface (avec palette dans ton cas , même si tu peux très bien le mettre en RGB 24bits si tu veux pas te casser la tete.
    Si c'est pour du PNG il suffit juste de charger ta feuille de tileset avec tes différent anim une seule fois et d'afficher le bon 'rectangle' (SDL_Blit permet d'afficher qu'une partie de l'image avec un SDL_Rect en paramètre).

  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
    Ben je vois pas ce qui t'en empêche de le faire , sur le GIF la SDL sait le lire (après je ne pense pas qu'elle lit toute les anim nativement)
    Ben IMG_Load() ne traite qu'une seule image puisqu'elle écrit dans une seule SDL_Surface donc je ne peux pas l'utiliser pour une animation, je n'ai pas d'autre choix que de coder moi-même la fonction.

    Il faudra juste le mettre sur un SDL_Surface
    C'est ce que je cherche à faire, en écrivant directement dans le champ pixels, mais mon fichier est codé en 8 bits, et je ne sais pas si je dois copier les données telles quelles ou les convertir en 24 bits.

  10. #10
    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
    Citation Envoyé par KevinduC Voir le message
    Ben IMG_Load() ne traite qu'une seule image puisqu'elle écrit dans une seule SDL_Surface donc je ne peux pas l'utiliser pour une animation, je n'ai pas d'autre choix que de coder moi-même la fonction
    Faux , évite les affirmations et dis plutôt je ne sais pas faire
    Relis je que j'ai dis , SDLblit peut afficher que un bout de ton image et donc gerer différente animation.
    Par exemple : Fantome.png
    Donne ceci :



    Voila donc c'est juste un seul PNG et avec tu gère toutes les anim de ton perso/monstre boss ou autre

    C'est ce que je cherche à faire, en écrivant directement dans le champ pixels, mais mon fichier est codé en 8 bits, et je ne sais pas si je dois copier les données telles quelles ou les convertir en 24 bits.
    Vu que je n'ai pas l'impression que tu maitrise totalement ce concept tu devrait faire quelque test avant

  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
    Faux , évite les affirmations et dis plutôt je ne sais pas faire
    Ce n'est pas une affirmation mais une déduction (Une seule SDL_Surface = Une seule image), je dirais plutôt : A moitié faux, car si j'ai bien compris ta méthode (Très astucieuse je le reconnais), on stocke toutes les images sur une seule surface et on n'affiche qu'une partie de cette surface grâce à SDL_Blit(), mais on ne part pas d'une animation, mais c'est une bonne idée en tout cas
    Non je ne sais pas faire, et c'est là tout l'intérêt de cette discussion : J'apprends, je me renseigne, je me documente, et je prends plaisir à programmer

    Vu que je n'ai pas l'impression que tu maitrise totalement ce concept tu devrait faire quelque test avant
    J'en ai fait avant de lancer cette discussion, et j'ai constaté que les données étaient stockées en RVB dans le champ pixels, ce qui me semble finalement logique puisque j'ai utilisé un fichier .bmp 24 bits pour faire ces tests.

  12. #12
    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
    Ce n'est pas ma méthode , enfaîte c'est une méthode utilisé par la plupart des jeux (de la Nes jusqu’à maintenant).

    C'est une animation dans le sens ou c'est une suite image qui defile et ton fichier GIF c'est quoi ? une suite d'image qui defile x)
    Je suis pas expert du GIF mais le format met surement toute les images avec une indication pour la tempo.
    Juste que quand tu le lance via un navigateur ben oui il te montre pas toute les images d'un coup, il va les défiler.
    Bon par contre sur SDL évite comme je le vois pour chaque débutant de faire un SDL_Sleep() entre chaque anim
    Il suffit juste de bloquer le rafraîchissement (je sais pas moi au hasard a 60 FPS) et d'afficher frame par frame la nouvelle bonne image

  13. #13
    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
    Si je suis cette méthode, il faut que je crée un fichier contenant l'ensemble des images positionnées les unes après les autres comme dans l'exemple que tu m'as montré, c'est tout à fait faisable avec Photoshop, mais si j'ai 100 images, ça risque de faire un peu long ... Est-ce que tu connaitrais un logiciel capable de réaliser cela ?

  14. #14
    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
    Non je ne connais pas de logiciel qui range tout seul.
    Après tout dépend d ce que tu récupère comme sprite , la seule fois ou j'avais fait un tableau de SDL_Surface était quand j'ai récupérer des sprites venant de Mugen (plein de fichier pcx a peu plus de 400 des fois x) ).

    Mais dans tout les cas je ne vois pas vraiment l’intérêt du gif (je veux dire j'ai l'impression que tu crois que on peut afficher un gif animé avec la SDL) , on faite on ne peut pas vraiment vu que la SDL est assez bas niveau est que dans tout les cas c'est toi qui devra coder l'animation par rapport au frame rate.

    Sinon pour les conseils , vu que tu veux faire un jeuxvidéo voici un truc dans l'ordre que tu pourrait faire:
    -savoir gerer un sprite (charger/afficher une image)
    -savoir gerer les fps (frame rate)
    -savoir gerer les event (clavier/souris/autre)
    -savoir gerer l'animation
    -savoir gerer un background (tilemap)
    -savoir gerer les colissions
    -savoir jouer un son/une musique

    Dans ma liste quand je parle de savoir , c'est aussi implicitement dire : faire un ensemble de fonction modulaire qui gère tout cela.
    Tout ces blocs doivent être indépendant les un des autres (donc les évent doivent pouvoir être manipulé sans avoir un code d’affichage au milieu etc etc).
    Quand tu saura faire tout ça , tu pourra commencer a coder ton Jeux Vidéo (pour la raison qu'on conseille pas souvent le C pour faire du jeux vidéo vu que pour ce que je t'ai dit tu en as pour plusieurs mois avant de commencer ton jeu a proprement parler ).

  15. #15
    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 voulais faire un GIF (Je parle à l'imparfait car je vais renoncer à cette méthode et plutôt utiliser celle que tu m'as suggérée) et le décomposer en tableau de SDL_Surface, et ainsi afficher une à une les images de l'animation.

    Je pense maîtriser certaines choses :

    - Charger une image avec SDL_LoadBMP() ou IMG_Load(), la "blitter" avec SDL_BlitSurface(), définir un SDL_Rect, ne pas oublier de libérer l'espace mémoire alloué avec SDL_FreeSurface()

    - J'utilise des fonctions comme SDL_GetTicks() et SDL_Delay() pour fixer la durée d'un tour de boucle

    - Généralement, je déclare un SDL_Event, j'utilise SDL_PollEvent() et je teste ensuite le paramètre type pour savoir s'il s'agit d'une fermeture de la fenêtre (SDL_QUIT), un événement clavier (SDL_KEYDOWN par exemple), un événement souris (SDL_MOUSEBUTTONDOWN en l'occurrence), je teste également des sous-paramètres pour connaître la touche du clavier par exemple

    - Il existe différentes manières d'animer, la plus classique consistant à afficher les images une à une, on peut également jouer sur la position d'un objet dans la fenêtre pour déplacer ce dernier. Mais je travaille peu avec SDL pour cela, j'utilise OpenGL, principalement pour de la 3D

    - Généralement, je colore l'arrière-plan au moyen de glClearColor(), afin d'avoir quelque chose de plus esthétique qu'un fond noir ^^ Concernant SDL, SDL_FillRect() fait très bien l'affaire

    - Ça tombe bien que tu en parles car j'ai codé récemment une fonction qui gère les collisions dans un projet en 3D, celle-ci utilise un masque : Une image au format BMP qui comporte des zones en blanc et en noir, la fonction calcule à partir de la position de la caméra la position équivalente sur l'image et ainsi si l'on est en zone noire ou blanche, donc si la caméra est autorisée ou non à s'y rendre. J'utilise la même méthode pour gérer la gravité. Contrairement aux GIF, je n'ai aucune difficulté à lire les BMP

    - J'utilise Fmod pour jouer sons et musiques (Objets système, pointeurs sur FMOD_Sound, canaux ...)

    J'utilise bien sûr de nombreuses fonctions pour cela, sinon je n'ose pas imaginer la taille du code ^^ J'utilise également des structures pour regrouper mes données (Objets, polygones, vertices ...).

    Je n'aurais pas lancé cette discussion si je ne maîtrisais pas un minimum les bases, cela fait des années que je programme en C, j'ai codé divers simulateurs (Orages, éclipses, univers), j'utilise Blender pour créer des décors 3D et les importer dans mes projets (Fichiers .obj et .mtl), et mon projet actuel nécessite de jouer des animations créées avec un logiciel (Payant ou non).

    Merci en tout cas pour ton aide.

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/01/2010, 10h57
  2. GNUPLOT : problème palette couleur de pm3d
    Par djocin dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 26/10/2009, 10h29
  3. Réponses: 2
    Dernier message: 25/04/2008, 19h53
  4. [VBA-E]palette couleurs RGB
    Par potili2 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 20/03/2007, 15h29

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