SDL i rysowanie pocisku.

0

Witam. Mam spory problem z napisaniem wystrzeliwania pocisku w grze typu Space Invaders. Chcę skorzystać z tej funkcji(rysuje spirte w punkcie o współrzędnych x i y):

void DrawSurface(SDL_Surface *screen, SDL_Surface *sprite, int x, int y) {
   SDL_Rect dest;
   dest.x = x - sprite->w / 2;
   dest.y = y - sprite->h / 2;
   dest.w = sprite->w;
   dest.h = sprite->h;
   SDL_BlitSurface(sprite, NULL, screen, &dest);
   }; 

lecz niestety udało mi się tylko osiągnąć efekt, w którym po wciśnięciu klawisza odpowiadającego za wystrzał pojawią sia "linia" (wygląda to jak laser ;p) od dziobu statku do górnej krawędzi okna (używam grafiki "bullet.bmp"). Rozumiem, że trzeba skorzystać z tablicy dwuwymiarowej, która będzie zawierała współrzędne X i Y pocisku i pętli, lecz nie za bardzo wiem jak to zapisać, Byłbym OGROMNIE wdzięczny za pomoc bo termin zbliża się nieubłaganie ;p

PS. statkiem poruszam sie tylko w prawo i lewo, a wiec pocisk jesy wystrzeliwany ze stalej wysokosci Y.

Pozdrawiam.

0

żeby pocisk się przemieszczał a nie powstawała linia musisz wyczyścić ekran po każdym obiegu pętli.
http://sdl.beuc.net/sdl.wiki/SDL_FillRect

0
extern "C" {
#include"SDL.h"
}
#define _USE_MATH_DEFINES
#include<math.h>
#include<stdio.h>
#include<string.h>
#if defined(WINDOWS) || defined(WIN32) || defined(_WIN32)
#include<windows.h>
#endif
#define EDGE_X 160
#define EDGE_Y 40
#define COLNUMB 6
#define ROWNUMB 6
#define WIDTH 640
#define HEIGHT 480
#define	ALIEN_SPEED 12
#define SHIP_SPEED 2
#define BULLET_SPEED 5
#define shipsize 54
#define LIMIT 426
Uint8 *keystate;

void DrawSurface(SDL_Surface *screen, SDL_Surface *sprite, int x, int y) {
	SDL_Rect dest;
	dest.x = x - sprite->w / 2;
	dest.y = y - sprite->h / 2;
	dest.w = sprite->w;
	dest.h = sprite->h;
	SDL_BlitSurface(sprite, NULL, screen, &dest);
	};

#if defined(WINDOWS) || defined(WIN32) || defined(_WIN32)
int WINAPI WinMain(HINSTANCE inst, HINSTANCE prev, LPSTR str, int show) {
#else
int main(int argc, const char **argv) {
#endif
	int t1, t2, quit;
	double angle, delta, worldTime;
	double shiposX=320, bullposY, bullX;
	bool shoot=false;
	SDL_Event event;
	SDL_Surface *screen;
	SDL_Surface *charset, *alien, *ship, *background, *gameover, *bullet;

	if(SDL_Init(SDL_INIT_EVERYTHING) == -1) {
		printf("error: %s\n", SDL_GetError());
		return 1;
		};

     if(screen == NULL) {
		printf("SerVideoMode error: %s\n", SDL_GetError());
		return 1;
		};

	screen = SDL_SetVideoMode(640,480,32,SDL_SWSURFACE | SDL_DOUBLEBUF);

	SDL_ShowCursor(SDL_DISABLE);

	charset = SDL_LoadBMP("CS8X8.BMP");
	SDL_SetColorKey(charset, SDL_SRCCOLORKEY, 0x000000);

	alien = SDL_LoadBMP("alien.bmp");
	SDL_SetColorKey(alien, SDL_SRCCOLORKEY, 0x000000);

	ship = SDL_LoadBMP("ship.bmp");
	SDL_SetColorKey(ship, SDL_SRCCOLORKEY, 0x000000);

	bullet = SDL_LoadBMP("bullet.bmp");
	SDL_SetColorKey(bullet, SDL_SRCCOLORKEY, 0x000000);

	background = SDL_LoadBMP("background.bmp");

	gameover = SDL_LoadBMP("gameover.bmp");

	double alien_arrX[COLNUMB][ROWNUMB];
	double alien_arrY[COLNUMB][ROWNUMB];
	
	SDL_GetTicks();
	worldTime = 0;
	quit=false;
	t1 = SDL_GetTicks();

	keystate = SDL_GetKeyState(NULL);
	
	for(int i=0;i<COLNUMB;i++)
	{
		for(int j=0;j<ROWNUMB;j++)
		{
			alien_arrX[i][j]=EDGE_X+65*i;
			alien_arrY[i][j]=EDGE_Y+30*j;
		}
	}

	while(!quit)
	{
		t2 = SDL_GetTicks();
		delta = (t2 - t1)*0.001;
		t1 = t2;

		worldTime += delta;
		
		for(int i=0;i<COLNUMB;i++)
		{
			for(int j=0;j<ROWNUMB;j++)
			{
				if(alien_arrY[i][j]<=LIMIT)
					alien_arrY[i][j]+=ALIEN_SPEED*delta;
				if(alien_arrY[i][j]>LIMIT)
					quit=true;
			}
		}
		
		for(int i=0;i<COLNUMB;i++)
		{
			for(int j=0;j<ROWNUMB;j++)
			{
				DrawSurface(screen,alien,alien_arrX[i][j],alien_arrY[i][j]);
			}
		}

		while (SDL_PollEvent(&event))
		{
			if (event.type == SDL_QUIT)
			{
				quit = true;
			}
			if (event.type == SDL_KEYDOWN)
			{	
				switch(event.key.keysym.sym)
				{
					case SDLK_ESCAPE:
						quit=true;
						break; 
				}
			}
		}

		if (event.type == SDL_KEYDOWN)
		{
				keystate[event.key.keysym.sym]=true;
		}
		if (event.type == SDL_KEYUP)
		{
				keystate[event.key.keysym.sym]=false;
		}

		if (keystate[SDLK_LEFT])
		{
				shiposX -= SHIP_SPEED;
		}
		if (keystate[SDLK_RIGHT])
		{
				shiposX += SHIP_SPEED;
		}

		if(shiposX > WIDTH-shipsize/2)
		{
				shiposX = WIDTH-shipsize/2;
		}
		if(shiposX < 0+shipsize/2)
		{
				shiposX = 0+shipsize/2;
		}

		
		if (keystate[SDLK_SPACE])
		{	
			//strzelanie
		}			

		SDL_Flip(screen);
		SDL_FillRect(SDL_GetVideoSurface(),NULL,0x000000);
		DrawSurface(screen, ship, shiposX, 453);
		
	}

	SDL_FreeSurface(ship);
	SDL_FreeSurface(alien);
	SDL_FreeSurface(bullet);
	SDL_Quit();
	return 0;
}
 

To kod mojej "gry". Jakoś poradziłem sobie z ruchem kosmitów lecz z pociskami mam dalej problem ;/ Zasatosowałem się do powyższej rady, lecz na czas lostu pocisku gra "zatrzymuje się"; gdy wcisnę spację to widzę tylko lot pocisku a potem znowu statek i alienów. Nie mam zielonego pojęcia jak to rozwiazać, dodatkowo biorąc pod uwagę fakt, że mój pocisk porusza się wraz ze statkiem -_-". Bardzo prosiłbym o pomoc, gdyż jutro mam termin oddania tej gry :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1