exit(1);
}
- SDL_LockSurface(s->image);
+ if(SDL_MUSTLOCK(s->image)) { SDL_LockSurface(s->image); }
px = s->image->pixels;
transp = s->image->format->colorkey;
p = s->mask;
}
px = (uint16_t *) ((uint8_t *) px + s->image->pitch - 2*s->image->w);
}
- SDL_UnlockSurface(s->image);
+ if(SDL_MUSTLOCK(s->image)) { SDL_UnlockSurface(s->image); }
}
load_sprites();
grid_size = grid_size * 3 / 2;
- gw = (XSIZE-1 + 2*grid_size) / grid_size;
- gh = (YSIZE-1 + 2*grid_size) / grid_size;
+ gw = (XSIZE + 2*grid_size) / grid_size; // -grid-size to XSIZE inclusive (so sprites can be just off either edge)
+ gh = (YSIZE + 2*grid_size) / grid_size;
sprites[0] = malloc(2 * gw * gh * sizeof(Sprite *));
sprites[1] = (void *)sprites[0] + gw * gh * sizeof(Sprite *);
square(int x, int y, int set)
{
int b = (x+grid_size)/grid_size + gw*((y+grid_size)/grid_size);
+ if(b >= gw*gh || b < 0) {
+ fprintf(stderr, "square(%i, %i, %i) = %i\n", x, y, set, b);
+ ((int*)0)[0] = 0;
+ }
return &sprites[set][b];
}
}
void
-move_sprite(Sprite *s, float ticks)
+move_sprite(Sprite *s)
{
if(s->flags & MOVE) {
- s->x += (s->dx - screendx)*ticks;
- s->y += (s->dy - screendy)*ticks;
+ s->x += (s->dx - screendx)*t_frame;
+ s->y += (s->dy - screendy)*t_frame;
}
}
}
void
-move_sprites(float ticks)
+move_sprites(void)
{
int sq;
Sprite **head;
head=&sprites[set][sq];
while(*head) {
Sprite *s = remove_sprite(head);
- move_sprite(s, ticks); sort_sprite(s);
+ move_sprite(s); sort_sprite(s);
}
}
set = 1-set; // switch to other set of sprites.
}
+// xov: number of bits of overlap
+// bit: number of bits in from the left edge of amask where bmask is
static int
line_collide(int xov, unsigned bit, uint32_t *amask, uint32_t *bmask)
{
return false;
}
+// xov: number of bits/pixels of horizontal overlap
+// yov: number of bits/pixels of vertical overlap
static int
mask_collide(int xov, int yov, Sprite *a, Sprite *b)
{
bmask = b->mask;
} else {
yov = -yov;
- amask = a->mask;
- bmask = b->mask + ((b->h - yov) * b->mask_w) + word;
+ amask = a->mask + word;
+ bmask = b->mask + ((b->h - yov) * b->mask_w);
}
for(y=0; y<yov; y++) {
}
}
-Sprite *
-hit_in_square(Sprite *r, Sprite *s)
-{
- for(; r; r=r->next)
- if(collide(r, s)) break;
- return r;
-}
-
-Sprite *
-collides(Sprite *s)
-{
- int l, r, t, b;
- Sprite **sq;
- Sprite *c;
-
- l = (s->x + grid_size) / grid_size;
- r = (s->x + s->w + grid_size) / grid_size;
- t = (s->y + grid_size) / grid_size;
- b = (s->y + s->h + grid_size) / grid_size;
- sq = &sprites[set][l + t*gw];
-
- if((c = hit_in_square(*sq, s))) return c;
- if(l > 0 && (c = hit_in_square(*(sq-1), s))) return c;
- if(t > 0 && (c = hit_in_square(*(sq-gw), s))) return c;
- if(l > 0 && t > 0 && (c = hit_in_square(*(sq-1-gw), s))) return c;
-
- if(r > l) {
- if((c = hit_in_square(*(sq+1), s))) return c;
- if(t > 0 && hit_in_square(*(sq+1-gw), s)) return c;
- }
- if(b > t) {
- if((c = hit_in_square(*(sq+gw), s))) return c;
- if(l > 0 && (c = hit_in_square(*(sq-1+gw), s))) return c;
- }
- if(r > l && b > t && (c = hit_in_square(*(sq+1+gw), s))) return c;
- return NULL;
-}
-
int
pixel_collide(Sprite *s, int x, int y)
{