#ifndef OBJECT_H #define OBJECT_H #include #include #include "../util/rectangle/rectangle.h" #include "types/asteroid/asteroid.h" #include "types/astronaut/astronaut.h" #include "types/background/background.h" #include "types/spaceship/spaceship.h" #include "types/bullet/bullet.h" #include "types/heart/heart.h" #include "prototype.h" // Objects (they could have been called GameObjects) have a simple // hierarchy. A prototype/flyweight motivated system is used. // Each type has some common data and methods which are stored // in their respective prototype. // This module provides us with the methods to easily and mostly // transparently access an object's prototype. typedef union { struct _background_t background; struct _spaceship_t spaceship; struct _astronaut_t astronaut; struct _asteroid_t asteroid; struct _bullet_t bullet; struct _heart_t heart; } object_specific_data_t; struct _object_t { Prototype const* prototype; Vec2 position; object_specific_data_t as; }; // Set the prototype of the holder and initialize all the holder's // vale to zero. Return the freshly updated holder Object* createObject(Prototype const* prototype, Object* holder); // Call the tick function referenced in the object's prototype // on the object itself // Object might react to the elapsed time. // Does nothing when called with NULL. void tickObject(Object* object, uint8_t previousFrameTime); // Call the draw function referenced in the object's prototype // on the object itself. // Does nothing when called with NULL. void drawObject(Object* object, Rectangle compositingWindow); // Find out the prototype of the object and return the size of that Vec2 getSize(Object const* object); Vec2 getSizeFromPrototype(Prototype const* prototype); // Move the position of the object by a vector void move(Object* object, Vec2 value); // Get a new rectangle from the objects position and its // prototype's size Rectangle getBoundingBox(Object const* object); #endif