Probleme SDL et POO

darmoor Messages postés 38 Date d'inscription vendredi 12 septembre 2003 Statut Membre Dernière intervention 2 novembre 2005 - 17 juil. 2005 à 14:38
MrdJack Messages postés 146 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 8 mars 2008 - 24 oct. 2005 à 17:29
voila je suis encore qu'un débutant dans la matière avec la POO et j'apprend a utiliser SDL



j'ai fait un essai en affichant un image et avec unn SDL_rect qui limite l'affichage de limage, juste un partie:

exemple:

SDL_BlitSurface(image, &rect, screen, NULL);



avec un rect assez petit.



donc a partir de ca je voulais faire un truc plus élaboré avec SDL et des classes



et j'ai fait ça et ca n'affiche pas l'image.

Donc est ce que quelqu'un pourait m'expliquer ce qui n va pas ?



Merci



les codes sources:



SDL.cpp:



#include <stdlib.h>

#include <SDL/SDL.h>

#include "perso.h"



SDL_Surface *LoadBMP(const char *filename);



int main(int argc, char *argv[])

{

perso *ryu;

SDL_Surface *screen, *image;

SDL_Event event;

bool done = false;

if(SDL_Init(SDL_INIT_VIDEO) == -1)

{

printf("Can't init SDL: %s\n", SDL_GetError());

exit(1);

}

atexit(SDL_Quit);

screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);

if(screen == NULL)

{

printf("Can't set video mode: %s\n", SDL_GetError());

exit(1);

}

image = LoadBMP("sprite.bmp");

ryu = new perso(image);



if(image == NULL)

{

printf("Can't load image of tux: %s\n", SDL_GetError());

exit(1);

}



ryu->DrawSprite2(screen);

SDL_FreeSurface(image);

SDL_UpdateRect(screen, 0, 0, 0, 0);

while(!done)

{

while(SDL_PollEvent(&event))

{

switch(event.type)

{

case SDL_QUIT:

done = true;

break;

}

}

}

delete ryu;

return 0;



}



SDL_Surface *LoadBMP(const char *filename)

{

SDL_Surface *temp, *image1;

temp = SDL_LoadBMP(filename);

image1 = SDL_DisplayFormat(temp);

SDL_FreeSurface(temp);

return image1;

}





perso.h:



#ifndef __perso_h__

#define __perso_h__



#include <SDL/SDL.h>

#include "const.h"



class perso

{

public:

perso(SDL_Surface *planche_sprite);

void SetImage(SDL_Surface *planche_sprite);

void DrawSprite1(SDL_Surface *target);

void DrawSprite2(SDL_Surface *target);

void DrawSprite3(SDL_Surface *target);

void PosRect(SDL_Rect rect, int x, int y);

protected:

SDL_Surface *image;

SDL_Rect rectH1, rectH2, rectH3, rectB1, rectB2, rectB3,

rectD1, rectD2, rectD3, rectG1, rectG2, rectG3;



};



#endif





perso.cpp :



#include "perso.h"



perso::perso(SDL_Surface *planche_sprite)

{

SetImage(planche_sprite);

PosRect(rectH1, largeur_sprite+1, 0);

PosRect(rectH2, 0, 0);

PosRect(rectH3, largeur_sprite*2+1, 0);

}



void perso::SetImage(SDL_Surface *planche_sprite)

{

image =
planche_sprite;


}



void perso::DrawSprite1(SDL_Surface *target)

{

SDL_BlitSurface(image,
&rectH1, target,
NULL);


}



void perso::DrawSprite2(SDL_Surface *target)

{

SDL_BlitSurface(image,
&rectH2, target,
NULL);


}



void perso::DrawSprite3(SDL_Surface *target)

{

SDL_BlitSurface(image,
&rectH3, target,
NULL);


}





void perso::PosRect(SDL_Rect rect, int x, int y)

{

rect.x = x;

rect.y = y;

rect.w = largeur_sprite;

rect.h = hauteur_sprite;

}



et pour finir

const.h:



#ifndef __def_h__

#define __def_h__



const int largeur_sprite = 24;

const int hauteur_sprite = 32;



#endif



voila :) Merci d'avance:)

2 réponses

MrdJack Messages postés 146 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 8 mars 2008 2
24 oct. 2005 à 17:28
salut,

ton probleme vient surement du fait que dans main() tu réactualise mal le rectangle :

SDL_UpdateRect(screen, 0, 0, 0, 0);

-->SDL_UpdateRect(screen, x, y, x+width, y+height);

bref en réactualisant seulement le pixel en haut a gauche, pas étonant que le reste est noir !!!



voila, je pense que ton probleme est résolu !


remarque :

si tu comptes afficher plusieurs rectangles en meme temps, tu peux les actualiser tous d'un coup avec

SDL_UpdateRects(screen, int num_Rect_A_Actualiser, SDL_RECT *Rectangles);
ça permet de réactualiser seulement les zones où tu as fait des modifs donc gain de perf!





@++
0
MrdJack Messages postés 146 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 8 mars 2008 2
24 oct. 2005 à 17:29
oups c'est SDL_UpdateRect(screen, x, y, w, h);

désolé !!!



@++
0