TutorielsVous débutez ? C'est ici qu'on commence !
Mon compte
Recherche
Livre d'or
PublicitéVous devez être inscrit pour pouvoir poster des messages
| Page : 1 | |
| Auteur | Message |
|---|---|
| 1 visiteur sur ce sujet (1 anonyme) | |
| Page : 1 | |
themulot
|
# Posté le 26/05/2007 à 01:48:52 |
|
Groupe : Membres |
bonjour , voila je vous explique , je programme en sdl , hors a ce jour il n'y a pas de module permetant de lire les gifs directement , aujourd'hui j'ai fini une petite fonction qui permet d'animer des images de tous les formats supporté par sdl_image en envoyant a ma fonction des images et un temps pour savoir tout les combien de temps elle doit changer d'images , hors si j'arrive a trouver un code qui me permet d'extraire les images d'un gif je pourrait faire une fonction qui permet d'ouvrir un gif en sdl.
donc si quelqu'un a une idée . je sais que gimp le fait , avec on peut ouvrir un gif et voir les differentes images le composant . pour ma petite librairie allez voire sur themulot88.free.fr/others.php . voila merci par avance . et bonne nuit a tous les zéros . debutant en programmation , mais pas en linux |
themulot
|
# Posté le 27/05/2007 à 20:03:40 |
|
Groupe : Membres |
je vois que personne ne reponds , pourquoi , n'hesitez pas si ce n'est pas assez clair . car la je m'inquiete , personne n'a la reponse ?
debutant en programmation , mais pas en linux |
Cyprien_
|
# Posté le 27/05/2007 à 20:44:40 |
Le Monde d'Akhiris![]() Groupe : Membres |
Après quelques recherches acharnées (c'est dur en effet de trouver quoi que ce soit sur la lecture de GIF animés... ), j'ai trouvé quelque chose qui pourrait peut-être (j'insiste sur le "peut-être") t'aider:
C'est quelqu'un qui a, apparamment, codé une fonction permettant de lire des images compressées au format GIF. Même si son code (que je n'ai pas testé d'ailleurs...) ne lit pas les GIFs animés, ils en parlent dans les commentaires, si tu as le courage d'essayer de comprendre
C'est ici. Sinon, si tu es vraiment motivé, tu prends ton courage à 2 mains et tu te renseignes sur le format GIF, avant de prendre un GIF animé basique (genre 3 images), de l'ouvrir avec un éditeur hexadécimal, et de coder ta propre fonction pour lire des GIFs animés, avant de les transformer en SDL_Surface... Bonne chance !
|
themulot
|
# Posté le 28/05/2007 à 00:00:19 |
|
Groupe : Membres |
alors moi ma fonction crée ou recrée des gifs avec des png jpg etc ...
si j'arrive a trouver comment exttraire les images d'un gif je peut vite coder une lib sdl_gif qui ravirais beaucoups de monde . petit HS : j'ai deja crée une mini librairie sdl_collision qui teste pixel par pixel en etant legere est tres performante . si tu veux la tester cyprien : http://themulot88.free.fr/sdl_collision.zip c'est sur mon site . ps: je viens de lire les codes . je prends une claque désolé mais c'est un peu compliqué pour moi . en tout cas merci a toi d'essayer de m'aider .
Édité
le 28/05/2007 à 00:07:14
par themulot
debutant en programmation , mais pas en linux |
Cyprien_
|
# Posté le 28/05/2007 à 11:56:25 |
Le Monde d'Akhiris![]() Groupe : Membres |
Bon, je t'ai trouvé des trucs très intéressants sur le format gif89a:
Tout d'abord, une description complète (ou pas, j'en sais rien :p) des spécifications du format. Ensuite, dans le 1er lien que je t'avais donné regarde surtout dans les documents HTML qu'il a joint en plus de son code, c'est très intéressant. (par contre, faudra que tu fasses des tests, il y a des choses qui se contredisent entre les 2...). Pour finir, voici en anglais les spécifications officielles du format. Je te souhaite bonne chance, si tu arrives à finir ta lib, elle aura beaucoup de succès, puisqu'encore inexistante. EDIT: je viens de regarder ta "lib" de gestion des collision... Pour ça, c'était pas la peine de faire une lib Je pensais au moins que tu avais mis en place le pixel-perfect, parce que là, il faut que tes sprites soient des rectangles pour que ça marche correctement
EDIT²: et pour ta lib d'animation d'images, tu t'es pas mal compliqué la vie. Plutôt que d'utiliser les surcharges à foison et de compliquer le code, en plus de le rendre rigide, tu aurais pu utiliser un tableau de tableaux de char et une variable indiquant le nombre de tableaux de char passés en paramètres.
Édité
le 28/05/2007 à 12:03:48
par Cyprien_
|
themulot
|
# Posté le 28/05/2007 à 12:38:15 |
|
Groupe : Membres |
merci a toi je suis nouveau en programmation car je n'ai commençais il n'y a que 6 mois , maintenant pour la lib de collisions : il y a des spirites qui ne sont pas rectangulaires ???
car j'ai fais ça car c'est plus leger et je ne pensais pas qu'il pouvait y avoir de sdl surfaces non rectangulaires . pour ton deuxieme edit merci c'est une tres bonne idée . merci a toi , je vois que j'ai encore beaucoups a apprendre . debutant en programmation , mais pas en linux |
Cyprien_
|
# Posté le 28/05/2007 à 12:42:43 |
Le Monde d'Akhiris![]() Groupe : Membres |
Pour les sprites, non, ils sont tous rectangulaires, mais je veux dire, si tu prends une image de balle, bien que la SDL_Surface soit rectangulaire, l'image ne l'est pas, il faudrait en tenir compte.
J'édite dès que je peux pour te montrer pourquoi avec une image
EDIT: voilà:
Les cadres noirs n'existent pas en réalité, ils sont juste là pour représenter les SDL_Surface. Dans cet exemple, les 2 balles ne se touchent pas, alors que leurs SDL_Surfaces se chevauchent. Ton programme va détecter une collision alors qu'il n'y en a pas.
Édité
le 28/05/2007 à 13:08:39
par Cyprien_
|
UltimAKnighT
|
# Posté le 28/05/2007 à 15:02:39 |
|
Groupe : Membres |
Citation : Cyprien_
Les cadres noirs n'existent pas en réalité, ils sont juste là pour représenter les SDL_Surface. Dans cet exemple, les 2 balles ne se touchent pas, alors que leurs SDL_Surfaces se chevauchent. Ton programme va détecter une collision alors qu'il n'y en a pas. C'est là que les maths rentrent en actions . Il faut juste calculer la distance entre les deux ronds, à l'aide de leur rayon et de leur centre.
UltimAKnighT |
Cyprien_
|
# Posté le 28/05/2007 à 15:06:11 |
Le Monde d'Akhiris![]() Groupe : Membres |
Oui, mais là j'ai pris un exemple simpliste hein.
Essaie avec ça d'appliquer les maths:
(au fait, c'est hors-sujet tout ça, non ? )
|
UltimAKnighT
|
# Posté le 28/05/2007 à 15:34:35 |
|
Groupe : Membres |
Pas impossible, compliqué certes.
UltimAKnighT |
themulot
|
# Posté le 28/05/2007 à 17:33:14 |
|
Groupe : Membres |
c pour cela que je cherche a detecter les pixels transparent
debutant en programmation , mais pas en linux |
Cyprien_
|
# Posté le 29/05/2007 à 17:25:50 |
Le Monde d'Akhiris![]() Groupe : Membres |
Réussi !!
Après beaucoup de tâtonnements, j'ai enfin réussi coder une fonction qui retourne les images d'un gif (au format GIF89a) et le nombre d'images (j'ai pas tenté de gérer aussi la vitesse indiquer entre chaque gif...), après, à l'utilisateur d'en faire ce qu'il veut .
Voici le code (faites pas gaffe, je sais qu'il doit VRAIMENT pas être propre, il a beaucoup été codé à l'arrache...): Code : C++ #include <SDL/SDL.h>
#include <SDL/SDL_image.h> #include <iostream> #include <fstream> #include <vector> #include <string> SDL_Surface** lireGif(std::string fileName, int* nbImages) { *nbImages = 0; std::vector<SDL_Surface*> gif; char* fichier = NULL; char* cFichier = NULL; int c; int taille=0; std::ifstream file; std::string entete, reste; /*Ouverture du fichier */ file.open(fileName.c_str(), std::ios::in|std::ios::binary); /* Taille du fichier */ file.seekg(0, std::ios_base::end); taille = file.tellg(); file.seekg(0, std::ios_base::beg); fichier = new char[taille]; /* On recopie le fichier */ for(int i=0;i<taille;i++) { fichier[i] = file.get(); } file.close(); fichier[taille] = 0; /* Verification de l'entete */ if(!(fichier[0]=='G' && fichier[1]=='I' && fichier[2]=='F' && fichier[3]=='8' && fichier[4]=='9' && fichier[5]=='a')) { delete[] fichier; return NULL; } cFichier = fichier; /* On recopie l'entete */ while(cFichier[0] != 0x2C) { if(cFichier[0] != 0x0D) entete += cFichier[0]; cFichier++; } remove("temp.gif"); while(cFichier < fichier+taille-1) { reste += cFichier[0]; if(cFichier[0] == 0x00 && (cFichier[1] == 0x3B || cFichier[1] == 0x2C)) { reste += 0x3B; (*nbImages)++; std::ofstream temp; temp.open("temp.txt", std::ios::out|std::ios::trunc|std::ios::binary); for(int i=0;i<entete.size();i++) temp << entete[i]; for(int i=0;i<reste.size();i++) temp << reste[i]; temp.close(); rename("temp.txt", "temp.gif"); remove("temp.txt"); gif.push_back(IMG_Load("temp.gif")); remove("temp.gif"); reste.clear(); } cFichier++; } /* --- FIN LECTURE --- */ delete[] fichier; SDL_Surface** gif_s = (SDL_Surface**)new SDL_Surface*[*nbImages]; for(int i=*nbImages-1;i>=0;i--) { gif_s[i] = gif.back(); gif.pop_back(); } return gif_s; } Comme vous pouvez le constater, j'ai en fait contourné le problème en récupérant tout d'abord l'entête du GIF, puis chacune de ses images. Je mets alors l'entête et une image dans un fichier temporaire, et je laisse le soin à SDL_image de lire le GIF
NB: n'oubliez pas de désallouer les SDL_Surface crées de la manière suivante: Code : C++ for(int i=0;i<nbImages;i++)
SDL_FreeSurface(gif[i]); delete[] gif; Ce code nécessite le linkage avec la SDL_image, ainsi que sa .dll PS: je ne garantis pas que cela marche avec tous les GIF, je n'ai pas fait beaucoup de tests, mais bon...
Édité
le 29/05/2007 à 17:29:29
par Cyprien_
|
themulot
|
# Posté le 29/05/2007 à 17:38:28 |
|
Groupe : Membres |
wahou cyprien , tu es mon dieu , lol je n'orais pas su faire ceci , je voulais juste savoir si c'est pas indiscret , depuis combien de temps tu programme . je vais essayer de l'ameliorer et je la metterais sur mon site si tu veux bien bien .
debutant en programmation , mais pas en linux |
Cyprien_
|
# Posté le 29/05/2007 à 18:43:29 |
Le Monde d'Akhiris![]() Groupe : Membres |
Fais attention, je viens d'essayer avec un autre GIF au hasard et ça ne fonctionnait pas
Je pense savoir d'où vient le problème, mais le régler signifierait se plonger vraiment dans le fichier, donc je verrais ça une autre fois
Sinon, ben je programme depuis que j'ai 10 ans, mais seulement en TI-BASIC sur TI-89 (et je t'assure qu'on peut déjà faire pas mal de trucs: puissance 4, morpion avec IA, mastermind, tétris, générateur de labyrinthes parfaits, ...). J'ai ensuite appris le xHTML et le CSS (même si ce ne sont pas des langages de programmation à proprement parler) il y a un an, puis le PHP de juillet dernier à la rentrée (ça ne m'a pas trop retenu) et j'ai enfin commencé le C en octobre dernier, ainsi que le C++ il y a 2-3 mois. </3615 : mavie>
|
themulot
|
# Posté le 30/05/2007 à 00:35:42 |
|
Groupe : Membres |
et ben tu m'epatte en tout cas merci c'est plus qu'un debut pour moi . je vais me plancher dessus une fois fini mon exo sur le rpg .
debutant en programmation , mais pas en linux |
Retour au forum "Langage C++" ou à la liste des forums
Vous devez être inscrit pour pouvoir poster des messages
Changer de design |
En savoir plus |
Plan du site |
Politique d'accessibilité |
Règles |
RSS tutoriels |
RSS news
Édité par Simple IT SARL :
Nous contacter
| Notre blog | Revue de presse | Publicité
Y'a plus rien à lire, faut remonter maintenant !
Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.
357 Zéros connectés |
8 requêtes |
0.122s (0.0973s)
