#1 Le 17/08/2015, à 21:41
- MasterYo
[RESOLU] Problème affichage image (SDL)
Bonjour a tous !!
Tout d'abord, merci de me lire
Le problème est le suivant, lorsque je compile mon code, aucune erreur ne s'affiche, rien du tout, et pourtant mon image "zozor.bmp" ne s'affiche pas. Ma fenêtre est blanche
Voici mon code :
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
void pause();
int main(int argc, char *argv[])
{
SDL_WM_SetCaption("Interactions !!", NULL);
SDL_Surface *screen = NULL, *zozor = NULL;
SDL_Rect zozoPos;
if (SDL_Init(SDL_INIT_VIDEO) == -1)
{
printf("Erreur d'initialisation de l'application : \"%s\"", SDL_GetError());
return EXIT_FAILURE;
}
screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
if (screen == NULL)
{
printf("Erreur de chargement de l'écran : \"%s\"", SDL_GetError());
return EXIT_FAILURE;
}
SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 255, 255, 255));
zozor = SDL_LoadBMP("zozor.bmp");
if(zozor == NULL)
return EXIT_FAILURE;
SDL_SetColorKey(zozor, SDL_SRCCOLORKEY, SDL_MapRGB(zozor->format, 0, 0, 255));
zozoPos.x = (screen->w / 2) - (zozor->w / 2);
zozoPos.y = (screen->h / 2) - (zozor->h / 2);
SDL_BlitSurface(screen, NULL, zozor, &zozoPos);
SDL_Flip(screen);
pause();
SDL_FreeSurface(zozor);
SDL_Quit();
return EXIT_SUCCESS;
}
void pause()
{
SDL_Event event;
while(1)
{
SDL_WaitEvent(&event);
switch (event.type)
{
default:
break;
case SDL_KEYDOWN :
switch (event.key.keysym.sym)
{
default:
break;
case SDLK_RETURN:
return;
case SDLK_ESCAPE:
return;
}
break;
case SDL_QUIT:
return;
}
}
}
Merci d'avance pour vos réponses
Dernière modification par MasterYo (Le 21/08/2015, à 12:10)
Hors ligne
#2 Le 20/08/2015, à 13:11
- mrlem
Re : [RESOLU] Problème affichage image (SDL)
Salut,
Ça fait bien longtemps que je n'y ai pas touché, à SDL, mais si j'en crois http://wiki.libsdl.org/SDL_BlitSurface les arguments de SDL_BlitSurface sont dans l'ordre :
- src the SDL_Surface structure to be copied from
- srcrect the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface
- dst the SDL_Surface structure that is the blit target
- dstrect the SDL_Rect structure representing the rectangle that is copied into
Et tu fais :
SDL_BlitSurface(screen, NULL, zozor, &zozoPos);
Autrement dit, tu inverses screen et zozor, puisque la source est sensée être ton image et la destination l'écran (et pas l'inverse). Du coup sauf erreur tu copies ton écran blanc sur ton image, actuellement
Hors ligne
#3 Le 20/08/2015, à 14:17
- Compte anonymisé
Re : [RESOLU] Problème affichage image (SDL)
Bonjour,
Je crois bien que le compilateur râle si les arguments ne sont pas écrits dans l'ordre.
Mais ce qui m'étonne, @MasterYo, c'est que tu ne fasses pas d'applySurface()
Dernière modification par Compte anonymisé (Le 20/08/2015, à 14:24)
#4 Le 20/08/2015, à 14:21
- mrlem
Re : [RESOLU] Problème affichage image (SDL)
Je crois bien que le compilateur râle si les arguments ne sont pas écrits dans l'ordre.
Comment le compilateur pourrait-il savoir qu'il y a quelque-chose de mauvais, puisque source comme destination sont du même type de son point de vue ? (i.e. screen et zozor sont tous deux des SDL_Surface *)
Hors ligne
#5 Le 20/08/2015, à 14:39
- Compte anonymisé
Re : [RESOLU] Problème affichage image (SDL)
Mais ce qui m'étonne, @MasterYo, c'est que tu ne fasses pas d'applySurface()
Sinon, sur un exemple :
J'inclus ceci
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include "SDL.h"
#include "SDL_image.h"
#include <SDL/SDL_ttf.h>
using namespace std;
Je charge une image (deux fonctions possibles)
//Chargement d'une image:
SDL_Surface *
loadImage(string filename)
{
return SDL_DisplayFormat(IMG_Load( filename.c_str()));
}
SDL_Surface *
loadImageWithColorKey(string filename, int r, int g, int b)
{
SDL_Surface* optimizedImage;
optimizedImage = SDL_DisplayFormat(IMG_Load( filename.c_str()));
SDL_SetColorKey(optimizedImage, SDL_SRCCOLORKEY,
SDL_MapRGB(optimizedImage->format, r, g, b));
return optimizedImage;
}
J'applySurface
//applySurface
void
applySurface(int x, int y, SDL_Surface* source,
SDL_Surface* destination, SDL_Rect* clip)
{
SDL_Rect offset;
offset.x = x;
offset.y = y;
SDL_BlitSurface( source, clip, destination, &offset );
}
Pis j'affiche
//Afficher balle
void
showBall(ball b, SDL_Surface *s)
{
SDL_Rect r;
r.x=(b.x-TAILLE/2)+3;
r.y=(b.y-TAILLE/2)+3;
r.w=TAILLE;
r.h=TAILLE;
}
#6 Le 20/08/2015, à 14:56
- mrlem
Re : [RESOLU] Problème affichage image (SDL)
En tous cas je viens d'essayer, en remplaçant :
SDL_BlitSurface(screen, NULL, zozor, &zozoPos);
par
SDL_BlitSurface(zozor, NULL, screen, &zozoPos);
et en compilant avec :
gcc plop.c -o plop `sdl-config --cflags --libs`
ça marche nickel.
Hors ligne