From 5c210982119f2491a9b9008c9ce22f274cfeba82 Mon Sep 17 00:00:00 2001 From: "rodolfo.borges" Date: Sun, 28 Jan 2007 14:24:34 +0000 Subject: [PATCH] game states and messages. fix memory leak and buffer overflow on text rendering. git-svn-id: https://cave9.googlecode.com/svn/trunk@17 13012bb5-4427-0410-85c5-5d3d33be36bb --- src/display.c | 48 +++++++++++++++++++++++++-------- src/display.h | 2 ++ src/main.c | 87 ++++++++++++++++++++++++++++++++--------------------------- 3 files changed, 87 insertions(+), 50 deletions(-) diff --git a/src/display.c b/src/display.c index d665b9e..ef3ca2d 100644 --- a/src/display.c +++ b/src/display.c @@ -3,6 +3,7 @@ #include #include #include +#include #include "display.h" void viewport(Display *display, GLsizei w, GLsizei h, GLsizei bpp) @@ -99,26 +100,40 @@ void ship_model(Ship *ship) { } -void render_hud(Display *display, Ship *player) +void render_text(Display *display, const char *text, float x, float y) { - char buf[32]; SDL_Color color = {0xff,0xff,0xff,0xff}; - sprintf(buf, "collision %.1f velocity %.3fKm/s score %.1f", - player->dist, LEN(player->vel), player->pos[2]); - SDL_Surface *label = TTF_RenderText_Blended(display->font, buf, color); + SDL_Surface *label = TTF_RenderText_Blended(display->font, text, color); + assert(label != NULL); + display->rect[display->rect_n].w = label->w; display->rect[display->rect_n].h = label->h; - display->rect[display->rect_n].x = - display->screen->w-display->rect[display->rect_n].w-display->screen->w/20; - display->rect[display->rect_n].y = - display->screen->h-display->rect[display->rect_n].h-display->screen->h/20; + display->rect[display->rect_n].x = x*display->screen->w - .5*label->w; + display->rect[display->rect_n].y = y*display->screen->h - .5*label->h; + SDL_FillRect(display->screen, &display->rect[display->rect_n], - SDL_MapRGBA(display->screen->format, - 0x00,0x00,0x80,0xff)); + SDL_MapRGBA(display->screen->format, 0x00,0x00,0x80,0xff)); SDL_BlitSurface(label, NULL, display->screen, &display->rect[display->rect_n]); + + SDL_FreeSurface(label); ++display->rect_n; } +void display_hud(Display *display, Ship *player) +{ + char buf[80]; + sprintf(buf, "collision %.1f velocity %.3fKm/s score %.1f", + player->dist, LEN(player->vel), player->pos[2]); + render_text(display, buf, .5, .9); +} + +void display_message(Display *display, const char *msg) +{ + render_text(display, msg, .5, .5); + SDL_UpdateRects(display->screen, display->rect_n, display->rect); // only update 2D + SDL_GL_SwapBuffers(); // update geral +} + void display_start_frame(Display *display, Ship *player) { COPY(display->cam, player->pos); @@ -143,11 +158,22 @@ void display_start_frame(Display *display, Ship *player) #endif } +void display_end_frame(Display *display, Ship *player) +{ + glFinish(); + + display_hud(display, player); + SDL_UpdateRects(display->screen, display->rect_n, display->rect); // only update 2D + + SDL_GL_SwapBuffers(); // update 3d +} + void display_init(Display *display) { SDL_Init(SDL_INIT_VIDEO); atexit(SDL_Quit); + display->rect_n = 0; display->near = EPSILON; display->far = 100; SET(display->cam,0,0,0); diff --git a/src/display.h b/src/display.h index fcfbba0..ac5baaa 100644 --- a/src/display.h +++ b/src/display.h @@ -20,6 +20,8 @@ void ship_model(Ship *ship); void render_hud(Display*, Ship *player); void display_init(Display* display); void display_start_frame(Display *display, Ship *player); +void display_end_frame(Display *display, Ship *player); +void display_message(Display *display, const char *msg); #endif diff --git a/src/main.c b/src/main.c index ddaf26c..810b10a 100644 --- a/src/main.c +++ b/src/main.c @@ -8,9 +8,7 @@ typedef struct { bool pressed[SDLK_LAST]; - bool run; - bool live; - bool paused; + enum {WELCOME, INIT, PLAY, PAUSE, GAMEOVER, QUIT} state; } Input; void control(Display *display, Input *input) @@ -23,24 +21,35 @@ void control(Display *display, Input *input) switch(event.key.keysym.sym) { case SDLK_ESCAPE: case SDLK_q: - input->run = 0; + input->state = QUIT; break; case SDLK_f: SDL_WM_ToggleFullScreen(display->screen); break; case SDLK_p: case SDLK_PAUSE: - input->paused = !input->paused; + if(input->state == PLAY) { + input->state = PAUSE; + display_message(display, "paused"); + } + else if(input->state == PAUSE) + input->state = PLAY; + break; + case SDLK_SPACE: + case SDLK_RETURN: + if(input->state == WELCOME || input->state == GAMEOVER) + input->state = INIT; + else if(input->state == PAUSE) + input->state = PLAY; break; default: break; } case SDL_KEYUP: - input->pressed[event.key.keysym.sym] - = (event.type == SDL_KEYDOWN); + input->pressed[event.key.keysym.sym] = (event.type == SDL_KEYDOWN); break; case SDL_QUIT: - input->run = 0; + input->state = QUIT; break; case SDL_VIDEORESIZE: viewport(display, event.resize.w, event.resize.h, 0); @@ -51,17 +60,14 @@ void control(Display *display, Input *input) void player_control(Ship *player, Input *input) { - player->lefton = (input->pressed[SDLK_UP] || input->pressed[SDLK_LEFT]) ? 1 : 0; - player->righton = (input->pressed[SDLK_UP] || input->pressed[SDLK_RIGHT]) ? 1 : 0; + player->lefton = input->pressed[SDLK_LEFT]; + player->righton = input->pressed[SDLK_RIGHT]; } int main(int argc, char *argv[]) { Display display; Input input; - input.run = 1; - input.live = 1; - input.paused = 0; memset( input.pressed, 0, sizeof(input.pressed) ); srand(time(NULL)); @@ -71,49 +77,52 @@ int main(int argc, char *argv[]) Ship player; display_init(&display); - ship_init(&player, 1); - ship_init(&digger, 12); - cave_init(&cave,&digger); + input.state = WELCOME; + display_message(&display, "welcome. [press space]"); float dt = 0; - while(input.run) { + while(input.state != QUIT) { int t0 = SDL_GetTicks(); display.rect_n = 0; control(&display, &input); - if(!input.paused) { - + switch(input.state) { + case INIT: + ship_init(&player, 1); + ship_init(&digger, 12); + cave_init(&cave,&digger); + input.state = PLAY; + break; + case PLAY: display_start_frame(&display, &player); - if(input.live) { - player_control(&player, &input); - ship_move(&player, dt); - digger_control(&digger); - ship_move(&digger, dt); - if(collision(&cave, &player) <= 0) - input.live = 0; - cave_gen(&cave, &digger); - - cave_model(&cave); - ship_model(&player); - } else { - //render_gameover(); + player_control(&player, &input); + ship_move(&player, dt); + digger_control(&digger); + ship_move(&digger, dt); + if(collision(&cave, &player) <= 0) { + display_message(&display, "gameover. [press space]"); + input.state = GAMEOVER; } + cave_gen(&cave, &digger); - glFinish(); - - render_hud(&display, &player); - SDL_UpdateRects(display.screen, display.rect_n, display.rect); // only update 2D - - SDL_GL_SwapBuffers(); // update 3d + cave_model(&cave); + ship_model(&player); + display_end_frame(&display, &player); + break; + case WELCOME: + case PAUSE: + case GAMEOVER: + case QUIT: + break; } int t1 = SDL_GetTicks(); SDL_Delay( MAX( 1, 1000/FPS-(t1-t0) ) ); dt = (SDL_GetTicks()-t0)/1000.; - dt = 1./FPS; + //dt = 1./FPS; } return 0; -- 2.11.4.GIT