X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=main.c;h=ccaf3504d59c5bc55ba7d6fd497e67240fc49b2f;hp=d2627f287d02b4747be8e73149ffd08282baf079;hb=47d10ee91e99f21602ce674ad140fc99b8986633;hpb=e73059d5a7394d072b17ba6c24ff7fad372bd2e8 diff --git a/main.c b/main.c index d2627f2..ccaf350 100644 --- a/main.c +++ b/main.c @@ -19,7 +19,6 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#include #include #include #include @@ -28,7 +27,7 @@ #include #include -#include "SFont.h" +#include "font.h" #include "args.h" #include "common.h" @@ -42,6 +41,10 @@ #include "sprite.h" #include "sound.h" +#ifdef WIN32 +#define SDL_SetAlpha(surf, flag, alpha) +#endif + // ************************************* VARS // SDL_Surface global variables SDL_Surface @@ -56,7 +59,7 @@ SDL_Surface *surf_font_big; // The big font -SFont_Font *g_font; +font *g_font; // Structure global variables struct enginedots edot[MAXENGINEDOTS], *dotptr = edot; @@ -72,7 +75,8 @@ float screendx = SCREENDXMIN, screendy = 0.0; float back_dist; // all movement is based on t_frame. -float t_frame; // length of this frame (in ticks = 1/20th second) +unsigned long frames, start, end; +float t_frame; // length of this frame (in ticks = 1/20th second) adjusted for gamespeed int ms_frame; // length of this frame (milliseconds) int ms_end; // end of this frame (milliseconds) @@ -103,12 +107,12 @@ float state_timeout = 600.0; char *msgs[2][3] = { { "Press SPACE for normal game", - "Press 'e' for easy game", + "Press '1' for easy game", "http://jasonwoof.org/vor" }, { "Press SPACE for easy game", - "Press 'n' for normal game", + "Press '2' for normal game", "http://jasonwoof.org/vor" } }; @@ -135,22 +139,20 @@ init_engine_dots() { void new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s) { - int x,y,endcount; - uint16_t *pixel,c; + int i, n, x, y; + uint16_t *pixel, c; uint32_t colorkey; int row_inc; - double theta,r; - int begin_generate; + double theta, r; - begin_generate = SDL_GetTicks(); + n = 20; pixel = s->pixels; row_inc = s->pitch/sizeof(uint16_t) - s->w; colorkey = s->format->colorkey; - SDL_LockSurface(s); + if(SDL_MUSTLOCK(s)) { SDL_LockSurface(s); } - endcount = 0; - while (endcount<3) { + for(i=0; ipixels; for(y=0; yh; y++) { for(x = 0; xw; x++) { @@ -158,60 +160,71 @@ new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s) if(c && c != colorkey) { theta = frnd()*M_PI*2; r = frnd(); r = 1 - r*r; - // r = 1 - frnd()*frnd(); bdot[bd2].dx = 45*r*cos(theta) + dx; bdot[bd2].dy = 45*r*sin(theta) + dy; bdot[bd2].x = x + xbang; bdot[bd2].y = y + ybang; - bdot[bd2].c = 0; - bdot[bd2].life = 100; + //bdot[bd2].c = (i < n-3) ? 0 : c; + bdot[bd2].life = frnd() * 99; bdot[bd2].decay = frnd()*3 + 1; bdot[bd2].active = 1; - // Replace the last few bang dots with the pixels from the exploding object - if(endcount>0) bdot[bd2].c = c; - bd2 = (bd2+1) % MAXBANGDOTS; } pixel += row_inc; } } - if(SDL_GetTicks() - begin_generate > 7) endcount++; } - SDL_UnlockSurface(s); + if(SDL_MUSTLOCK(s)) { SDL_UnlockSurface(s); } } void -draw_bang_dots(SDL_Surface *s) +move_bang_dots(float ticks) { int i; - int first_i, last_i; - uint16_t *pixels, *pixel, c; - int row_inc = s->pitch/sizeof(uint16_t); - - pixels = (uint16_t *) s->pixels; - first_i = -1; - last_i = 0; + Sprite *hit; for(i=0; i= XSIZE || bdot[i].y < 0 || bdot[i].y >= YSIZE) { + bdot[i].x += (bdot[i].dx - screendx)*ticks; + bdot[i].y += (bdot[i].dy - screendy)*ticks; + if(bdot[i].x < 0 || bdot[i].x >= (XSIZE - 0.000001) || bdot[i].y < 0 || bdot[i].y >= (YSIZE - 0.000001)) { bdot[i].active = 0; continue; } // check collisions - if(pixel_collides(bdot[i].x, bdot[i].y)) { bdot[i].active = 0; continue; } + if((hit = pixel_collides(bdot[i].x, bdot[i].y))) { + if(hit->type != SHIP) { // they shouldn't hit the ship, but they do + bdot[i].active = 0; + hit->dx += ENGINE_DOT_WEIGHT * bdot[i].life * bdot[i].dx / sprite_mass(hit); + hit->dy += ENGINE_DOT_WEIGHT * bdot[i].life * bdot[i].dy / sprite_mass(hit); + continue; + } + } + } +} + + +void +draw_bang_dots(SDL_Surface *s) +{ + int i; + uint16_t *pixels, *pixel, c; + int row_inc = s->pitch/sizeof(uint16_t); + + pixels = (uint16_t *) s->pixels; + + for(i=0; iw / 2; hy = ship.image->h / 2; - for(i = 0; iactive == 0) { - a = frnd()*M_PI + (dir-1)*M_PI_2; - r = sin(frnd()*M_PI); - dx = r * cos(a); - dy = r * -sin(a); // screen y is "backwards". - - dotptr->active = 1; - dotptr->x = ship.x + s[dir]*hx + (frnd()-0.5)*3; - dotptr->y = ship.y + s[(dir+1)&3]*hy + (frnd()-0.5)*3; - if(dir&1) { - dotptr->dx = ship.dx + 2*dx; - dotptr->dy = ship.dy + 20*dy; - dotptr->life = 60 * fabs(dy); - } else { - dotptr->dx = ship.dx + 20*dx; - dotptr->dy = ship.dy + 2*dy; - dotptr->life = 60 * fabs(dx); - } + for(dir=0; dir<4; dir++) { + if(!(ship.jets & 1<active == 0) { + a = frnd()*M_PI + (dir-1)*M_PI_2; + r = sin(frnd()*M_PI); + dx = r * cos(a); + dy = r * -sin(a); // screen y is "backwards". + + dotptr->active = 1; + + // dot was created at a random time during the time span + time = frnd() * time_span; // this is how long ago + + // calculate how fast the ship was going when this engine dot was + // created (as if it had a smooth acceleration). This is used in + // determining the velocity of the dots, but not their starting + // location. + accelh = ((ship.jets >> 2) & 1) - (ship.jets & 1); + accelh *= THRUSTER_STRENGTH * time; + past_ship_dx = ship.dx - accelh; + accelv = ((ship.jets >> 1) & 1) - ((ship.jets >> 3) & 1); + accelv *= THRUSTER_STRENGTH * time; + past_ship_dy = ship.dy - accelv; + + // the starting position (not speed) of the dot is calculated as + // though the ship were traveling at a constant speed for this + // time_span. + dotptr->x = (ship.x - (ship.dx - screendx) * time) + s[dir]*hx; + dotptr->y = (ship.y - (ship.dy - screendy) * time) + s[(dir+1)&3]*hy; + if(dir&1) { + dotptr->dx = past_ship_dx + 2*dx; + dotptr->dy = past_ship_dy + 20*dy; + dotptr->life = 60 * fabs(dy); + } else { + dotptr->dx = past_ship_dx + 20*dx; + dotptr->dy = past_ship_dy + 2*dy; + dotptr->life = 60 * fabs(dx); + } - if(dotptr - edot < MAXENGINEDOTS-1) dotptr++; - else dotptr = edot; + // move the dot as though it were created in the past + dotptr->x += (dotptr->dx - screendx) * time; + dotptr->y += (dotptr->dy - screendy) * time; + + if(dotptr - edot < MAXENGINEDOTS-1) dotptr++; + else dotptr = edot; + } } } } void -draw_engine_dots(SDL_Surface *s) { +move_engine_dots(float ticks) { int i; - uint16_t c; - uint16_t *pixels = (uint16_t *) s->pixels; - int row_inc = s->pitch/sizeof(uint16_t); - int heatindex; Sprite *hit; for(i = 0; i= XSIZE - || edot[i].y<0 || edot[i].y >= YSIZE) { + if(edot[i].life < 0 || edot[i].x<0 || edot[i].x >= (XSIZE - 0.000001) || edot[i].y < 0 || edot[i].y >= (YSIZE - 0.000001)) { edot[i].active = 0; continue; } + // check collisions if((hit = pixel_collides(edot[i].x, edot[i].y))) { if(hit->type != SHIP) { // they shouldn't hit the ship, but they do @@ -286,30 +324,33 @@ draw_engine_dots(SDL_Surface *s) { continue; } } - heatindex = edot[i].life * 6; - c = heatindex>3*W ? heatcolor[3*W-1] : heatcolor[heatindex]; - pixels[row_inc*(int)(edot[i].y) + (int)(edot[i].x)] = c; } } void -drawdots(SDL_Surface *s) { - int m; +draw_engine_dots(SDL_Surface *s) { + int i; + uint16_t c; + uint16_t *pixels = (uint16_t *) s->pixels; + int row_inc = s->pitch/sizeof(uint16_t); + int heatindex; - // Create engine dots out the side we're moving from - for(m = 0; m<4; m++) { - if(ship.jets & 1<3*W ? heatcolor[3*W-1] : heatcolor[heatindex]; + pixels[row_inc*(int)(edot[i].y) + (int)(edot[i].x)] = c; + } +} - SDL_LockSurface(s); +void +draw_dots(SDL_Surface *s) { + if(SDL_MUSTLOCK(s)) { SDL_LockSurface(s); } draw_dust(s); draw_engine_dots(s); draw_bang_dots(s); - SDL_UnlockSurface(s); + if(SDL_MUSTLOCK(s)) { SDL_UnlockSurface(s); } } SDL_Surface * @@ -331,7 +372,11 @@ load_image(char *filename) void load_ship(void) { - load_sprite(SPRITE(&ship), "sprites/ship.png"); + load_sprite(SPRITE(&ship), "ship.png"); +} + +void font_cleanup() { + font_free(g_font); } int @@ -383,22 +428,24 @@ init(void) { } // Load the banners - NULLERROR(surf_b_variations = load_image("banners/variations.png")); - NULLERROR(surf_b_on = load_image("banners/on.png")); - NULLERROR(surf_b_rockdodger = load_image("banners/rockdodger.png")); + NULLERROR(surf_b_variations = load_image("b_variations.png")); + NULLERROR(surf_b_on = load_image("b_on.png")); + NULLERROR(surf_b_rockdodger = load_image("b_rockdodger.png")); - NULLERROR(surf_b_game = load_image("banners/game.png")); - NULLERROR(surf_b_over = load_image("banners/over.png")); + NULLERROR(surf_b_game = load_image("b_game.png")); + NULLERROR(surf_b_over = load_image("b_over.png")); // Load the life indicator (small ship) graphic. - NULLERROR(surf_life = load_image("indicators/life.png")); + NULLERROR(surf_life = load_image("life.png")); // Load the font image - s = add_data_path(BIG_FONT_FILE); + s = add_data_path("font.png"); if(s) { - NULLERROR(surf_font_big = IMG_Load(s)); - free(s); - g_font = SFont_InitFont(surf_font_big); + g_font = font_load(s); + atexit(&font_cleanup); + } else { + fprintf(stderr, "could create path to font\n"); + exit(1); } init_engine_dots(); @@ -444,12 +491,12 @@ draw_game_over(void) dest.x = (XSIZE-surf_b_game->w)/2; dest.y = (YSIZE-surf_b_game->h)/2-40; - SDL_SetAlpha(surf_b_game, SDL_SRCALPHA, (int)(a_game*(200 + 55*cos(fadetimer)))); + //SDL_SetAlpha(surf_b_game, SDL_SRCALPHA, (int)(a_game*(200 + 55*cos(fadetimer)))); SDL_BlitSurface(surf_b_game,NULL,surf_screen,&dest); dest.x = (XSIZE-surf_b_over->w)/2; dest.y = (YSIZE-surf_b_over->h)/2 + 40; - SDL_SetAlpha(surf_b_over, SDL_SRCALPHA, (int)(a_over*(200 + 55*sin(fadetimer)))); + //SDL_SetAlpha(surf_b_over, SDL_SRCALPHA, (int)(a_over*(200 + 55*sin(fadetimer)))); SDL_BlitSurface(surf_b_over,NULL,surf_screen,&dest); if(new_high_score(score)) { @@ -460,11 +507,11 @@ draw_game_over(void) text1 = msgs[g_easy][1]; } - x = (XSIZE-SFont_TextWidth(g_font,text0))/2 + cos(fadetimer/9)*10; - SFont_Write(surf_screen,g_font,x,YSIZE-100 + cos(fadetimer/6)*5,text0); + x = (XSIZE-font_width(text0))/2 + cos(fadetimer/9)*10; + font_write(x,YSIZE-100 + cos(fadetimer/6)*5,text0); - x = (XSIZE-SFont_TextWidth(g_font,text1))/2 + sin(fadetimer/9)*10; - SFont_Write(surf_screen,g_font,x,YSIZE-50 + sin(fadetimer/4)*5,text1); + x = (XSIZE-font_width(text1))/2 + sin(fadetimer/9)*10; + font_write(x,YSIZE-50 + sin(fadetimer/4)*5,text1); } void @@ -478,33 +525,33 @@ draw_title_page(void) dest.x = (XSIZE-surf_b_variations->w)/2 + cos(fadetimer/6.5)*10; dest.y = (YSIZE/2-surf_b_variations->h)/2 + sin(fadetimer/5.0)*10; - SDL_SetAlpha(surf_b_variations, SDL_SRCALPHA, (int)(200 + 55*sin(fadetimer))); + //SDL_SetAlpha(surf_b_variations, SDL_SRCALPHA, (int)(200 + 55*sin(fadetimer))); SDL_BlitSurface(surf_b_variations,NULL,surf_screen,&dest); dest.x = (XSIZE-surf_b_on->w)/2 + cos((fadetimer + 1.0)/6.5)*10; dest.y = (YSIZE/2-surf_b_on->h)/2 + surf_b_variations->h + 20 + sin((fadetimer + 1.0)/5.0)*10; - SDL_SetAlpha(surf_b_on, SDL_SRCALPHA, (int)(200 + 55*sin(fadetimer-1.0))); + //SDL_SetAlpha(surf_b_on, SDL_SRCALPHA, (int)(200 + 55*sin(fadetimer-1.0))); SDL_BlitSurface(surf_b_on,NULL,surf_screen,&dest); dest.x = (XSIZE-surf_b_rockdodger->w)/2 + cos((fadetimer + 2.0)/6.5)*10; dest.y = (YSIZE/2-surf_b_rockdodger->h)/2 + surf_b_variations->h + surf_b_on->h + 40 + sin((fadetimer + 2.0)/5)*10; - SDL_SetAlpha(surf_b_rockdodger, SDL_SRCALPHA, (int)(200 + 55*sin(fadetimer-2.0))); + //SDL_SetAlpha(surf_b_rockdodger, SDL_SRCALPHA, (int)(200 + 55*sin(fadetimer-2.0))); SDL_BlitSurface(surf_b_rockdodger,NULL,surf_screen,&dest); text = msgs[g_easy][(int)(fadetimer/35)%NSEQUENCE]; - x = (XSIZE-SFont_TextWidth(g_font,text))/2 + cos(fadetimer/4.5)*10; - SFont_Write(surf_screen,g_font,x,YSIZE-100 + cos(fadetimer/3)*5,text); + x = (XSIZE-font_width(text))/2 + cos(fadetimer/4.5)*10; + font_write(x,YSIZE-100 + cos(fadetimer/3)*5,text); text = "Version " VERSION; - x = (XSIZE-SFont_TextWidth(g_font,text))/2 + sin(fadetimer/4.5)*10; - SFont_Write(surf_screen,g_font,x,YSIZE-50 + sin(fadetimer/2)*5,text); + x = (XSIZE-font_width(text))/2 + sin(fadetimer/4.5)*10; + font_write(x,YSIZE-50 + sin(fadetimer/2)*5,text); } void draw(void) { SDL_FillRect(surf_screen,NULL,0); // black background - drawdots(surf_screen); // background dots + draw_dots(surf_screen); // background dots draw_sprite(SPRITE(&ship)); draw_rocks(); @@ -519,17 +566,6 @@ draw(void) { case HIGH_SCORE_ENTRY: play_tune(TUNE_HIGH_SCORE_ENTRY); - if(!process_score_input()) { // done inputting name - - // Change state to briefly show high scores page - state = HIGH_SCORE_DISPLAY; - state_timeout = 200; - - // Write the high score table to the file - write_high_score_table(); - - play_tune(TUNE_TITLE_PAGE); - } // FALL THROUGH TO case HIGH_SCORE_DISPLAY: // Display de list o high scores mon. @@ -542,11 +578,6 @@ draw(void) { collisions(); - ms_frame = SDL_GetTicks() - ms_end; - ms_end += ms_frame; - t_frame = opt_gamespeed * ms_frame / 50; - if(state == GAMEPLAY) score += ms_frame; - // Update the surface SDL_Flip(surf_screen); } @@ -555,8 +586,6 @@ static inline void kill_ship(Sprite *ship) { ship->flags = MOVE; - // ship->flags = MOVE|DRAW; // FADE SHIP - // SDL_SetAlpha(ship->image, SDL_SRCALPHA, 0); // FADE SHIP bang = true; } @@ -580,71 +609,114 @@ init_score_entry(void) insert_score(score); } +// Count down the state timer, and change state when it gets to zero or less; +void +update_state(float ticks) +{ + state_timeout -= ticks*3; + if(state_timeout > 0) return; + + switch(state) { + case DEAD_PAUSE: + // Restore the ship and continue playing + ship.flags = DRAW|MOVE|COLLIDE; + state = GAMEPLAY; + play_tune(TUNE_GAMEPLAY); + break; + case GAME_OVER: + if(new_high_score(score)) init_score_entry(); + else { + state = HIGH_SCORE_DISPLAY; + state_timeout = 400; + } + break; + case HIGH_SCORE_DISPLAY: + state = TITLE_PAGE; + state_timeout = 600.0; + fadetimer = 0.0; + break; + case HIGH_SCORE_ENTRY: + break; + case TITLE_PAGE: + state = HIGH_SCORE_DISPLAY; + state_timeout = 200.0; + break; + case GAMEPLAY: + ; // no action necessary + } +} + void gameloop() { - Uint8 *keystate = SDL_GetKeyState(NULL); + SDL_Event e; + Uint8 *keystate; float tmp; - for(;;) { - SDL_PumpEvents(); - keystate = SDL_GetKeyState(NULL); - - if(!paused) { - // Count down the game loop timer, and change state when it gets to zero or less; - - if((state_timeout -= t_frame*3) < 0) { - switch(state) { - case DEAD_PAUSE: - // Restore the ship and continue playing - ship.flags = DRAW|MOVE|COLLIDE; - state = GAMEPLAY; - play_tune(TUNE_GAMEPLAY); - break; - case GAME_OVER: - if(new_high_score(score)) init_score_entry(); - else { + ms_frame = SDL_GetTicks() - ms_end; + ms_end += ms_frame; + if(ms_frame > 1000) { + ms_frame = 1000; + } + t_frame = opt_gamespeed * ms_frame / 50; + frames++; + + while(SDL_PollEvent(&e)) { + switch(e.type) { + case SDL_QUIT: return; + case SDL_KEYDOWN: + if(state == HIGH_SCORE_ENTRY) { + if(!process_score_input(&e.key.keysym)) { + // Write the high score table to the file + write_high_score_table(); + // continue to display the scores briefly state = HIGH_SCORE_DISPLAY; - state_timeout = 400; + state_timeout = 200; + play_tune(TUNE_TITLE_PAGE); } - break; - case HIGH_SCORE_DISPLAY: - state = TITLE_PAGE; - state_timeout = 600.0; - fadetimer = 0.0; - break; - case HIGH_SCORE_ENTRY: - break; - case TITLE_PAGE: - state = HIGH_SCORE_DISPLAY; - state_timeout = 200.0; - break; - case GAMEPLAY: - ; // no action necessary - } - } else { - if(state == DEAD_PAUSE) { - float blast_radius; - // float alpha; // FADE SHIP - if(state_timeout >= DEAD_PAUSE_LENGTH - 20.0) { - blast_radius = BLAST_RADIUS * (DEAD_PAUSE_LENGTH - state_timeout) / 20.0; - blast_rocks(bangx, bangy, blast_radius); + } else if(e.key.keysym.sym == SDLK_q) { + return; } - if(bangx < 60) bangx = 60; + if(e.key.keysym.sym == SDLK_ESCAPE) { + return; + } + break; + } + } + keystate = SDL_GetKeyState(NULL); - // FADE SHIP - // alpha = 255.0 * (DEAD_PAUSE_LENGTH - state_timeout) / DEAD_PAUSE_LENGTH; - // SDL_SetAlpha(ship.image, SDL_SRCALPHA, (uint8_t)alpha); + if(state == GAMEPLAY) { + if(!paused) { + score += ms_frame; + + if(keystate[SDLK_LEFT] || keystate[SDLK_h]) { ship.dx -= THRUSTER_STRENGTH*t_frame; ship.jets |= 1<<0;} + if(keystate[SDLK_DOWN] || keystate[SDLK_t]) { ship.dy += THRUSTER_STRENGTH*t_frame; ship.jets |= 1<<1;} + if(keystate[SDLK_RIGHT] || keystate[SDLK_n]) { ship.dx += THRUSTER_STRENGTH*t_frame; ship.jets |= 1<<2;} + if(keystate[SDLK_UP] || keystate[SDLK_c]) { ship.dy -= THRUSTER_STRENGTH*t_frame; ship.jets |= 1<<3;} + if(keystate[SDLK_3]) { SDL_SaveBMP(surf_screen, "snapshot.bmp"); } + } + + if(keystate[SDLK_p] | keystate[SDLK_s]) { + if(!pausedown) { + paused = !paused; + pausedown = 1; + if(!paused) ms_end = SDL_GetTicks(); } + } else { + pausedown = 0; } + } + + if(!paused) { + update_state(t_frame); - new_rocks(); + if(state == DEAD_PAUSE && bangx < 60) bangx = 60; // SCROLLING - tmp = (ship.y+ship.dy*t_frame-YSCROLLTO)/25 + (ship.dy-screendy); + tmp = (ship.y+ship.h/2+ship.dy*t_frame-YSCROLLTO)/25 + (ship.dy-screendy); screendy += tmp * t_frame/12; - tmp = (ship.x+ship.dx*t_frame-XSCROLLTO)/25 + (ship.dx-screendx); + tmp = (ship.x+ship.w/2+ship.dx*t_frame-XSCROLLTO)/25 + (ship.dx-screendx); screendx += tmp * t_frame/12; // taper off so we don't hit the barrier abruptly. // (if we would hit in < 2 seconds, adjust to 2 seconds). @@ -657,8 +729,10 @@ gameloop() { bangx += (bangdx - screendx)*t_frame; bangy += (bangdy - screendy)*t_frame; - move_sprites(); - + move_sprites(t_frame); + move_engine_dots(t_frame); + move_bang_dots(t_frame); + move_dust(t_frame); // BOUNCE off left or right edge of screen if(ship.x < 0 || ship.x+ship.w > XSIZE) { @@ -672,6 +746,9 @@ gameloop() { ship.dy = screendy - (ship.dy-screendy)*opt_bounciness; } + new_rocks(t_frame); + new_engine_dots(t_frame); + draw(); if(state == GAMEPLAY && bang) { @@ -697,20 +774,20 @@ gameloop() { } // new game - if((keystate[SDLK_SPACE] || keystate[SDLK_e] || keystate[SDLK_n]) + if((keystate[SDLK_SPACE] || keystate[SDLK_1] || keystate[SDLK_2]) && (state == HIGH_SCORE_DISPLAY || state == TITLE_PAGE || state == GAME_OVER)) { if(state == GAME_OVER && new_high_score(score)) init_score_entry(); else { - if((keystate[SDLK_SPACE] && !initial_rocks) || keystate[SDLK_n]) { + if((keystate[SDLK_SPACE] && !initial_rocks) || keystate[SDLK_2]) { g_easy = 0; initial_rocks = NORMAL_I_ROCKS; final_rocks = NORMAL_F_ROCKS; if(opt_gamespeed == EASY_GAMESPEED) opt_gamespeed = NORMAL_GAMESPEED; - } else if(keystate[SDLK_e]) { + } else if(keystate[SDLK_1]) { g_easy = 1; initial_rocks = EASY_I_ROCKS; final_rocks = EASY_F_ROCKS; @@ -720,11 +797,10 @@ gameloop() { reset_rocks(); screendx = SCREENDXMIN; screendy = 0; - ship.x = XSIZE/2.2; ship.y = YSIZE/2; + ship.x = XSIZE/2.2; ship.y = YSIZE/2 - ship.w/2; ship.dx = screendx; ship.dy = screendy; ship.lives = 4; ship.flags = MOVE|DRAW|COLLIDE; - // SDL_SetAlpha(ship.image, SDL_SRCALPHA, SDL_ALPHA_OPAQUE); // FADE SHIP add_sprite(SPRITE(&ship)); score = 0; @@ -737,48 +813,27 @@ gameloop() { ship.jets = 0; } - if(state == GAMEPLAY) { - if(!paused) { - if(keystate[SDLK_LEFT] | keystate[SDLK_h]) { ship.dx -= 1.5*t_frame; ship.jets |= 1<<0;} - if(keystate[SDLK_DOWN] | keystate[SDLK_t]) { ship.dy += 1.5*t_frame; ship.jets |= 1<<1;} - if(keystate[SDLK_RIGHT] | keystate[SDLK_n]) { ship.dx += 1.5*t_frame; ship.jets |= 1<<2;} - if(keystate[SDLK_UP] | keystate[SDLK_c]) { ship.dy -= 1.5*t_frame; ship.jets |= 1<<3;} - if(keystate[SDLK_3]) { SDL_SaveBMP(surf_screen, "snapshot.bmp"); } - } - - if(keystate[SDLK_p] | keystate[SDLK_s]) { - if(!pausedown) { - paused = !paused; - pausedown = 1; - if(!paused) ms_end = SDL_GetTicks(); - } - } else { - pausedown = 0; - } - } - if(state == TITLE_PAGE && keystate[SDLK_h]) { state = HIGH_SCORE_DISPLAY; state_timeout = 400; } - - if(state != HIGH_SCORE_ENTRY && (keystate[SDLK_q] || keystate[SDLK_ESCAPE])) - return; - } } int main(int argc, char **argv) { - init_opts(); - argp_parse(&argp, argc, argv, 0, 0, 0); + if(!parse_opts(argc, argv)) return 1; if(init()) { - printf ("ta: '%s'\n",initerror); + printf ("vor: SDL error: '%s'\n",initerror); return 1; } + start = SDL_GetTicks(); + frames = 0; gameloop(); + end = SDL_GetTicks(); + // printf("%ld frames in %ld ms, %.2f fps.\n", frames, end-start, frames * 1000.0 / (end-start)); return 0; }