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 :(