From: Joshua Grams Date: Thu, 23 Mar 2006 22:44:21 +0000 (+0000) Subject: renamed *_SPRITE to *, made rocks bounce off each other. X-Git-Tag: 0.4~21 X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=commitdiff_plain;h=e9eaa65259d7c35d5a9b08aba9016145fa8f118d renamed *_SPRITE to *, made rocks bounce off each other. --- diff --git a/main.c b/main.c index b075f0d..880f14e 100644 --- a/main.c +++ b/main.c @@ -66,7 +66,7 @@ struct bangdots bdot[MAXBANGDOTS], *bdotptr = bdot; char topline[1024]; char *initerror = ""; -struct ship ship = { SHIP_SPRITE, NULL, XSIZE/2, YSIZE/2, SCREENDXMIN, 0.0 }; +struct ship ship = { SHIP, NULL, XSIZE/2, YSIZE/2, SCREENDXMIN, 0.0 }; float screendx = SCREENDXMIN, screendy = 0.0; float xscroll, yscroll; @@ -514,6 +514,7 @@ draw() { if(r) { bounce(r, SPRITE(&ship)); } + collisions(); } ms_frame = SDL_GetTicks() - ms_end; @@ -535,6 +536,12 @@ draw() { return bang; } +void +do_collision(Sprite *a, Sprite *b) +{ + bounce(a, b); +} + int gameloop() { Uint8 *keystate = SDL_GetKeyState(NULL); diff --git a/rocks.c b/rocks.c index 89efb6e..2ab0fa1 100644 --- a/rocks.c +++ b/rocks.c @@ -45,13 +45,13 @@ load_rocks(void) for(i=0; i= 1) { rtimers[i] -= 1; - if(!free_sprites[ROCK_SPRITE]) return; // sorry, we ran out of rocks! - r = (struct rock *) remove_sprite(&free_sprites[ROCK_SPRITE]); + if(!free_sprites[ROCK]) return; // sorry, we ran out of rocks! + r = (struct rock *) remove_sprite(&free_sprites[ROCK]); type = urnd() % NROCKS; *r = prototypes[type]; r->type = type; diff --git a/sprite.c b/sprite.c index 0a6ab87..1905510 100644 --- a/sprite.c +++ b/sprite.c @@ -198,6 +198,8 @@ collide(Sprite *a, Sprite *b) { int dx, dy, xov, yov; + if(a->type < 0 || b->type < 0) return false; + if(b->x < a->x) { Sprite *tmp = a; a = b; b = tmp; } dx = b->x - a->x; @@ -212,6 +214,17 @@ collide(Sprite *a, Sprite *b) else return mask_collide(xov, yov, a, b); } +void +collisions(void) +{ + int i; + Sprite *a, *b; + for(i=0; inext) + for(b=a->next; b; b=b->next) + if(collide(a, b)) do_collision(a, b); +} + Sprite * hit_in_square(Sprite *r, Sprite *s) { @@ -287,11 +300,11 @@ pixel_collides(float x, float y) } -float +static float sprite_mass(Sprite *s) { - if(s->type == SHIP_SPRITE) return s->area; - else if(s->type == ROCK_SPRITE) return 3*s->area; + if(s->type == SHIP) return s->area; + else if(s->type == ROCK) return 3*s->area; else return 0; } diff --git a/sprite.h b/sprite.h index e1216cf..0c04cac 100644 --- a/sprite.h +++ b/sprite.h @@ -8,9 +8,9 @@ typedef struct sprite Sprite; #define SPRITE(x) ((Sprite *) (x)) -#define BASE_SPRITE 0 -#define SHIP_SPRITE 1 -#define ROCK_SPRITE 2 +#define BASE 0 +#define SHIP 1 +#define ROCK 2 #define N_TYPES 3 struct sprite { @@ -27,6 +27,9 @@ struct sprite { Sprite *free_sprites[N_TYPES]; // lists of free sprites, by type. +void do_collision(Sprite *a, Sprite *b); +void collisions(void); + void init_sprites(void); void add_sprite(Sprite *s); void move_sprite(Sprite *s);