X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=main.c;h=e636cd3a19390e916edd7845886164c7aa4f5f58;hp=6b575bd61f9093c066a90cc6e9be6bf2df7826c5;hb=04a50f75c62ca742bed40524cc242b605e68ace6;hpb=0179e60b6196d115000cb77fcd4cc880eecb177f diff --git a/main.c b/main.c index 6b575bd..e636cd3 100644 --- a/main.c +++ b/main.c @@ -53,8 +53,10 @@ SDL_Surface *surf_b_over, // Title element "over" *surf_ship, // Spaceship element *surf_life, // Indicator of number of ships remaining + *surf_speed, // Speed indicator *surf_rock[NROCKS], // THE ROCKS *surf_font_big; // The big font + SFont_Font *g_font; @@ -68,13 +70,18 @@ char topline[1024]; char *initerror = ""; struct shape shipshape; -float shipx = 320.0, shipy = 240.0; // X position, 0..XSIZE -float shipdx,shipdy; // Change in X position per tick. +float shipx = XSIZE/2, shipy = YSIZE/2; // X position, 0..XSIZE +float shipdx = 8, shipdy = 0; // Change in X position per tick. float screendx = 7.5, screendy = 0.0; float xscroll, yscroll; float gamerate; // this controls the speed of everything that moves. -int nships,score,initticks,ticks_since_last, last_ticks; +float bangx, bangy, bangdx, bangdy; + +float game_dist, avg_speed, cur_speed; +uint16_t avg_speed_w, cur_speed_w; // [0, 74] + +int nships,score,game_ticks,ticks_since_last,last_ticks; int gameover; int maneuver = 0; int sound_flag, music_flag; @@ -132,8 +139,8 @@ init_space_dots() { for(i = 0; iformat, b, b, b); } } @@ -203,6 +210,7 @@ draw_bang_dots(SDL_Surface *s) { rawpixel = (Uint16 *) s->pixels; first_i = -1; + last_i = 0; for(i = bd1; (bd1 <= bd2)?(i= bd1 && i < bd2); last_i = ++i) { @@ -250,8 +258,8 @@ draw_space_dots(SDL_Surface *s) { sdot[i].y = 0; } rawpixel[(int)(s->pitch/2*(int)sdot[i].y) + (int)(sdot[i].x)] = sdot[i].color; - sdot[i].x -= xscroll / (1 + sdot[i].z); - sdot[i].y -= yscroll / (1 + sdot[i].z); + sdot[i].x -= xscroll / (1.3 + sdot[i].z); + sdot[i].y -= yscroll / (1.3 + sdot[i].z); if(sdot[i].y >= XSIZE) sdot[i].x -= XSIZE; else if(sdot[i].x < 0) sdot[i].x = XSIZE-1; if(sdot[i].y > YSIZE) sdot[i].y -= YSIZE; @@ -467,6 +475,9 @@ init(int fullscreen) { NULLERROR(temp = IMG_Load(add_path("indicators/life.png"))); NULLERROR(surf_life = SDL_DisplayFormat(temp)); + NULLERROR(temp = IMG_Load(add_path("indicators/speed.png"))); + NULLERROR(surf_speed = SDL_DisplayFormat(temp)); + init_engine_dots(); init_space_dots(); @@ -483,18 +494,13 @@ init(int fullscreen) { int draw() { int i; - SDL_Rect src,dest; + SDL_Rect src, dest; int bang, x; char *text; float fadegame,fadeover; bang = 0; - src.x = 0; - src.y = 0; - dest.x = 0; - dest.y = 0; - // Draw a fully black background SDL_FillRect(surf_screen,NULL,0); @@ -503,13 +509,9 @@ draw() { // Draw ship if(!gameover && state == GAMEPLAY ) { - src.w = surf_ship->w; - src.h = surf_ship->h; - dest.w = src.w; - dest.h = src.h; - dest.x = (int)shipx; - dest.y = (int)shipy; - SDL_BlitSurface(surf_ship,&src,surf_screen,&dest); + dest.x = shipx; + dest.y = shipy; + SDL_BlitSurface(surf_ship,NULL,surf_screen,&dest); } draw_rocks(); @@ -517,13 +519,34 @@ draw() { // Draw the life indicators. if(state == GAMEPLAY || state == DEAD_PAUSE || state == GAME_OVER) for(i = 0; iw; - src.h = surf_life->h; - dest.w = src.w; - dest.h = src.h; - dest.x = (i + 1)*(src.w + 10); + dest.x = (i + 1)*(surf_life->w + 10); dest.y = 20; - SDL_BlitSurface(surf_life, &src, surf_screen, &dest); + SDL_BlitSurface(surf_life, NULL, surf_screen, &dest); + } + + if(state == GAMEPLAY) { + // Update speeds. + cur_speed = shipdx; + if(shipdx < 0) cur_speed = 0; + if(shipdx > 20) cur_speed = 20; + game_dist += cur_speed*ticks_since_last; + game_ticks += ticks_since_last; + if(game_ticks < 2*1000) avg_speed = cur_speed; + else avg_speed = game_dist/game_ticks; + //printf("avg=%.2f, cur=%.2f. shipdx=%.2f\n", avg_speed, cur_speed, shipdx); + avg_speed_w = 2 + 64*avg_speed/20; + cur_speed_w = 2 + 64*cur_speed/20; + } + + if(state == GAMEPLAY || state == DEAD_PAUSE) { + // Draw the speed indicators. + src.x = 0; src.y = 0; + src.h = surf_speed->h; + dest.x = 240; + src.w = avg_speed_w; dest.y = 10; + SDL_BlitSurface(surf_speed, &src, surf_screen, &dest); + src.w = cur_speed_w; dest.y = 20; + SDL_BlitSurface(surf_speed, &src, surf_screen, &dest); } // Draw the score @@ -547,53 +570,33 @@ draw() { fadeover = 1.0; } - src.w = surf_b_game->w; - src.h = surf_b_game->h; - dest.w = src.w; - dest.h = src.h; - dest.x = (XSIZE-src.w)/2; - dest.y = (YSIZE-src.h)/2-40; + 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)(fadegame*(200 + 55*cos(fadetimer += gamerate/1.0)))); - SDL_BlitSurface(surf_b_game,&src,surf_screen,&dest); - - src.w = surf_b_over->w; - src.h = surf_b_over->h; - dest.w = src.w; - dest.h = src.h; - dest.x = (XSIZE-src.w)/2; - dest.y = (YSIZE-src.h)/2 + 40; + 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)(fadeover*(200 + 55*sin(fadetimer)))); - SDL_BlitSurface(surf_b_over,&src,surf_screen,&dest); + SDL_BlitSurface(surf_b_over,NULL,surf_screen,&dest); break; case TITLE_PAGE: - src.w = surf_b_variations->w; - src.h = surf_b_variations->h; - dest.w = src.w; - dest.h = src.h; - dest.x = (XSIZE-src.w)/2 + cos(fadetimer/6.5)*10; - dest.y = (YSIZE/2-src.h)/2 + sin(fadetimer/5.0)*10; + 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 += gamerate/2.0))); - SDL_BlitSurface(surf_b_variations,&src,surf_screen,&dest); - - src.w = surf_b_on->w; - src.h = surf_b_on->h; - dest.w = src.w; - dest.h = src.h; - dest.x = (XSIZE-src.w)/2 + cos((fadetimer + 1.0)/6.5)*10; - dest.y = (YSIZE/2-src.h)/2 + surf_b_variations->h + 20 + sin((fadetimer + 1.0)/5.0)*10; + 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_BlitSurface(surf_b_on,&src,surf_screen,&dest); - - src.w = surf_b_rockdodger->w; - src.h = surf_b_rockdodger->h; - dest.w = src.w; - dest.h = src.h; - dest.x = (XSIZE-src.w)/2 + cos((fadetimer + 2.0)/6.5)*10; - dest.y = (YSIZE/2-src.h)/2 + surf_b_variations->h + surf_b_on->h + 40 + sin((fadetimer + 2.0)/5)*10; + 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_BlitSurface(surf_b_rockdodger,&src,surf_screen,&dest); + SDL_BlitSurface(surf_b_rockdodger,NULL,surf_screen,&dest); text = "Version " VERSION; x = (XSIZE-SFont_TextWidth(g_font,text))/2 + sin(fadetimer/4.5)*10; @@ -668,7 +671,6 @@ gameloop() { // Create a new ship and start all over again state = GAMEPLAY; play_tune(1); - shipx -= 50; break; case GAME_OVER: state = HIGH_SCORE_ENTRY; @@ -711,9 +713,9 @@ gameloop() { blast_radius = BLAST_RADIUS * (DEAD_PAUSE_LENGTH - state_timeout) / 20.0; fixonly = 0; } - blast_rocks(shipx, shipy, blast_radius, fixonly); + blast_rocks(bangx, bangy, blast_radius, fixonly); - if(shipx < 60) shipx = 60; + if(bangx < 60) bangx = 60; } } @@ -725,27 +727,31 @@ gameloop() { shipdy *= pow((double)0.9,(double)gamerate); } + // INERTIA + shipx += shipdx*gamerate; + shipy += shipdy*gamerate; + // SCROLLING tmp = shipy - (YSIZE / 2); tmp += shipdy * 25; tmp /= -25; tmp = ((screendy * (gamerate - 12)) + (tmp * gamerate)) / 12; screendy = -tmp; - if(state == GAMEPLAY) { - tmp = shipx - (XSIZE / 2); - tmp += shipdx * 25; - tmp /= -25; - tmp = ((screendx * (gamerate - 12)) + (tmp * gamerate)) / 12; - screendx = -tmp; - } else screendx = 7.5; + tmp = shipx - (XSIZE / 3); + tmp += shipdx * 25; + tmp /= -25; + tmp = ((screendx * (gamerate - 12)) + (tmp * gamerate)) / 12; + screendx = -tmp; xscroll = screendx * gamerate; yscroll = screendy * gamerate; + shipx -= xscroll; + shipy -= yscroll; + + // move bang center + bangx += bangdx*gamerate - xscroll; + bangy += bangdy*gamerate - yscroll; - // INERTIA - shipx += shipdx*gamerate - xscroll; - shipy += shipdy*gamerate - yscroll; - move_rocks(); @@ -765,14 +771,15 @@ gameloop() { if(draw() && state == GAMEPLAY) { - // Play the explosion sound - play_sound(0); + // Died + play_sound(0); // Play the explosion sound + bangx = shipx; bangy = shipy; bangdx = shipdx; bangdy = shipdy; make_bang_dots(shipx,shipy,shipdx,shipdy,surf_ship,30); - shipdx = screendx; - shipdy = 0; + shipdx *= 0.5; shipdy *= 0.5; if(--nships <= 0) { - gameover = 1; state = GAME_OVER; + gameover = 1; + shipdx = 8; shipdy = 0; state_timeout = 200.0; fadetimer = 0.0; faderate = gamerate; @@ -786,10 +793,14 @@ gameloop() { SDL_PumpEvents(); keystate = SDL_GetKeyState(NULL); + // new game if(keystate[SDLK_SPACE] && (state == HIGH_SCORE_DISPLAY || state == TITLE_PAGE)) { reset_rocks(); + game_ticks = 0; + game_dist = 0; + nships = 4; score = 0; @@ -797,10 +808,8 @@ gameloop() { play_tune(1); gameover = 0; - shipx = 2*XSIZE/3; - shipy = YSIZE/2; - shipdx = screendx; - shipdy = 0; + shipx = XSIZE/2.2; shipy = YSIZE/2; + shipdx = screendx; shipdy = screendy; } maneuver = 0; @@ -893,7 +902,6 @@ main(int argc, char **argv) { } reset_rocks(); - initticks = SDL_GetTicks(); gameloop(); return 0;