JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
now deleting dots which hit rocks.
authorJoshua Grams <josh@qualdan.com>
Sun, 10 Jul 2005 22:27:01 +0000 (22:27 +0000)
committerJoshua Grams <josh@qualdan.com>
Sun, 10 Jul 2005 22:27:01 +0000 (22:27 +0000)
main.c
rocks.c
rocks.h
shape.c
shape.h

diff --git a/main.c b/main.c
index 258ecd3..8d131be 100644 (file)
--- a/main.c
+++ b/main.c
@@ -153,6 +153,7 @@ new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s)
                                if(c && c != colorkey) {
                                        theta = frnd()*M_PI*2;
                                        r = frnd(); r = 1 - r*r;
                                if(c && c != colorkey) {
                                        theta = frnd()*M_PI*2;
                                        r = frnd(); r = 1 - r*r;
+                                       // r = 1 - frnd()*frnd();
 
                                        bdot[bd2].dx = 45*r*cos(theta) + dx;
                                        bdot[bd2].dy = 45*r*sin(theta) + dy;
 
                                        bdot[bd2].dx = 45*r*cos(theta) + dx;
                                        bdot[bd2].dy = 45*r*sin(theta) + dy;
@@ -178,74 +179,39 @@ new_bang_dots(int xbang, int ybang, int dx, int dy, SDL_Surface *s)
 }
 
 void
 }
 
 void
-draw_bang_dots(SDL_Surface *s) {
+draw_bang_dots(SDL_Surface *s)
+{
        int i;
        int first_i, last_i;
        int i;
        int first_i, last_i;
-       Uint16 *rawpixel;
-       rawpixel = (Uint16 *) s->pixels;
+       uint16_t *pixels, *pixel, c;
+       int row_inc = s->pitch/sizeof(uint16_t);
 
 
+       pixels = (uint16_t *) s->pixels;
        first_i = -1;
        last_i = 0;
 
        first_i = -1;
        last_i = 0;
 
-       for(i = bd1; (bd1 <= bd2)?(i<bd2):(i >= bd1 && i < bd2); last_i = ++i) {
-
-               i %= MAXBANGDOTS;
+       for(i=0; i<MAXBANGDOTS; i++) {
+               if(!bdot[i].active) continue;
 
 
-               if(bdot[i].x <= 0 || bdot[i].x >= XSIZE || bdot[i].y <= 0 || bdot[i].y >= YSIZE) {
-                       // If the dot has drifted outside the perimeter, kill it
+               // If the dot has drifted outside the screen, kill it
+               if(bdot[i].x < 0 || bdot[i].x >= XSIZE || bdot[i].y < 0 || bdot[i].y >= YSIZE) {
                        bdot[i].active = 0;
                        bdot[i].active = 0;
+                       continue;
                }
                }
-
-               if(bdot[i].active) {
-                       if(first_i < 0)
-                       first_i = i;
-                       rawpixel[(int)(s->pitch/2*(int)(bdot[i].y)) + (int)(bdot[i].x)] = bdot[i].c ? bdot[i].c : heatcolor[(int)(bdot[i].life*3)];
-                       bdot[i].life -= bdot[i].decay;
-                       bdot[i].x += bdot[i].dx*t_frame - xscroll;
-                       bdot[i].y += bdot[i].dy*t_frame - yscroll;
-
-                       if(bdot[i].life<0) bdot[i].active = 0;
-               }
-       }
-
-       if(first_i >= 0) {
-               bd1 = first_i;
-               bd2 = last_i;
-       }
-       else {
-               bd1 = 0;
-               bd2 = 0;
+               if(pixel_hit_rocks(bdot[i].x, bdot[i].y)) { bdot[i].active = 0; continue; }
+               pixel = pixels + row_inc*(int)(bdot[i].y) + (int)(bdot[i].x);
+               if(bdot[i].c) c = bdot[i].c; else c = heatcolor[(int)(bdot[i].life)*3];
+               *pixel = c;
+               bdot[i].life -= bdot[i].decay;
+               bdot[i].x += bdot[i].dx*t_frame - xscroll;
+               bdot[i].y += bdot[i].dy*t_frame - yscroll;
+
+               if(bdot[i].life<0) bdot[i].active = 0;
        }
        }
-
 }
 
 
 void
 }
 
 
 void
-draw_engine_dots(SDL_Surface *s) {
-       int i;
-       Uint16 *rawpixel;
-       rawpixel = (Uint16 *) s->pixels;
-
-       for(i = 0; i<MAXENGINEDOTS; i++) {
-               if(edot[i].active) {
-                       edot[i].x += edot[i].dx*t_frame - xscroll;
-                       edot[i].y += edot[i].dy*t_frame - yscroll;
-                       edot[i].life -= t_frame*3;
-                       if(edot[i].life < 0
-                                       || edot[i].y<0 || edot[i].y >= YSIZE
-                                       || edot[i].x<0 || edot[i].x >= XSIZE) {
-                               edot[i].active = 0;
-                       } else {
-                               int heatindex;
-                               heatindex = edot[i].life * 6;
-                               //rawpixel[(int)(s->pitch/2*(int)(edot[i].y)) + (int)(edot[i].x)] = lifecolor[(int)(edot[i].life)];
-                               rawpixel[(int)(s->pitch/2*(int)(edot[i].y)) + (int)(edot[i].x)] = heatindex>3*W ? heatcolor[3*W-1] : heatcolor[heatindex];
-                       }
-               }
-       }
-}
-
-void
 new_engine_dots(int n, int dir) {
        int i;
        float a, r;  // angle, random length
 new_engine_dots(int n, int dir) {
        int i;
        float a, r;  // angle, random length
@@ -283,6 +249,32 @@ new_engine_dots(int n, int dir) {
 }
 
 void
 }
 
 void
+draw_engine_dots(SDL_Surface *s) {
+       int i;
+       uint16_t c;
+       uint16_t *pixels = (uint16_t *) s->pixels;
+       int row_inc = s->pitch/sizeof(uint16_t);
+       int heatindex;
+
+       for(i = 0; i<MAXENGINEDOTS; i++) {
+               if(!edot[i].active) continue;
+               edot[i].x += edot[i].dx*t_frame - xscroll;
+               edot[i].y += edot[i].dy*t_frame - yscroll;
+               edot[i].life -= t_frame*3;
+               if(edot[i].life < 0
+                               || edot[i].x<0 || edot[i].x >= XSIZE
+                               || edot[i].y<0 || edot[i].y >= YSIZE) {
+                       edot[i].active = 0;
+                       continue;
+               }
+               if(pixel_hit_rocks(edot[i].x, edot[i].y)) { edot[i].active = 0; continue; }
+               heatindex = edot[i].life * 6;
+               c = heatindex>3*W ? heatcolor[3*W-1] : heatcolor[heatindex];
+               pixels[row_inc*(int)(edot[i].y) + (int)(edot[i].x)] = c;
+       }
+}
+
+void
 drawdots(SDL_Surface *s) {
        int m;
 
 drawdots(SDL_Surface *s) {
        int m;
 
diff --git a/rocks.c b/rocks.c
index e7f2161..bee1ca5 100644 (file)
--- a/rocks.c
+++ b/rocks.c
@@ -261,6 +261,22 @@ hit_rocks(float x, float y, struct shape *shape)
        return 0;
 }
 
        return 0;
 }
 
+int
+pixel_hit_rocks(float x, float y)
+{
+       int i;
+       float xoff, yoff;
+
+       for(i=0; i<MAXROCKS; i++) {
+               if(rock[i].active) {
+                       xoff = x - rock[i].x; if(xoff < 0) continue;
+                       yoff = y - rock[i].y; if(yoff < 0) continue;
+                       if(pixel_collide(xoff, yoff, rock[i].shape)) return 1;
+               }
+       }
+       return 0;
+}
+
 void
 blast_rocks(float x, float y, float radius, int onlyslow)
 {
 void
 blast_rocks(float x, float y, float radius, int onlyslow)
 {
diff --git a/rocks.h b/rocks.h
index e6a6274..52c8cab 100644 (file)
--- a/rocks.h
+++ b/rocks.h
@@ -8,4 +8,6 @@ void move_rocks(void);
 void draw_rocks(void);
 
 int hit_rocks(float x, float y, struct shape *shape);
 void draw_rocks(void);
 
 int hit_rocks(float x, float y, struct shape *shape);
+int pixel_hit_rocks(float x, float y);
+
 void blast_rocks(float x, float y, float radius, int onlyslow);
 void blast_rocks(float x, float y, float radius, int onlyslow);
diff --git a/shape.c b/shape.c
index f457158..5aa7fb7 100644 (file)
--- a/shape.c
+++ b/shape.c
@@ -108,3 +108,14 @@ collide(int xdiff, int ydiff, struct shape *r, struct shape *s)
        if(xov == 0 || yov == 0) return 0;  // bboxes hit?
        else return mask_collide(xov, yov, r, s);
 }
        if(xov == 0 || yov == 0) return 0;  // bboxes hit?
        else return mask_collide(xov, yov, r, s);
 }
+
+int
+pixel_collide(unsigned int xoff, unsigned int yoff, struct shape *r)
+{
+       uint32_t pmask;
+       
+       if(xoff >= r->w || yoff >= r->h) return 0;
+
+       pmask = 1 << (xoff & 31); xoff >>= 5;
+       return r->mask[yoff*r->mw + xoff] & pmask;
+}
diff --git a/shape.h b/shape.h
index 26b3b63..9f7371d 100644 (file)
--- a/shape.h
+++ b/shape.h
@@ -13,5 +13,6 @@ struct shape {
 
 void get_shape(SDL_Surface *img, struct shape *s);
 int collide(int xdiff, int ydiff, struct shape *r, struct shape *s);
 
 void get_shape(SDL_Surface *img, struct shape *s);
 int collide(int xdiff, int ydiff, struct shape *r, struct shape *s);
+int pixel_collide(unsigned int xoff, unsigned int yoff, struct shape *r);
 
 #endif // VOR_SHAPE_H
 
 #endif // VOR_SHAPE_H