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;
if(r) {
bounce(r, SPRITE(&ship));
}
+ collisions();
}
ms_frame = SDL_GetTicks() - ms_end;
return bang;
}
+void
+do_collision(Sprite *a, Sprite *b)
+{
+ bounce(a, b);
+}
+
int
gameloop() {
Uint8 *keystate = SDL_GetKeyState(NULL);
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();
}
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;
{
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;
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)
{
}
-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;
}
#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 {
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);