JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
made bang dots hit rocks, removed blast_rocks function.
[vor.git] / sprite.h
index 939de08..3cb2c0e 100644 (file)
--- a/sprite.h
+++ b/sprite.h
-#ifndef VOR_SHAPE_H
-#define VOR_SHAPE_H
+#ifndef VOR_SPRITE_H
+#define VOR_SPRITE_H
 
 #include <SDL.h>
 #include <inttypes.h>
 
-typedef union sprite Sprite;
+typedef struct sprite Sprite;
 
+#define SPRITE(x) ((Sprite *) (x))
 
-// Shape stuff
+#define BASE 0
+#define SHIP 1
+#define ROCK 2
+#define N_TYPES 3
 
-struct shape {
+struct sprite {
+       int8_t type;
+       int8_t flags;
+       Sprite *next;
+       float x, y;
+       float dx, dy;
+       SDL_Surface *image;
        int w, h;
-       int mw; // mask width (number of uint32's)
+       int mask_w;
        uint32_t *mask;
        uint32_t area;
 };
 
-void get_shape(SDL_Surface *img, struct shape *s);
-int collide(Sprite *r, Sprite *s);
-int pixel_collide(unsigned int xdiff, unsigned int ydiff, struct shape *r);
+#define MOVE 1
+#define DRAW 2
+#define COLLIDE 4
 
+#define COLLIDES(sprite) ((sprite)->flags & COLLIDE)
 
+Sprite *free_sprites[N_TYPES];  // lists of free sprites, by type.
 
-// Sprite stuff
+void do_collision(Sprite *a, Sprite *b);
+void collisions(void);
 
-#define SPRITE(x) ((Sprite *) (x))
+void init_sprites(void);
+void reset_sprites(void);
+void add_sprite(Sprite *s);
+void move_sprite(Sprite *s);
+void move_sprites(void);
 
-struct base_sprite {
-       uint8_t type;
-       Sprite *next;
+Sprite *collides(Sprite *s);
+Sprite * pixel_collides(float x, float y);
+void load_sprite(Sprite *sprite, char *filename);
+
+float sprite_mass(Sprite *s);
+void bounce(Sprite *a, Sprite *b);
+
+
+// extended sprites
+
+struct ship {
+       // core sprite fields
+       int8_t sprite_type;
+       int8_t flags;
+       struct ship *next;
        float x, y;
        float dx, dy;
        SDL_Surface *image;
-       struct shape *shape;
+       int w, h;
+       int mask_w;
+       uint32_t *mask;
+       uint32_t area;
+       // SHIP extras
+       int lives;
+       int jets;
 };
 
 struct rock {
        // core sprite fields
-       uint8_t sprite_type;
-       Sprite *next;
+       int8_t sprite_type;
+       int8_t flags;
+       struct rock *next;
        float x, y;
        float dx, dy;
        SDL_Surface *image;
-       struct shape *shape;
+       int w, h;
+       int mask_w;
+       uint32_t *mask;
+       uint32_t area;
        // ROCK extras
        int type;
 };
 
-struct ship {
-       // core sprite fields
-       uint8_t sprite_type;
-       Sprite *next;
-       float x, y;
-       float dx, dy;
-       SDL_Surface *image;
-       struct shape *shape;
-       // SHIP extras
-       int lives;
-       int jets;
-};
 
-union sprite {
-       uint8_t type;
-       struct base_sprite sprite;
-       struct rock rock;
-       struct ship ship;
-};
 
-#define BASE_SPRITE 0
-#define SHIP_SPRITE 1
-#define ROCK_SPRITE 2
+static inline void
+insert_sprite(Sprite **head, Sprite *s)
+{
+       s->next = *head;
+       *head = s;
+}
 
-SDL_Surface *load_image(char *filename);
-void load_sprite(Sprite *sprite, char *filename);
 
-#endif // VOR_SHAPE_H
+static inline Sprite *
+remove_sprite(Sprite **head)
+{
+       Sprite *s = *head;
+       *head = s->next;
+       return s;
+}
+
+
+static inline void
+draw_sprite(Sprite *s)
+{
+       SDL_Rect dest;
+       if(s->flags & DRAW) {
+               dest.x = s->x; dest.y = s->y;
+               SDL_BlitSurface(s->image, NULL, surf_screen, &dest);
+       }
+}
+
+#endif // VOR_SPRITE_H