Ka Invité
| Sujet: Problème d'affichage avec SDL Jeu 16 Mar à 9:33 | |
| Salut, voici un programme en C++ avec la llibrairie SDL, écrit sous Dev C++ 4. Le but est d'afficher un wallpaper, et par-dessus, un monstre qui bouge horizontalement. Et ensuite, j'incluerai une arme fixe, que l'on contrôle, et quand le monstre est en face, on tire, et on gagne. Mais le problème, c'est que bien que le code se compile sans erreurs, je n'ai pas d'affichage lorsque j'exécute le code (écran noir dans la fenêtre du programme). Je vais vous expliquer pourquoi je ne trouve pas la source du problème : - la ligne "Further object files or linker options" dans Project Options est bien remplie par "-lmingw32 -lSDLmain -lSDL". - le fichier SDL.dll est inclus dans le dossier de l'éxecutable. - j'exécute le programme de façon manuelle, en lançant le fichier exécutable, et non en exécutant à partir du compilateur, ce qui ne marche pas sous SDL. - mes fichiers "wallpaper.bmp" et "monstre_1.bmp" sont bien présent dans le dossier de l'exécutable, et en 24 bits de profondeur d'image (au début, j'avais mis un affichage 32 bits dans le programme, et j'ai mis 24 en pensant que le problème venait de là). Voici le code : - Code:
-
#include <sdl/sdl.h> #include <iostream.h> #pragma comment(lib,"sdl.lib") #pragma comment(lib,"sdlmain.lib")
char KeyButton [400]; char MouButton [3] = {0,0,0}; SDL_Surface* Screen; SDL_Surface* Wallpaper; SDL_Surface* Monstre;
SDL_Rect CreateRect (int x , int y , int w , int h) //création d'un rectangle par une fonction (plus rapide) { SDL_Rect a; a.x = x; a.y = y; a.w = w; a.h = h; return a; }
SDL_Surface* CreateSurface (char* Fichier, int Abscisse, int Ordonnee, int Vram) //fonction d'affichage d'images en VRAM ou RAM { SDL_Surface* SurfRam = SDL_LoadBMP (Fichier); SDL_Surface* SurfVram = NULL; if (Vram) SurfVram = SDL_CreateRGBSurface (SDL_HWSURFACE, SurfRam -> w, SurfRam -> h, 24, 0, 0, 0, 0); if (SurfVram == NULL) Vram = 0; if (!Vram) SurfVram = SDL_CreateRGBSurface (SDL_HWSURFACE, SurfRam -> w, SurfRam -> h, 24, 0, 0, 0, 0); SDL_Rect Position = CreateRect (Abscisse, Ordonnee, 0, 0); SDL_BlitSurface (SurfRam, NULL, SurfVram, &Position); SDL_FreeSurface (SurfRam); return SurfVram; }
void MajEvenement () //fonction de MAJ d'événements { SDL_Event evenement; while (SDL_PollEvent (&evenement)) { switch (evenement.type) { case SDL_KEYDOWN : KeyButton [evenement.key.keysym.sym]=1; break; case SDL_KEYUP : KeyButton [evenement.key.keysym.sym]=0; break; case SDL_MOUSEBUTTONDOWN : MouButton [evenement.button.button]=1; break; case SDL_MOUSEBUTTONUP : MouButton [evenement.button.button]=0; break; } } }
int SensDeplacement (int Position, int PositionMin, int PositionMax) /*détermine à quel moment il faut aller de gauche à droite ou de droite à gauche : quand on est près d'un bord de l'écran, on change le signe pour changer le sens de déplacement*/ { int SensDeplacement; if (Position<PositionMin) SensDeplacement = 1; if (Position>PositionMax) SensDeplacement = -1; return SensDeplacement; }
int main(int argc,char** argv) { int AbscisseMonstre = 0; int SensDeplacementMonstre = 0; SDL_Init (SDL_INIT_VIDEO); SDL_ShowCursor (0); Screen = SDL_SetVideoMode (1280,960,24,SDL_HWSURFACE|SDL_DOUBLEBUF); Wallpaper = CreateSurface ("wallpaper.bmp", 0, 0, 1); //affichage du wallpaper while (1) { MajEvenement (); if (KeyButton [SDLK_RETURN]) //sortie de la boucle si touche Entrée pressée break; SensDeplacementMonstre = SensDeplacement (AbscisseMonstre, 12, 756); /*définition du sens avec les valeurs (les bords) dans lesquelles on change de sens*/ AbscisseMonstre = AbscisseMonstre + (2*SensDeplacementMonstre); //vitesse de déplacement influencée par le sens: ici : 2 pixels Monstre = CreateSurface ("monstre_1.bmp", AbscisseMonstre, 64, 1); //affichage en VRAM avec l'abscisse et l'ordonnée SDL_Flip (Screen); } return 0; }
Merci de votre aide ! Et merci FVIRTMAN pour ce tuto génial ! [/code] |
|
KaptN
Nombre de messages : 3 Date d'inscription : 16/03/2006
| Sujet: Re: Problème d'affichage avec SDL Jeu 16 Mar à 9:34 | |
| Oups, j'avais oublié de m'indentifier. | |
|
le_duche
Nombre de messages : 60 Age : 39 Localisation : Bruxelles Date d'inscription : 07/12/2005
| Sujet: Re: Problème d'affichage avec SDL Jeu 16 Mar à 11:17 | |
| Evidemment ! Tu ne blit pas Monstre sur screen...
Mais tu fais une autre affreuse erreur (qui ne pose pas de problème d'execution mais ca va lagger à mort !
Charge ton fichier Monstre en DEHORS de ta boucle, sinon il doit chaque fois ouvrir, charger toutes les données,... | |
|
FVIRTMAN Admin
Nombre de messages : 78 Date d'inscription : 11/11/2005
| Sujet: Re: Problème d'affichage avec SDL Mer 22 Mar à 4:09 | |
| ah oui, ne jamais faire de load dans la boucle principale... | |
|
KaptN
Nombre de messages : 3 Date d'inscription : 16/03/2006
| Sujet: Re: Problème d'affichage avec SDL Mer 22 Mar à 14:04 | |
| Merci pour vos réponses, mais je ne comprend ce que tu veux dire, le_duche... Avec ma fonction CreateSurface, je blitte sur screen, et dans ma boucle du main, je fais Flip_screen... Quant au chargement de l'image Monstre dans la boucle, je ne vois pas comment faire autrement, car le but est de faire se déplacer le monstre, donc augmenter ou diminuer l'abscisse de l'image, et de l'afficher dans sa nouvelle abscisse (d'ailleurs je pense qu'il devrait y avoir des trainées, car l'image est remise par dessus l'ancienne, comme dans le tuto avec l'image avec la fusée). | |
|
countag
Nombre de messages : 57 Date d'inscription : 10/02/2006
| Sujet: Re: Problème d'affichage avec SDL Mer 22 Mar à 23:30 | |
| il y aura une traine si tu ne vide pas ton ecran ( SDL_FillRect() ) car tu dois effacer ton ecran et afficher la frame suivant sinon oui car l ecran carte en memoire l affichage actuel donc si tu bouge ton monstre il y aura une trainer pour cela tu fais :
SDL_FillRect(SDL_GetVideoSurface(),NULL,0); | |
|
le_duche
Nombre de messages : 60 Age : 39 Localisation : Bruxelles Date d'inscription : 07/12/2005
| Sujet: Re: Problème d'affichage avec SDL Jeu 23 Mar à 15:16 | |
| Je corrigerai ton code demain dans la journée. | |
|
KaptN
Nombre de messages : 3 Date d'inscription : 16/03/2006
| Sujet: Re: Problème d'affichage avec SDL Ven 24 Mar à 13:15 | |
| - le_duche a écrit:
- Je corrigerai ton code demain dans la journée.
Merci beaucoup | |
|
Contenu sponsorisé
| Sujet: Re: Problème d'affichage avec SDL | |
| |
|