JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
renamed *_SPRITE to *, made rocks bounce off each other.
authorJoshua Grams <josh@qualdan.com>
Thu, 23 Mar 2006 22:44:21 +0000 (22:44 +0000)
committerJoshua Grams <josh@qualdan.com>
Thu, 23 Mar 2006 22:44:21 +0000 (22:44 +0000)
main.c
rocks.c
sprite.c
sprite.h

diff --git a/main.c b/main.c
index b075f0d..880f14e 100644 (file)
--- 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 (file)
--- a/rocks.c
+++ b/rocks.c
@@ -45,13 +45,13 @@ load_rocks(void)
        for(i=0; i<NROCKS; i++) {
                snprintf(a, ROCK_LEN, "sprites/rock%02d.png", i);
                load_sprite(SPRITE(&prototypes[i]), a);
-               prototypes[i].sprite_type = ROCK_SPRITE;
+               prototypes[i].sprite_type = ROCK;
        }
 
        memset(rocks, 0, MAXROCKS*sizeof(struct rock));
 
        for(i=1; i<MAXROCKS; i++) rocks[i].next = &rocks[i-1];
-       free_sprites[ROCK_SPRITE] = SPRITE(&rocks[MAXROCKS-1]);
+       free_sprites[ROCK] = SPRITE(&rocks[MAXROCKS-1]);
 
        reset_rocks();
 }
@@ -150,8 +150,8 @@ new_rocks(void)
        for(i=0; i<4; i++) {
                while(rtimers[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;
index 0a6ab87..1905510 100644 (file)
--- 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; i<gw*gh; i++)
+               for(a=sprites[set][i]; a; a=a->next)
+                       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;
 }
 
index e1216cf..0c04cac 100644 (file)
--- 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);