-#ifndef VOR_SHAPE_H
-#define VOR_SHAPE_H
+#ifndef VOR_SPRITE_H
+#define VOR_SPRITE_H
-#include <SDL/SDL.h>
+#include <SDL.h>
#include <inttypes.h>
+typedef struct sprite Sprite;
-// Shape stuff
+#define SPRITE(x) ((Sprite *) (x))
+
+#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(int xdiff, int ydiff, struct shape *r, struct shape *s);
-int pixel_collide(unsigned int xoff, unsigned int yoff, struct shape *r);
+// flags
+#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);
-typedef union sprite Sprite;
+void init_sprites(void);
+void reset_sprites(void);
+void add_sprite(Sprite *s);
+void move_sprite(Sprite *s);
+void move_sprites(void);
-#define SPRITE(x) ((Sprite *) (x))
+Sprite * pixel_collides(float x, float y);
+void load_sprite(Sprite *sprite, char *filename);
-struct base_sprite {
- uint8_t type;
- Sprite *next;
+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;
+}
+
+
+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_SHAPE_H
+#endif // VOR_SPRITE_H