• Advertisement
Sign in to follow this  

[SDL/c++] Problem with sprite animation

This topic is 4366 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi to all! (sorry for my english...) I would like to make my sprite moving with frames... my code compile without errors and it works great... but when i try to move my sprite i can see that it colors all the background in black... here is an example: http://lnx.mangaitalia.net/sprite.gif All the black areas are left by sprite when i move it... I don't leave the black colour only when i move it on the green rect... What i can do in order to solve this problem...? I would like my sprite to leave no black colour when he moves... I know that the img of my sprite has a black background... but it is not normal that it leaves black color everywhere when it moves... this is the code:
class sprite
{
	//cordinate dell'img (x,y)
	int x, y; 
	//velocità di spostamento dell'animazione
	int s_speed;
	//indice del frame corrente
	int cur_frame;
	//flag che indica se ci stiamo muovendo
	bool moving;
	//ultimo tempo di aggiornamento del frame
	long update_time;
	//idealmente uno sprite è un insieme di frame 
	vector<frame *> frames;
public:
	//costruttore
	sprite(vector <string> files, int init_x=0, int init_y=0, int speed=2);	
	//distruttore
	~sprite();

	//function di spostamento frame
	void mov_x(int mov=1); 
	void mov_y(int mov=1); 


	//function che ritornano le cordinate posizionali del frame
	int get_x() { return x; };
	int get_y() { return y; };
	
	//function che ritornano le dimensioni di un frame
	int get_w(int ind=0) { return frames[ind]->get_w();}
	int get_h(int ind=0) { return frames[ind]->get_h();}

	//function principale, che gestisce il disegno e l'animazione dello sprite
	void draw_sprite();
	//function che ridisegna il background modificato dallo sprite
	void draw_bg();

};

/*
 PLEASE NOTE: the program will require SDL.dll which is located in
              dev-c++'s dll directory. You have to copy it to you
			  program's home directory or the path.
 */


//costruttore che si occupa di inizializzare tutti i dati necessari
sprite::sprite(vector <string> files,  int init_x, int init_y, int speed)
{
	//contatori
	int i,num_files=files.size();

	//puntatore temporaneo
	frame * temp_frame;
	
	//alloco tutti i frame necessari
	for(i=0;i<num_files;i++)
	{
		temp_frame= new frame (files,110);  		
		frames.push_back(temp_frame);
	}
	
	//inizializziamo le cordinate dello sprite	
	x=init_x;
	y=init_y;

	//settiamo la velocità dello sprite
	s_speed=speed;

	//il primo frame ha indice 0
	cur_frame=0;

	//il tempo iniziale è 0 
	update_time=0;

	//inizialmente non ci muoviamo
	moving=false;
}

//function che si occupa di gestire il disegno e l'animazione dello sprite
void sprite::draw_sprite()
{
	//se è passato il tempo necessario passiamo al prossimo frame
	if(update_time+(frames[cur_frame]->get_pause())<SDL_GetTicks())
    	{
		cur_frame++;

		//se siamo all'ultimo frame torniamo a 0
		if(cur_frame==(frames.size())) 
			cur_frame=0;

		//aggiorniamo il tempo dell'ultima modifica 
	      	update_time = SDL_GetTicks();
	}

	//indichiamo le cordinate del tank
	SDL_Rect dest_t;
	dest_t.x = x; 
	dest_t.y = y;
	dest_t.w = frames[cur_frame]->get_w(); 
	dest_t.h = frames[cur_frame]->get_h(); 
	
	//disegnamo il tank su screen
	if(moving)
		SDL_BlitSurface(frames[cur_frame]->get_surface(), NULL, screen,&dest_t);
	else
	{
		SDL_BlitSurface(frames[0]->get_surface(), NULL, screen,&dest_t);
		cur_frame=0;
	}

	//consideriamo l'animazione finita	
	moving=false;

}

//function che ridisegna il background modificato dallo sprite
void sprite::draw_bg()
{
	//aggiorniamo il rettangolo che circonda il tank
	SDL_Rect rect_bg;
	rect_bg.x = 0; 
	rect_bg.y = 400;
	rect_bg.w = frames[cur_frame]->get_w()+(s_speed*2);
	rect_bg.h = frames[cur_frame]->get_h()+(s_speed*2);

	//copiamo la parte di bg necessaria su screen
	SDL_BlitSurface(bg, NULL, screen, &rect_bg);
}

...
...

SDL_Surface *grass;
    int x,y,colorkey;
	SDL_Rect rc_prato, rcGrass;
    // si inizializza il sistema video  
	if( SDL_Init(SDL_INIT_VIDEO) == -1 )
	{
		// SDL_GetError() ritorna una descrizione dell'errore
		cout << "Errore init SDL: " << SDL_GetError() << endl;
	        return 1;
	}

	// all'uscita del programma esegui SDL_Quit per risistemare le cose
	atexit(SDL_Quit);

	//dichiariamo  un int a 32 bit per i flag da assegnare a screen
	Uint32 flags;

        flags = SDL_HWSURFACE|SDL_DOUBLEBUF;

	// per rendere disegnabile la Superficie bisogna utilizzare SDL_SetVideoMode
	if(!( screen = SDL_SetVideoMode(DIM_H, DIM_V, 0,flags) ))
	{
		  cout << "Problemi con il settaggio dello schermo: " << SDL_GetError() << endl;
		  return 1;
	}

	//carichiamo l'immagine di sfondo
	bg=SDL_LoadBMP("prato.bmp");
    grass=SDL_LoadBMP("grass.bmp");
 
    
	 for (x = 0; x < SCREEN_WIDTH; x++) {
			for (y = 0; y < SCREEN_HEIGHT; y++) {
				rcGrass.x = x * 32;
				rcGrass.y = y * 32;
				SDL_BlitSurface(grass, NULL, screen, &rcGrass);
			}
		}        
	
	
	
	//il vector che conterrà le img dello sprite
	vector<string> files;
	
	//carichiamo le stringhe nel vector
	files.push_back("tom1.bmp");
	files.push_back("tom2.bmp");
    files.push_back("tom3.bmp");
    files.push_back("tom4.bmp");
    
	colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
	SDL_SetColorKey(bg, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);   
	//istanziamo gli sprite
	sprite tank(files);

    rc_prato.x=0;
    rc_prato.y=400;

...
...

	tank.draw_bg();
	  //tank2.draw_bg();
		//tank3.draw_bg();
  //disegnamo lo sfondo su screen
	    SDL_BlitSurface(bg, NULL, screen, &rc_prato);
		//disegniamo i tank
		tank.draw_sprite();

...
...





Cna u help me, please? Thanks!!! [Edited by - roccog on May 9, 2006 2:51:34 AM]

Share this post


Link to post
Share on other sites
Advertisement

class sprite
{
//cordinate dell'img (x,y)
int x, y;
//velocità di spostamento dell'animazione
int s_speed;
//indice del frame corrente
int cur_frame;
//flag che indica se ci stiamo muovendo
bool moving;
//ultimo tempo di aggiornamento del frame
long update_time;
//idealmente uno sprite è un insieme di frame
vector<frame *> frames;
public:
//costruttore
sprite(vector <string> files, int init_x=0, int init_y=0, int speed=2);
//distruttore
~sprite();

//function di spostamento frame
void mov_x(int mov=1);
void mov_y(int mov=1);


//function che ritornano le cordinate posizionali del frame
int get_x() { return x; };
int get_y() { return y; };

//function che ritornano le dimensioni di un frame
int get_w(int ind=0) { return frames[ind]->get_w();}
int get_h(int ind=0) { return frames[ind]->get_h();}

//function principale, che gestisce il disegno e l'animazione dello sprite
void draw_sprite();
//function che ridisegna il background modificato dallo sprite
void draw_bg();

};

/*
PLEASE NOTE: the program will require SDL.dll which is located in
dev-c++'s dll directory. You have to copy it to you
program's home directory or the path.
*/



//costruttore che si occupa di inizializzare tutti i dati necessari
sprite::sprite(vector <string> files, int init_x, int init_y, int speed)
{
//contatori
int i,num_files=files.size();

//puntatore temporaneo
frame * temp_frame;

//alloco tutti i frame necessari
for(i=0;i<num_files;i++)
{
temp_frame= new frame (files,110);
frames.push_back(temp_frame);
}

//inizializziamo le cordinate dello sprite
x=init_x;
y=init_y;

//settiamo la velocità dello sprite
s_speed=speed;

//il primo frame ha indice 0
cur_frame=0;

//il tempo iniziale è 0
update_time=0;

//inizialmente non ci muoviamo
moving=false;
}

void sprite::draw_sprite()
{
//se è passato il tempo necessario passiamo al prossimo frame
if(update_time+(frames[cur_frame]->get_pause())<SDL_GetTicks())
{
cur_frame++;

//se siamo all'ultimo frame torniamo a 0
if(cur_frame==(frames.size()))
cur_frame=0;

//aggiorniamo il tempo dell'ultima modifica
update_time = SDL_GetTicks();
}

//indichiamo le cordinate del tank
SDL_Rect dest_t;
dest_t.x = x;
dest_t.y = y;
dest_t.w = frames[cur_frame]->get_w();
dest_t.h = frames[cur_frame]->get_h();

//disegnamo il tank su screen
if(moving)
SDL_BlitSurface(frames[cur_frame]->get_surface(), NULL, screen,&dest_t);
else
{
SDL_BlitSurface(frames[0]->get_surface(), NULL, screen,&dest_t);
cur_frame=0;
}

//consideriamo l'animazione finita
moving=false;


//function che ridisegna il background modificato dallo sprite
void sprite::draw_bg()
{
//aggiorniamo il rettangolo che circonda il tank
SDL_Rect rect_bg;
rect_bg.x = 0;
rect_bg.y = 400;
rect_bg.w = frames[cur_frame]->get_w()+(s_speed*2);
rect_bg.h = frames[cur_frame]->get_h()+(s_speed*2);

//copiamo la parte di bg necessaria su screen
SDL_BlitSurface(bg, NULL, screen, &rect_bg);
}

...
...

SDL_Surface *grass;
int x,y,colorkey;
SDL_Rect rc_prato, rcGrass;
// si inizializza il sistema video
if( SDL_Init(SDL_INIT_VIDEO) == -1 )
{
// SDL_GetError() ritorna una descrizione dell'errore
cout << "Errore init SDL: " << SDL_GetError() << endl;
return 1;
}

// all'uscita del programma esegui SDL_Quit per risistemare le cose
atexit(SDL_Quit);

//dichiariamo un int a 32 bit per i flag da assegnare a screen
Uint32 flags;

flags = SDL_HWSURFACE|SDL_DOUBLEBUF;

// per rendere disegnabile la Superficie bisogna utilizzare SDL_SetVideoMode
if(!( screen = SDL_SetVideoMode(DIM_H, DIM_V, 0,flags) ))
{
cout << "Problemi con il settaggio dello schermo: " << SDL_GetError() << endl;
return 1;
}

//carichiamo l'immagine di sfondo
bg=SDL_LoadBMP("prato.bmp");
grass=SDL_LoadBMP("grass.bmp");


for (x = 0; x < SCREEN_WIDTH; x++) {
for (y = 0; y < SCREEN_HEIGHT; y++) {
rcGrass.x = x * 32;
rcGrass.y = y * 32;
SDL_BlitSurface(grass, NULL, screen, &rcGrass);
}
}



//il vector che conterrà le img dello sprite
vector<string> files;

//carichiamo le stringhe nel vector
files.push_back("tom1.bmp");
files.push_back("tom2.bmp");
files.push_back("tom3.bmp");
files.push_back("tom4.bmp");

colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
SDL_SetColorKey(bg, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);
//istanziamo gli sprite
sprite tank(files);

rc_prato.x=0;
rc_prato.y=400;

...
...

tank.draw_bg();
//tank2.draw_bg();
//tank3.draw_bg();
//disegnamo lo sfondo su screen
SDL_BlitSurface(bg, NULL, screen, &rc_prato);
//disegniamo i tank
tank.draw_sprite();






That was just to make it easier to read for everyone else. But the problem here seems to be very minor. I'm not very familiar with SDL so I don't know the actual function call, but if you clear the screen after you draw everything, it should fix the trailing back problem. As a little extra, you should also do one of two things, either one is fine:

1)Set your color key to the background color of your animation frames
2)Make the background of your animation frames, the same as SDL's default color key.

EDIT: Sorry, I see you've already set the color key. So just make the background of your animation frames hot pink(255, 0, 255). Or you could set it black so you don't have to mess with your images.

That will make the background transparent so that whatever is behind the animation will show through except for the animation itself.

Hope that helps you out. [smile]

-AJ

Share this post


Link to post
Share on other sites
Please, don't just dump code, that's an aweful lot to sort through.

But regardless, this is (probably) a fairly straight-forward mistake. What you need to do is draw the background every frame. It is turning the background black becuase its edges are black, and you aren't drawing the background back over it.

Since this is SDL, and things can get a little slow if you're doing too much, you might want to only draw the background of the part that the sprite was previously at, and only that spot.

Share this post


Link to post
Share on other sites
Okay, you posted quite a bit of code. In future, consider using [ source ] and [ /source ] (wihtout spaces) to put your code into a pretty box.

Looking at the picture that is a common problem when you do not redraw the background properly.


I would need to see a full game loop to see how you are handling the screen update, but I think somehow you are not clearing the screen properly. As a quick test, add a SDL_FillRect( screen, NULL, SDL_MapRGB( screen->format, 255,0,0 ) just before your rendering code, if the black bits go read then you can be sure that's the problem.

In addition, in sprite::draw_sprite()
Quote:

SDL_Rect rect_bg;
rect_bg.x = 0;
rect_bg.y = 400;
rect_bg.w = frames[cur_frame]->get_w()+(s_speed*2);
rect_bg.h = frames[cur_frame]->get_h()+(s_speed*2);


The bit with the s_speed * 2 looks wrong to me.


A final note, im not sure what this code is doing, but im pretty sure its not what its supposed to be doing.
void mov_x(int mov=1);
void mov_y(int mov=1);

Hope this helps, Good Luck!

Share this post


Link to post
Share on other sites
i edited my previous post by adding 'source' ... sorry guys! ;)


later i'll follow ur advices and i'll try to solve the problem...


thanks to all!!!


[Edited by - roccog on May 9, 2006 3:51:53 PM]

Share this post


Link to post
Share on other sites
I added "SDL_FillRect(screen, NULL, SDL_MapRGB( screen->format, 255, 0, 255 ) );" like rip-off said... and now i can move the sprite with leaving the black bits...

now i have to draw every sprite's frames... but i have a little problem...

to draw the background i should have to use:


colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
SDL_SetColorKey(bg, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);






but the prototipe of SDL_SetColorKey is:
int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);

so i have to use SDL_Surface* pointer to draw the background...

but in my code i load every frame by using a vector like this:


vector<string> vettore;

vettore.push_back("tom1.bmp");
vettore.push_back("tom2.bmp");
vettore.push_back("tom3.bmp");
vettore.push_back("tom4.bmp");





so if i use this vector i can't call SDL_SetColorKey to draw the frame...


In general the entire code is:


#include <iostream>
#include <vector>
#include <string>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <windows.h>

#define DIM_H 800
#define DIM_V 600
#define SCREEN_HEIGHT 800
#define SCREEN_WIDTH 600

using namespace std;

//accediamo alla screen globale
extern SDL_Surface *screen;
//accediamo alla bg globale
extern SDL_Surface *bg;

class frame
{
//la superficie del frame
SDL_Surface *The_Frame;
//pausa dal prossimo frame
int The_Pause;
public:
//costruttore
frame(string img, int pause);
//distruttore
~frame();

//function che ritorna una superficie dell'animazione
SDL_Surface * get_surface() { return The_Frame; };

//function che ritorna la larghezza del frame
int get_w() { return The_Frame->w; };
//function che ritorna l'altezza del frame
int get_h() { return The_Frame->h; };

//function che ritorna la pausa impostata
int get_pause() { return The_Pause; };
};

//costruttore, inizializzamo i dati necessari
frame::frame(string img, int pause)
{
pause=500;
//carichiamo l'immagine necessaria
The_Frame = SDL_LoadBMP(img.c_str());

//colore da rendere trasparente
Uint32 colorkey;
//prendiamo la mappatura del colore #0000FF in base al nostro specifico formato di pixel
colorkey = SDL_MapRGB(The_Frame->format, 0, 0, 0xFF);
//impostiamo il colore come trasparente
SDL_SetColorKey(The_Frame, SDL_SRCCOLORKEY|SDL_RLEACCEL, colorkey);

//pausa dal prossimo frame
The_Pause=pause;
}

//distruttore, liberiamo la superficie necessaria
frame::~frame()
{
SDL_FreeSurface(The_Frame);
}


class sprite
{
//cordinate dell'img (x,y)
int x, y;
//velocità di spostamento dell'animazione
int s_speed;
//indice del frame corrente
int cur_frame;
//flag che indica se ci stiamo muovendo
bool moving;
//ultimo tempo di aggiornamento del frame
long update_time;
//idealmente uno sprite è un insieme di frame
vector<frame *> frames;
public:
//costruttore
sprite(vector <string> files, int init_x=0, int init_y=0, int speed=2);
//distruttore
~sprite();

//function di spostamento frame
void mov_x(int mov=1);
void mov_y(int mov=1);


//function che ritornano le cordinate posizionali del frame
int get_x() { return x; };
int get_y() { return y; };

//function che ritornano le dimensioni di un frame
int get_w(int ind=0) { return frames[ind]->get_w();}
int get_h(int ind=0) { return frames[ind]->get_h();}

//function principale, che gestisce il disegno e l'animazione dello sprite
void draw_sprite();
//function che ridisegna il background modificato dallo sprite
void draw_bg();

};

/*
PLEASE NOTE: the program will require SDL.dll which is located in
dev-c++'s dll directory. You have to copy it to you
program's home directory or the path.
*/



//costruttore che si occupa di inizializzare tutti i dati necessari
sprite::sprite(vector <string> files, int init_x, int init_y, int speed)
{
//contatori
int i,num_files=files.size();

//puntatore temporaneo
frame * temp_frame;

//alloco tutti i frame necessari
for(i=0;i<num_files;i++)
{
temp_frame= new frame (files,110);
frames.push_back(temp_frame);
}

//inizializziamo le cordinate dello sprite
x=init_x;
y=init_y;

//settiamo la velocità dello sprite
s_speed=speed;

//il primo frame ha indice 0
cur_frame=0;

//il tempo iniziale è 0
update_time=0;

//inizialmente non ci muoviamo
moving=false;
}

//function che si occupa di gestire il disegno e l'animazione dello sprite
void sprite::draw_sprite()
{

//se è passato il tempo necessario passiamo al prossimo frame
if(update_time+(frames[cur_frame]->get_pause())<SDL_GetTicks())
{
cur_frame++;

//se siamo all'ultimo frame torniamo a 0
if(cur_frame==(frames.size()))
cur_frame=0;

//aggiorniamo il tempo dell'ultima modifica
update_time = SDL_GetTicks();
}

//indichiamo le cordinate del tank
SDL_Rect dest_t;
dest_t.x = x;
dest_t.y = y;
dest_t.w = frames[cur_frame]->get_w();
dest_t.h = frames[cur_frame]->get_h();

//disegnamo il tank su screen
if(moving)

SDL_BlitSurface(frames[cur_frame]->get_surface(), NULL, screen,&dest_t);

else
{
SDL_BlitSurface(frames[0]->get_surface(), NULL, screen,&dest_t);
cur_frame=0;
}

//consideriamo l'animazione finita
moving=false;

}

//function che ridisegna il background modificato dallo sprite
void sprite::draw_bg()
{
//aggiorniamo il rettangolo che circonda il tank
SDL_Rect rect_bg;
rect_bg.x = 0;
rect_bg.y = 400;
rect_bg.w = frames[cur_frame]->get_w()+(s_speed*2);
rect_bg.h = frames[cur_frame]->get_h()+(s_speed*2);

//copiamo la parte di bg necessaria su screen
SDL_BlitSurface(bg, NULL, screen, &rect_bg);
}

//function spostamento orizzontale
void sprite::mov_x(int mov)
{
//ci spostiamo in base ad s_speed
x+=mov*s_speed;
//segnaliamo che ci stiamo muovendo
moving=true;
}

//function spostamento verticale
void sprite::mov_y(int mov)
{
//ci spostiamo in base ad s_speed
y+=mov*s_speed;
//segnaliamo che ci stiamo muovendo
moving=true;
}

//distruttore
sprite::~sprite()
{
//contatori
int i,num_files=frames.size();

//chiamiamo il distruttore dei vari frame allocati precendentemente
for(i=0;i<num_files;i++)
{
frames->~frame();
}
}



//dichiariamo un puntatore ad una superficie globale
SDL_Surface *screen;

//anche bg è globale
SDL_Surface *bg;

int main(int argc, char* argv[])
{
SDL_Surface *grass;
int x,y,colorkey;
SDL_Rect rc_prato, rcGrass;
// si inizializza il sistema video
if( SDL_Init(SDL_INIT_VIDEO) == -1 )
{
// SDL_GetError() ritorna una descrizione dell'errore
cout << "Errore init SDL: " << SDL_GetError() << endl;
return 1;
}

// all'uscita del programma esegui SDL_Quit per risistemare le cose
atexit(SDL_Quit);

//dichiariamo un int a 32 bit per i flag da assegnare a screen
Uint32 flags;

flags = SDL_HWSURFACE|SDL_DOUBLEBUF;

// per rendere disegnabile la Superficie bisogna utilizzare SDL_SetVideoMode
if(!( screen = SDL_SetVideoMode(DIM_H, DIM_V, 0,flags) ))
{
cout << "Problemi con il settaggio dello schermo: " << SDL_GetError() << endl;
return 1;
}

//carichiamo l'immagine di sfondo
bg=SDL_LoadBMP("prato.bmp");
grass=SDL_LoadBMP("grass.bmp");

colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
SDL_SetColorKey(grass, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);

for (x = 0; x < SCREEN_WIDTH; x++) {
for (y = 0; y < SCREEN_HEIGHT; y++) {
rcGrass.x = x * 32;
rcGrass.y = y * 32;
SDL_BlitSurface(grass, NULL, screen, &rcGrass);
}
}




//il vector che conterrà le img dello sprite
vector<string> files;

//carichiamo le stringhe nel vector
files.push_back("tom1.bmp");
files.push_back("tom2.bmp");
files.push_back("tom3.bmp");
files.push_back("tom4.bmp");



colorkey = SDL_MapRGB(screen->format, 255, 0, 255);
SDL_SetColorKey(bg, SDL_SRCCOLORKEY | SDL_RLEACCEL, colorkey);




//istanziamo gli sprite
sprite tank(files);



rc_prato.x=0;
rc_prato.y=400;

//flag di fine loop principale
int end=0;


//stato della tastiera
Uint8* keys;

while(!end)
{
//dichiariamo una struttura SDL_Event
SDL_Event event;

// SDL_PollEvent attiva il gestore di eventi
while ( SDL_PollEvent(&event) )
{
//premendo la x della finestra col mouse si esce
if ( event.type == SDL_QUIT )
end = 1;

if ( event.type == SDL_KEYDOWN )
{
//ma si esce anche premendo Esc
if ( event.key.keysym.sym == SDLK_ESCAPE )
end = 1;
//premendo spazio si passa dalla modalità schermo intero alla modalità
//finestra e viceversa
if ( event.key.keysym.sym == SDLK_SPACE )
{
flags^=SDL_FULLSCREEN;
screen = SDL_SetVideoMode(DIM_H, DIM_V, 0,flags);

//disegnamo lo sfondo su screen
SDL_BlitSurface(bg, NULL, screen, NULL);
}
}
}


//per verificare se un tasto è mantenuto premuto usiamo SDL_GetKeyState che
//ritorna un'immagine dei tasti premuti
keys = SDL_GetKeyState(NULL);

//FRECCIA SU: se il tank non è posizionato a (x,0) andiamo su
if ( keys[SDLK_UP] )
{
if(tank.get_y())
tank.mov_y(-1);
}
//FRECCIA GIU: approssima il bordo inferiore in base al numero di tank e a DIM_V
if ( keys[SDLK_DOWN] )
{
if(tank.get_y()<(DIM_V-tank.get_h()))
tank.mov_y();
}
//FRECCIA SX: se il tank non è posizionato a (0,y) andiamo a sx
if ( keys[SDLK_LEFT] )
{
if(tank.get_x())
tank.mov_x(-1);
}
//FRECCIA DX: se il tank non è posizionato a (DIM_H-tank->w,y) andiamo a sx
if ( keys[SDLK_RIGHT] )
{
if(tank.get_x()<(DIM_H-tank.get_w()))
tank.mov_x();
}



//disegnamo le parti di sfondo interessate
tank.draw_bg();
//disegnamo lo sfondo su screen

SDL_FillRect(screen, NULL, SDL_MapRGB( screen->format, 255, 0, 255 ) );

SDL_BlitSurface(bg, NULL, screen, &rc_prato);
//disegniamo i tank
tank.draw_sprite();



//aggiorniamo lo schermo
SDL_UpdateRect(screen, 0, 0, 0, 0);

}

return 0;

}







what i can do in order to draw correctly every frame?
i have to not use a vector to load the BMP?


Thanks to all! ;)




[ps: if i use a png like this: http://membres.lycos.fr/gifsworldstudios/Image/sprite.png do u think it's a better idea? so i can draw the background only the first time for the big image and then i can extract from it each single frame... but what function i have to use to load the single sprite frame?]

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement