X-Git-Url: https://jasonwoof.com/gitweb/?p=vor.git;a=blobdiff_plain;f=sprite.c;h=923e967eff1f6cf2d17a8df6829fc5ec10ae4ed5;hp=447e4827525329005a673f07b098d5115227d902;hb=HEAD;hpb=9a9572d121946fef90a24ea5514a0c3ca33b1ae5 diff --git a/sprite.c b/sprite.c index 447e482..923e967 100644 --- a/sprite.c +++ b/sprite.c @@ -1,7 +1,7 @@ #include #include #include -#include "config.h" +#include "vorconfig.h" #include "common.h" #include "globals.h" #include "sprite.h" @@ -48,7 +48,7 @@ get_shape(Sprite *s) 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; @@ -62,7 +62,7 @@ get_shape(Sprite *s) } 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); } } @@ -88,8 +88,8 @@ init_sprites(void) 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 *); @@ -105,6 +105,10 @@ static inline 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]; } @@ -165,6 +169,8 @@ move_sprites(void) } +// 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) { @@ -182,6 +188,8 @@ 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) { @@ -195,8 +203,8 @@ 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; ynext) - 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) {