#include #include "pixel.h" enum direction {up=0, down=1, left=2, right=3}; struct Player { enum direction dir; int points; SDL_Color color; int posx, posy; }; struct Player player1, player2; void initPlayers() { SDL_Surface *screen = SDL_GetVideoSurface(); player1.dir = left; player1.posx = screen->w / 3 * 2; player1.posy = screen->h / 2; player1.points = 0; player1.color.r = 255; player1.color.g = 0; player1.color.b = 0; player2.dir = right; player2.posx = screen->w / 3; player2.posy = screen->h / 2; player2.points = 0; player2.color.r = 0; player2.color.g = 255; player2.color.b = 0; } Uint32 color2rgb(SDL_Color c) { return SDL_MapRGB(SDL_GetVideoSurface()->format, c.r, c.g, c.b); } void paintPlayer(struct Player *p) { putpixel(SDL_GetVideoSurface(), p->posx, p->posy, color2rgb(p->color)); } void movePlayer(struct Player *p) { switch(p->dir) { case up: p->posy--; break; case down: p->posy++; break; case left: p->posx--; break; case right: p->posx++; break; } } int playerCollided(struct Player* p) { SDL_Surface *screen = SDL_GetVideoSurface(); if(p->posx < 0 || p->posx >= screen->w || p->posy < 0 || p->posy >= screen->h || getpixel(screen, p->posx, p->posy) != SDL_MapRGB(screen->format, 0, 0, 0)) return 1; return 0; } int gotCollision() { int p1 = playerCollided(&player1); int p2 = playerCollided(&player2); if((player1.posx == player2.posx && player1.posy == player2.posy) || (p1 && p2)) return 3; // draw game if(p1) return 1; if(p2) return 2; return 0; } void updateWindowTitle() { char buf[128]; sprintf(buf, "C-Kurs Tron - %02d : %02d", player2.points, player1.points); SDL_WM_SetCaption(buf, 0); } void resetGame() { SDL_Surface *screen = SDL_GetVideoSurface(); SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0, 0, 0)); player1.posx = screen->w / 3*2; player1.posy = screen->h / 2; player1.dir = left; player2.posx = screen->w / 3; player2.posy = screen->h / 2; player2.dir = right; updateWindowTitle(); } int main(int argc, char **argv) { SDL_Init(SDL_INIT_EVERYTHING); SDL_Surface *screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE); initPlayers(); updateWindowTitle(); int quit = 0; SDL_Event event; while(!quit) { if(SDL_PollEvent(&event)) { if(event.type == SDL_QUIT) { quit = 1; } else if(event.type == SDL_KEYDOWN) { switch(event.key.keysym.sym) { case SDLK_LEFT: if(player1.dir!=right) player1.dir = left; break; case SDLK_RIGHT: if(player1.dir!=left) player1.dir = right; break; case SDLK_UP: if(player1.dir!=down) player1.dir = up; break; case SDLK_DOWN: if(player1.dir!=up) player1.dir = down; break; case SDLK_a: if(player2.dir!=right) player2.dir = left; break; case SDLK_d: if(player2.dir!=left) player2.dir = right; break; case SDLK_w: if(player2.dir!=up) player2.dir = up; break; case SDLK_s: if(player2.dir!=down) player2.dir = down; break; default: /* unhandled key */ break; } } } else { int coll; movePlayer(&player1); movePlayer(&player2); if((coll = gotCollision())) { if(coll == 1) player2.points++; else if(coll == 2) player1.points++; resetGame(); } else { paintPlayer(&player1); paintPlayer(&player2); } SDL_Flip(screen); SDL_Delay(10); } } SDL_Quit(); return 0; }