X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=main.c;h=ba1c8b7bd6421c71f35543fd8da979fa5eedda50;hp=e784d3ab4f8b17e4522e135f1f8067738cb94503;hb=ae2d57cc5b1b64621a76aed51ce14f4c555c3bc8;hpb=61c9964f01a09d4b48c27aca3a33fb744eb8e0e4 diff --git a/main.c b/main.c index e784d3a..ba1c8b7 100644 --- a/main.c +++ b/main.c @@ -75,7 +75,7 @@ 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) +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) @@ -138,19 +138,20 @@ init_engine_dots() { void new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s) { - int i, x, y; + int i, n, x, y; uint16_t *pixel, c; uint32_t colorkey; int row_inc; double theta, r; + n = 24.0 * t_frame; pixel = s->pixels; row_inc = s->pitch/sizeof(uint16_t) - s->w; colorkey = s->format->colorkey; SDL_LockSurface(s); - for(i=0; i<10; i++) { + for(i=0; ipixels; for(y=0; yh; y++) { for(x = 0; xw; x++) { @@ -163,14 +164,11 @@ 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 = 0; + bdot[bd2].c = (i < n-3) ? 0 : c; bdot[bd2].life = 100; bdot[bd2].decay = frnd()*3 + 1; bdot[bd2].active = 1; - // Replace the last few bang dots with the pixels from the exploding object - if(i>6) bdot[bd2].c = c; - bd2 = (bd2+1) % MAXBANGDOTS; } pixel += row_inc; @@ -182,28 +180,21 @@ new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *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); Sprite *hit; - pixels = (uint16_t *) s->pixels; - first_i = -1; - last_i = 0; - for(i=0; i= XSIZE || bdot[i].y < 0 || bdot[i].y >= YSIZE) { bdot[i].active = 0; continue; @@ -218,6 +209,21 @@ draw_bang_dots(SDL_Surface *s) 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; @@ -245,18 +254,40 @@ new_engine_dots(int n, int dir) { 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; + + // 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 = ship.dx + 2*dx; - dotptr->dy = ship.dy + 20*dy; + dotptr->dx = past_ship_dx + 2*dx; + dotptr->dy = past_ship_dy + 20*dy; dotptr->life = 60 * fabs(dy); } else { - dotptr->dx = ship.dx + 20*dx; - dotptr->dy = ship.dy + 2*dy; + 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; + if(dotptr - edot < MAXENGINEDOTS-1) dotptr++; else dotptr = edot; } @@ -264,25 +295,20 @@ new_engine_dots(int n, int dir) { } 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 || edot[i].y < 0 || edot[i].y >= YSIZE) { 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 @@ -292,6 +318,20 @@ draw_engine_dots(SDL_Surface *s) { continue; } } + } +} + +void +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; + + for(i = 0; i3*W ? heatcolor[3*W-1] : heatcolor[heatindex]; pixels[row_inc*(int)(edot[i].y) + (int)(edot[i].x)] = c; @@ -299,18 +339,16 @@ draw_engine_dots(SDL_Surface *s) { } void -drawdots(SDL_Surface *s) { +draw_dots(SDL_Surface *s) { int m; - // Create engine dots out the side we're moving from + // Create engine dots for(m = 0; m<4; m++) { if(ship.jets & 1< XSIZE) { @@ -675,6 +713,8 @@ gameloop() { ship.dy = screendy - (ship.dy-screendy)*opt_bounciness; } + new_rocks(t_frame); + draw(); if(state == GAMEPLAY && bang) { @@ -741,10 +781,11 @@ gameloop() { 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;} + // 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"); } }