Aller au contenu

Problème d'affichage avec SDL


Kaptain

Messages recommandés

Salut, voici un programme en C++ avec la llibrairie SDL, écrit sous Dev C++ 4. Le but est d'afficher un wallapaper, 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). :eeek2: Etant donné que la librairie SDL est incluse, ça complique la tâche, mais 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 :

#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 :D

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...