#include #include #include #include "config.h" #include "SDL/SDL.h" #include "SDL/SDL_image.h" #include "SDL/SDL_ttf.h" #include "Engine.h" #include "Timer.h" #include "Catbug.h" #include "Pickups.h" #include "extern.h" SDL_Surface* loadImage(char* filename) { SDL_Surface* loadedImage = NULL; SDL_Surface* optimizedImage = NULL; loadedImage = IMG_Load(filename); if (loadedImage != NULL) { optimizedImage = SDL_DisplayFormat(loadedImage); SDL_FreeSurface(loadedImage); } return optimizedImage; } void applySurface(int x, int y, SDL_Surface* source, SDL_Surface* destination, SDL_Rect* clip) { SDL_Rect offset; offset.x = x; offset.y = y; SDL_BlitSurface(source, clip, destination, &offset); } Uint32 getPixel(SDL_Surface* surface, int x, int y) { Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * surface->format->BytesPerPixel; return *(Uint32 *)p; } void scaleScreen() { Sint32 x, y; static SDL_Rect superPixel = {0,0, SCALE_FACTOR,SCALE_FACTOR}; switch (SCALE_FACTOR) { case 1: applySurface(0,0,screen,window,NULL); break; default: superPixel.y = 0; for (y = 0; y < SCREEN_HEIGHT; y++) { superPixel.x = 0; for (x = 0; x < SCREEN_WIDTH; x++) { SDL_FillRect(window, &superPixel, getPixel(screen, x, y)); superPixel.x += SCALE_FACTOR; } superPixel.y += SCALE_FACTOR; } break; } } void updateScore() { SDL_Color white = {255,255,255}; char sPoints[10]; sprintf(sPoints, "%d", points); score = TTF_RenderText_Solid(font,sPoints,white); applySurface(10, 20, score, screen, NULL); } void drawHP() { int i; for (i = 0; i < player->HP; i++) { applySurface(10+(6*i), 10, hpwedge, screen, NULL); } } void checkHP() { if (player->HP <= 0) { scoreSummary(); quit = 1; } } void scoreSummary() { SDL_Surface* yougot = NULL; SDL_Surface* hiscore = NULL; SDL_Color white = {255, 255, 255}; char sPoints[10]; sprintf(sPoints,"%d", points); yougot = TTF_RenderText_Solid(font2, "SCORE:" ,white); hiscore = TTF_RenderText_Solid(font2, sPoints, white); int here = 1; while (here) { timeStart(&fps); renderBG(); applySurface(120, 80, yougot, screen, NULL); applySurface(120, 105, hiscore, screen, NULL); while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case FS_BUTTON: toggleFullscreen(); break; case PAUSE_BUTTON: here = 0; quit = 0; break; case QUIT_BUTTON: here = 0; playing = 0; default: break; } break; case SDL_QUIT: here = 0; playing = 0; break; default: break; } } frameAdvance(); } SDL_FreeSurface(yougot); SDL_FreeSurface(hiscore); } void renderBG() { static int x = 0; applySurface(x,0,bg,screen,NULL); applySurface(x+1472,0,bg,screen,NULL); x -= 8; if (x == -1472) x = 0; } void interact() { while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case DPAD_UP: player->vY = -PLAYER_SPD; break; case DPAD_LEFT: player->vX = -PLAYER_SPD; break; case DPAD_DOWN: player->vY = PLAYER_SPD; break; case DPAD_RIGHT: player->vX = PLAYER_SPD; break; case FS_BUTTON: toggleFullscreen(); break; case PAUSE_BUTTON: pauseGame(); break; case QUIT_BUTTON: quit = 1; playing = 0; break; default: break; } break; case SDL_KEYUP: switch (event.key.keysym.sym) { case DPAD_UP: if (player->vY < 0) player->vY = 0; break; case DPAD_LEFT: if (player->vX < 0) player->vX = 0; break; case DPAD_DOWN: if (player->vY > 0) player->vY = 0; break; case DPAD_RIGHT: if (player->vX > 0) player->vX = 0; break; default: break; } break; case SDL_QUIT: quit = 1; playing = 0; break; default: break; } } } int init(int argc, char* args[]) { int i; printf("Initializing SDL\n"); if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER) == -1) return 0; printf("Initialized SDL\nCreating window\n"); if (argc >= 2) { if (strcmp(args[1], "-w")) { window = SDL_SetVideoMode(SCREEN_WIDTH*SCALE_FACTOR, SCREEN_HEIGHT*SCALE_FACTOR, 32, SDL_FULLSCREEN|SDL_HWSURFACE); fullscreen = 1; } else window = SDL_SetVideoMode(SCREEN_WIDTH*SCALE_FACTOR, SCREEN_HEIGHT*SCALE_FACTOR, 32, SDL_HWSURFACE|SDL_RESIZABLE); } else { window = SDL_SetVideoMode(SCREEN_WIDTH*SCALE_FACTOR, SCREEN_HEIGHT*SCALE_FACTOR, 32, SDL_FULLSCREEN|SDL_HWSURFACE); fullscreen = 1; } SDL_ShowCursor(0); screen = loadImage("assets/rawscreen.png"); if (window == NULL || screen == NULL) return 0; SDL_WM_SetCaption("Catbug", NULL); printf("Window created\nInitializing data\n"); if (TTF_Init() == -1) return 0; ticker = time(NULL); bg = loadImage("assets/seethruzone.png"); hpwedge = loadImage("assets/hp.png"); font = TTF_OpenFont("assets/charriot.ttf", 10); font2 = TTF_OpenFont("assets/charriot.ttf", 20); player = newCatbug(35, 90); stuff = malloc(10*sizeof(Pickup*)); for (i = 0; i < 10; i++) { stuff[i] = NULL; } return 1; } void title() { SDL_Surface* titletxt = loadImage("assets/titletext.png"); int here = 1; while (here) { timeStart(&fps); renderBG(); applySurface(0, 0, titletxt, screen, NULL); while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case FS_BUTTON: toggleFullscreen(); break; case PAUSE_BUTTON: here = 0; quit = 0; break; case QUIT_BUTTON: here = 0; quit = 1; playing = 0; default: break; } break; case SDL_QUIT: here = 0; playing = 0; quit = 1; break; default: break; } } frameAdvance(); } SDL_FreeSurface(titletxt); } void resetGame() { maxHP = STARTING_HP; player->HP = STARTING_HP; player->x = 35; player->y = 90; player->vX = 0; player->vY = 0; points = 0; threshold = 10; cleanPickups(); } void pauseGame() { SDL_Color white = {255,255,255}; SDL_Surface* paused = TTF_RenderText_Solid(font,"paused",white); int here = 1; while (here) { timeStart(&fps); player->vX = 0; player->vY = 0; applySurface(10,30,paused,screen,NULL); while (SDL_PollEvent(&event)) { switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case FS_BUTTON: toggleFullscreen(); break; case PAUSE_BUTTON: here = 0; break; case QUIT_BUTTON: here = 0; playing = 0; quit = 1; default: break; } break; case SDL_QUIT: here = 0; playing = 0; quit = 1; break; default: break; } } frameAdvance(); } SDL_FreeSurface(paused); } void timeDilation() { int i = getTicks(&fps); if (i < 1000/30) SDL_Delay(1000/30 - i); } void frameAdvance() { scaleScreen(); SDL_Flip(window); timeDilation(); } void toggleFullscreen() { if (!fullscreen) { SDL_SetVideoMode(SCREEN_WIDTH*SCALE_FACTOR, SCREEN_HEIGHT*SCALE_FACTOR, 32, SDL_FULLSCREEN|SDL_HWSURFACE); fullscreen = 1; } else { SDL_SetVideoMode(SCREEN_WIDTH*SCALE_FACTOR, SCREEN_HEIGHT*SCALE_FACTOR, 32, SDL_HWSURFACE|SDL_RESIZABLE); fullscreen = 0; } } void cleanup() { if (fullscreen) toggleFullscreen(); printf("Freeing assets\n"); deleteCatbug(player); cleanPickups(); free(stuff); SDL_FreeSurface(bg); SDL_FreeSurface(hpwedge); SDL_FreeSurface(score); SDL_FreeSurface(screen); SDL_FreeSurface(window); TTF_CloseFont(font); TTF_CloseFont(font2); printf("Closing SDL systems\n"); TTF_Quit(); SDL_Quit(); printf("Cleanup complete\n"); }