X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=main.c;h=e2ae44e8b2662092a6e0ccf5b71e093935a5e00f;hp=0001c99ca08bc5fe8a3b652d903fbeaa3dd2c399;hb=100372ba9cc83542b9d9894001d70f40e28f8f4b;hpb=c7e7c5084a55503896d0ced9a5bf2ab079302adf diff --git a/main.c b/main.c index 0001c99..e2ae44e 100644 --- a/main.c +++ b/main.c @@ -75,6 +75,7 @@ float screendx = SCREENDXMIN, screendy = 0.0; float back_dist; // all movement is based on t_frame. +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) @@ -144,12 +145,12 @@ new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s) int row_inc; double theta, r; - n = 24.0 * t_frame; + 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); } for(i=0; ipixels; @@ -164,8 +165,8 @@ new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s) bdot[bd2].dy = 45*r*sin(theta) + dy; bdot[bd2].x = x + xbang; bdot[bd2].y = y + ybang; - bdot[bd2].c = (i < n-3) ? 0 : c; - 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; @@ -176,7 +177,7 @@ new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s) } } - SDL_UnlockSurface(s); + if(SDL_MUSTLOCK(s)) { SDL_UnlockSurface(s); } } void @@ -189,7 +190,7 @@ move_bang_dots(float ticks) if(!bdot[i].active) continue; // decrement life and maybe kill - bdot[i].life -= bdot[i].decay; + bdot[i].life -= bdot[i].decay * ticks/2.0; if(bdot[i].life < 0) { bdot[i].active = 0; continue; } // move and clip @@ -233,8 +234,8 @@ draw_bang_dots(SDL_Surface *s) void -new_engine_dots(float time_span, int dir) { - int i; +new_engine_dots(float time_span) { + int dir, i; int n = time_span * ENGINE_DOTS_PER_TIC; float a, r; // angle, random length float dx, dy; @@ -246,50 +247,54 @@ new_engine_dots(float time_span, int dir) { hx = ship.image->w / 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; - - // 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); - } + 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); + } - // move the dot as though it were created in the past - dotptr->x += (dotptr->dx - screendx) * time; - dotptr->y += (dotptr->dy - screendy) * time; + // 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; + if(dotptr - edot < MAXENGINEDOTS-1) dotptr++; + else dotptr = edot; + } } } } @@ -307,6 +312,7 @@ move_engine_dots(float ticks) { edot[i].life -= t_frame*3; if(edot[i].life < 0 || edot[i].x<0 || edot[i].x >= XSIZE || edot[i].y < 0 || edot[i].y >= YSIZE) { edot[i].active = 0; + continue; } // check collisions @@ -340,20 +346,11 @@ draw_engine_dots(SDL_Surface *s) { void draw_dots(SDL_Surface *s) { - int m; - - // Create engine dots - for(m = 0; m<4; m++) { - if(ship.jets & 1<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)) { @@ -522,17 +519,17 @@ 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]; @@ -575,11 +572,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); } @@ -611,14 +603,55 @@ 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() { SDL_Event e; Uint8 *keystate; float tmp; - for(;;) { + ms_frame = SDL_GetTicks() - ms_end; + ms_end += ms_frame; + t_frame = opt_gamespeed * ms_frame / 50; + frames++; + while(SDL_PollEvent(&e)) { switch(e.type) { case SDL_QUIT: return; @@ -642,43 +675,32 @@ gameloop() { } 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 { - 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 + 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 { - if(state == DEAD_PAUSE) { - if(bangx < 60) bangx = 60; - } + pausedown = 0; } + } + + if(!paused) { + update_state(t_frame); + + if(state == DEAD_PAUSE && bangx < 60) bangx = 60; // SCROLLING tmp = (ship.y+ship.h/2+ship.dy*t_frame-YSCROLLTO)/25 + (ship.dy-screendy); @@ -714,6 +736,7 @@ gameloop() { } new_rocks(t_frame); + new_engine_dots(t_frame); draw(); @@ -779,27 +802,6 @@ gameloop() { ship.jets = 0; } - if(state == GAMEPLAY) { - if(!paused) { - // FIXME why is this at the bottom? Shouldn't it be up before the ship movement? - 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(state == TITLE_PAGE && keystate[SDLK_h]) { state = HIGH_SCORE_DISPLAY; state_timeout = 400; @@ -812,11 +814,15 @@ main(int argc, char **argv) { 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; }