Version of Robotron arcade game using LPC1768, a Gameduino shield, a serial EEPROM (for high scores), two microswitch joysticks and two buttons plus a box to put it in. 20 levels of mayhem.

Dependencies:   25LCxxx_SPI CommonTypes Gameduino mbed

Committer:
RichardE
Date:
Mon Jun 17 15:10:43 2013 +0000
Revision:
18:70190f956a24
Parent:
8:82d88f9381f3
Improved response to button 1 when entering high scores (HighScoreEntry.cpp).

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardE 4:673eb9735d44 1 /*
RichardE 4:673eb9735d44 2 * SOURCE FILE : GameObject.h
RichardE 4:673eb9735d44 3 *
RichardE 4:673eb9735d44 4 * The abstract base class for all graphical game objects.
RichardE 4:673eb9735d44 5 *
RichardE 4:673eb9735d44 6 */
RichardE 4:673eb9735d44 7
RichardE 4:673eb9735d44 8 #ifndef GameObjectIncluded
RichardE 4:673eb9735d44 9
RichardE 4:673eb9735d44 10 #define GameObjectIncluded
RichardE 4:673eb9735d44 11
RichardE 4:673eb9735d44 12 #include "Gameduino.h" // Gameduino stuff
RichardE 4:673eb9735d44 13 #include "Types.h"
RichardE 4:673eb9735d44 14 #include "GDConst.h"
RichardE 4:673eb9735d44 15 #include "SpriteImageId.h"
RichardE 4:673eb9735d44 16 #include "SpriteGroup.h"
RichardE 4:673eb9735d44 17 #include "GameObjectTypes.h"
RichardE 4:673eb9735d44 18 #include "Rectangle.h"
RichardE 4:673eb9735d44 19
RichardE 4:673eb9735d44 20 class GameObject {
RichardE 4:673eb9735d44 21
RichardE 4:673eb9735d44 22 public :
RichardE 4:673eb9735d44 23
RichardE 4:673eb9735d44 24 // Bitmasks to use with RestrictionFlags.
RichardE 4:673eb9735d44 25 enum RestrictionMask {
RichardE 4:673eb9735d44 26 UpRestriction = 1,
RichardE 4:673eb9735d44 27 DownRestriction = 2,
RichardE 4:673eb9735d44 28 LeftRestriction = 4,
RichardE 4:673eb9735d44 29 RightRestriction = 8,
RichardE 4:673eb9735d44 30 };
RichardE 4:673eb9735d44 31
RichardE 4:673eb9735d44 32 // X coordinate (NOT pixel coordinate).
RichardE 4:673eb9735d44 33 Int16 Xco;
RichardE 4:673eb9735d44 34
RichardE 4:673eb9735d44 35 // Y coordinate (NOT pixel coordinate).
RichardE 4:673eb9735d44 36 Int16 Yco;
RichardE 4:673eb9735d44 37
RichardE 4:673eb9735d44 38 // Pixel width.
RichardE 4:673eb9735d44 39 UInt8 PixelWidth;
RichardE 4:673eb9735d44 40
RichardE 4:673eb9735d44 41 // Pixel height.
RichardE 4:673eb9735d44 42 UInt8 PixelHeight;
RichardE 4:673eb9735d44 43
RichardE 4:673eb9735d44 44 // Visibility flag.
RichardE 4:673eb9735d44 45 bool Visible;
RichardE 4:673eb9735d44 46
RichardE 4:673eb9735d44 47 // Limits for object movement.
RichardE 4:673eb9735d44 48 Rectangle *Bounds;
RichardE 4:673eb9735d44 49
RichardE 4:673eb9735d44 50 // Indicates if movement is restricted.
RichardE 4:673eb9735d44 51 bool MovementRestricted;
RichardE 4:673eb9735d44 52
RichardE 4:673eb9735d44 53 // Indicates object should be deleted when moves outside restricted area.
RichardE 4:673eb9735d44 54 bool DeleteWhenRestricted;
RichardE 4:673eb9735d44 55
RichardE 4:673eb9735d44 56 // Flags which are set when object is being restricted.
RichardE 4:673eb9735d44 57 // Only works when MovementRestricted is true.
RichardE 4:673eb9735d44 58 // If MovementRestricted is false RestrictionFlags are always all zero.
RichardE 4:673eb9735d44 59 // Use RestrictionMask enumeration with this field.
RichardE 4:673eb9735d44 60 UInt8 RestrictionFlags;
RichardE 4:673eb9735d44 61
RichardE 4:673eb9735d44 62 // Indicates which Gameduino sprite is being used for this object.
RichardE 4:673eb9735d44 63 UInt8 SpriteNumber;
RichardE 4:673eb9735d44 64
RichardE 5:0b0651ac7832 65 // Determines if object is retained on a level restart.
RichardE 5:0b0651ac7832 66 // Most enemy objects are retained on a level restart, although their positions change.
RichardE 5:0b0651ac7832 67 // However, enemy bullets (for example) are killed off on a level restart.
RichardE 5:0b0651ac7832 68 bool RetainOnLevelRestart;
RichardE 4:673eb9735d44 69
RichardE 4:673eb9735d44 70 /***************/
RichardE 4:673eb9735d44 71 /* CONSTRUCTOR */
RichardE 4:673eb9735d44 72 /***************/
RichardE 4:673eb9735d44 73 GameObject() :
RichardE 4:673eb9735d44 74 Xco( FromPixel( 100 ) ),
RichardE 4:673eb9735d44 75 Yco( FromPixel( 100 ) ),
RichardE 4:673eb9735d44 76 PixelWidth( SPRITE_PIXEL_WIDTH ),
RichardE 4:673eb9735d44 77 PixelHeight( SPRITE_PIXEL_HEIGHT ),
RichardE 4:673eb9735d44 78 Visible( true ),
RichardE 4:673eb9735d44 79 Bounds( NULL ),
RichardE 4:673eb9735d44 80 MovementRestricted( true ),
RichardE 4:673eb9735d44 81 DeleteWhenRestricted( false ),
RichardE 4:673eb9735d44 82 RestrictionFlags( 0 ),
RichardE 4:673eb9735d44 83 SpriteNumber( 0 ),
RichardE 5:0b0651ac7832 84 RetainOnLevelRestart( true )
RichardE 4:673eb9735d44 85 {
RichardE 4:673eb9735d44 86 }
RichardE 4:673eb9735d44 87
RichardE 4:673eb9735d44 88 /**************/
RichardE 4:673eb9735d44 89 /* DESTRUCTOR */
RichardE 4:673eb9735d44 90 /**************/
RichardE 4:673eb9735d44 91 // Must be virtual!
RichardE 4:673eb9735d44 92 // If not then could end up calling the base class
RichardE 4:673eb9735d44 93 // destructor for a derived class. Not pretty.
RichardE 4:673eb9735d44 94 virtual ~GameObject() {
RichardE 4:673eb9735d44 95 }
RichardE 4:673eb9735d44 96
RichardE 4:673eb9735d44 97 /************************/
RichardE 4:673eb9735d44 98 /* GET GAME OBJECT TYPE */
RichardE 4:673eb9735d44 99 /************************/
RichardE 4:673eb9735d44 100 // Returns type of game object.
RichardE 4:673eb9735d44 101 virtual GameObjectTypes GetType( void ) = 0;
RichardE 4:673eb9735d44 102
RichardE 4:673eb9735d44 103 // Note that coordinates for all game objects are NOT screen pixel coordinates.
RichardE 4:673eb9735d44 104 // The coordinate system used has a much higher resolution that the screen.
RichardE 4:673eb9735d44 105 // This allows objects to move at a speed of less than one pixel per screen update.
RichardE 4:673eb9735d44 106 // Use the methods ToPixel and FromPixel to convert between game object coordinates
RichardE 4:673eb9735d44 107 // and pixel coordinates.
RichardE 4:673eb9735d44 108
RichardE 4:673eb9735d44 109 /********************************/
RichardE 4:673eb9735d44 110 /* CONVERT TO PIXEL COORDINATES */
RichardE 4:673eb9735d44 111 /********************************/
RichardE 4:673eb9735d44 112 // Returns pixel equivalent of coordinate.
RichardE 4:673eb9735d44 113 static Int16 ToPixel( Int16 x ) {
RichardE 4:673eb9735d44 114 return ( x >> 6 );
RichardE 4:673eb9735d44 115 }
RichardE 4:673eb9735d44 116
RichardE 4:673eb9735d44 117 /**********************************/
RichardE 4:673eb9735d44 118 /* CONVERT FROM PIXEL COORDINATES */
RichardE 4:673eb9735d44 119 /**********************************/
RichardE 4:673eb9735d44 120 // Returns pixel equivalent of coordinate.
RichardE 4:673eb9735d44 121 static Int16 FromPixel( Int16 x ) {
RichardE 4:673eb9735d44 122 return ( x << 6 );
RichardE 4:673eb9735d44 123 }
RichardE 4:673eb9735d44 124
RichardE 4:673eb9735d44 125 /************************/
RichardE 4:673eb9735d44 126 /* MOVE THE GAME OBJECT */
RichardE 4:673eb9735d44 127 /************************/
RichardE 4:673eb9735d44 128 void Move( void ) {
RichardE 4:673eb9735d44 129 ProtectedMove();
RichardE 4:673eb9735d44 130 // Calculate coordinates for edges of object.
RichardE 4:673eb9735d44 131 Int16 dx = FromPixel( ( SPRITE_PIXEL_WIDTH - PixelWidth ) >> 1 );
RichardE 4:673eb9735d44 132 Int16 dy = FromPixel( ( SPRITE_PIXEL_HEIGHT - PixelHeight ) >> 1 );
RichardE 4:673eb9735d44 133 Int16 left = Xco + dx;
RichardE 4:673eb9735d44 134 Int16 top = Yco + dy;
RichardE 4:673eb9735d44 135 Int16 right = left + FromPixel( PixelWidth - 1 );
RichardE 4:673eb9735d44 136 Int16 bottom = top + FromPixel( PixelHeight - 1 );
RichardE 4:673eb9735d44 137 RestrictionFlags = 0;
RichardE 4:673eb9735d44 138 // Kill off or restrict movement if moved outside restricted area.
RichardE 4:673eb9735d44 139 // Do nothing if Bounds is NULL.
RichardE 4:673eb9735d44 140 if( Bounds != NULL ) {
RichardE 4:673eb9735d44 141 if( DeleteWhenRestricted ) {
RichardE 4:673eb9735d44 142 if(
RichardE 4:673eb9735d44 143 left < Bounds->X1 ||
RichardE 4:673eb9735d44 144 right > Bounds->X2 ||
RichardE 4:673eb9735d44 145 top < Bounds->Y1 ||
RichardE 4:673eb9735d44 146 bottom > Bounds->Y2
RichardE 4:673eb9735d44 147 ) {
RichardE 4:673eb9735d44 148 Visible = false;
RichardE 4:673eb9735d44 149 }
RichardE 4:673eb9735d44 150 }
RichardE 4:673eb9735d44 151 else if( MovementRestricted ) {
RichardE 4:673eb9735d44 152 if( left < Bounds->X1 ) {
RichardE 4:673eb9735d44 153 Xco = Bounds->X1 - dx;
RichardE 4:673eb9735d44 154 RestrictionFlags |= (UInt8)LeftRestriction;
RichardE 4:673eb9735d44 155 }
RichardE 4:673eb9735d44 156 else if( right > Bounds->X2 ) {
RichardE 4:673eb9735d44 157 Xco = Bounds->X2 - FromPixel( PixelWidth - 1 );
RichardE 4:673eb9735d44 158 RestrictionFlags |= (UInt8)RightRestriction;
RichardE 4:673eb9735d44 159 }
RichardE 4:673eb9735d44 160 if( top < Bounds->Y1 ) {
RichardE 4:673eb9735d44 161 Yco = Bounds->Y1 - dy;
RichardE 4:673eb9735d44 162 RestrictionFlags |= (UInt8)UpRestriction;
RichardE 4:673eb9735d44 163 }
RichardE 4:673eb9735d44 164 else if( bottom > Bounds->Y2 ) {
RichardE 4:673eb9735d44 165 Yco = Bounds->Y2 - FromPixel( PixelHeight - 1 );
RichardE 4:673eb9735d44 166 RestrictionFlags |= (UInt8)DownRestriction;
RichardE 4:673eb9735d44 167 }
RichardE 4:673eb9735d44 168 }
RichardE 4:673eb9735d44 169 }
RichardE 4:673eb9735d44 170 }
RichardE 4:673eb9735d44 171
RichardE 4:673eb9735d44 172 /************************/
RichardE 4:673eb9735d44 173 /* DRAW THE GAME OBJECT */
RichardE 4:673eb9735d44 174 /************************/
RichardE 5:0b0651ac7832 175 // Pass pointer to Gameduino to draw on in gd.
RichardE 4:673eb9735d44 176 // Note if Visible is false this should not draw anything
RichardE 4:673eb9735d44 177 // and/or hide the visible object.
RichardE 5:0b0651ac7832 178 virtual void Draw( Gameduino *gd ) = 0;
RichardE 4:673eb9735d44 179
RichardE 4:673eb9735d44 180 /**********************************/
RichardE 4:673eb9735d44 181 /* INITIALISE AN ARRAY OF OBJECTS */
RichardE 4:673eb9735d44 182 /**********************************/
RichardE 4:673eb9735d44 183 // Really only intended for the initialisation of enemy objects and humans.
RichardE 4:673eb9735d44 184 // Each object in the array is allocated a consecutive sprite number and is positioned
RichardE 4:673eb9735d44 185 // randomly in the arena. The objects movement is restricted to within the arena.
RichardE 4:673eb9735d44 186 // Pass pointer to array of pointers to GameObjects in objects.
RichardE 4:673eb9735d44 187 // Pass number of pointers in the array in objectCount.
RichardE 4:673eb9735d44 188 // Pass pointer to a sprite number in spriteNumber. This number is incremented by this method.
RichardE 4:673eb9735d44 189 static void InitialiseAll( GameObject **objects, UInt8 objectCount, UInt8 *spriteNumber );
RichardE 4:673eb9735d44 190
RichardE 4:673eb9735d44 191 /****************************/
RichardE 4:673eb9735d44 192 /* MOVE AN ARRAY OF OBJECTS */
RichardE 4:673eb9735d44 193 /****************************/
RichardE 4:673eb9735d44 194 // Pass pointer to array of pointers to GameObjects in objects.
RichardE 4:673eb9735d44 195 // Pass number of pointers in the array in objectCount.
RichardE 4:673eb9735d44 196 // Returns true if any non-null objects were found in the array.
RichardE 4:673eb9735d44 197 static bool MoveAll( GameObject **objects, UInt8 objectCount );
RichardE 4:673eb9735d44 198
RichardE 4:673eb9735d44 199 /****************************/
RichardE 4:673eb9735d44 200 /* DRAW AN ARRAY OF OBJECTS */
RichardE 4:673eb9735d44 201 /****************************/
RichardE 6:8bbdb70bc11c 202 // Pass pointer to Gameduino to draw on in gd.
RichardE 4:673eb9735d44 203 // Pass pointer to array of pointers to GameObjects in objects.
RichardE 4:673eb9735d44 204 // Pass number of pointers in the array in objectCount.
RichardE 6:8bbdb70bc11c 205 static void DrawAll( Gameduino *gd, GameObject **objects, UInt8 objectCount );
RichardE 4:673eb9735d44 206
RichardE 4:673eb9735d44 207 /************************************************/
RichardE 4:673eb9735d44 208 /* FIND AN UNUSED OBJECT IN AN ARRAY OF OBJECTS */
RichardE 4:673eb9735d44 209 /************************************************/
RichardE 4:673eb9735d44 210 // Pass pointer to array of pointers to GameObjects in objects.
RichardE 4:673eb9735d44 211 // Pass number of pointers in the array in objectCount.
RichardE 4:673eb9735d44 212 // Pass pointer to variable that will hold index of object found in index.
RichardE 4:673eb9735d44 213 // Returns true if an unused object was found, false if not.
RichardE 4:673eb9735d44 214 // An unused object is indicated by a null pointer in the array.
RichardE 4:673eb9735d44 215 static bool FindUnusedObject( GameObject **objects, UInt8 objectCount, UInt8 *index );
RichardE 4:673eb9735d44 216
RichardE 4:673eb9735d44 217 /****************************************************/
RichardE 4:673eb9735d44 218 /* FIND COLLISIONS WITH ALL THE OBJECTS IN AN ARRAY */
RichardE 4:673eb9735d44 219 /****************************************************/
RichardE 6:8bbdb70bc11c 220 // Pass pointer to Gameduino in gd parameter.
RichardE 4:673eb9735d44 221 // Pass pointer to array of pointers to GameObjects in objects.
RichardE 4:673eb9735d44 222 // Pass number of pointers in the array in objectCount.
RichardE 4:673eb9735d44 223 // Pass pointer to a function that takes two UInt8 parameters in func.
RichardE 4:673eb9735d44 224 // The first parameter is the index of the object in the objects array that hit something.
RichardE 4:673eb9735d44 225 // The second parameter is the sprite number of the sprite which it hit.
RichardE 8:82d88f9381f3 226 static void FindCollisions( Gameduino *gd, GameObject **objects, UInt8 objectCount, void (*func)( UInt8, UInt8 ) );
RichardE 4:673eb9735d44 227
RichardE 4:673eb9735d44 228 /*************************************************************************/
RichardE 4:673eb9735d44 229 /* FIND AN OBJECT WITH A PARTICULAR SPRITE NUMBER IN AN ARRAY OF OBJECTS */
RichardE 4:673eb9735d44 230 /*************************************************************************/
RichardE 4:673eb9735d44 231 // Pass pointer to array of pointers to GameObjects in objects.
RichardE 4:673eb9735d44 232 // Pass number of pointers in the array in objectCount.
RichardE 4:673eb9735d44 233 // Pass sprite number to look for in spriteNumber.
RichardE 4:673eb9735d44 234 // Index of object with given sprite number written to variable pointed to by index.
RichardE 4:673eb9735d44 235 // Returns true if sprite number was found, false if not.
RichardE 4:673eb9735d44 236 static bool FindSpriteNumber( GameObject **objects, UInt8 objectCount, UInt8 spriteNumber, UInt8 *index );
RichardE 4:673eb9735d44 237
RichardE 4:673eb9735d44 238 /**********************************************/
RichardE 4:673eb9735d44 239 /* FIND NEAREST OBJECT IN AN ARRAY OF OBJECTS */
RichardE 4:673eb9735d44 240 /**********************************************/
RichardE 4:673eb9735d44 241 // Pass pointer to array of pointers to GameObjects in objects.
RichardE 4:673eb9735d44 242 // Pass number of pointers in the array in objectCount.
RichardE 4:673eb9735d44 243 // Pass x and y coordinates of point you want to check.
RichardE 4:673eb9735d44 244 // Pass pointer to validation function in ValidFunc.
RichardE 4:673eb9735d44 245 // This is used to establish if a particular object is to be considered
RichardE 4:673eb9735d44 246 // when finding nearest object. It should return true if object should be considered
RichardE 4:673eb9735d44 247 // or false to ignore it. Pass NULL if all objects are considered valid.
RichardE 4:673eb9735d44 248 // Pass pointer to variable that will hold index of object found in index.
RichardE 4:673eb9735d44 249 // Returns true if nearest object was found, false if not (maybe no objects in array).
RichardE 4:673eb9735d44 250 static bool FindNearestObject(
RichardE 4:673eb9735d44 251 GameObject **objects, UInt8 objectCount,
RichardE 4:673eb9735d44 252 Int16 x, Int16 y,
RichardE 4:673eb9735d44 253 bool (*ValidFunc)( GameObject *object ),
RichardE 4:673eb9735d44 254 UInt8 *index
RichardE 4:673eb9735d44 255 );
RichardE 4:673eb9735d44 256
RichardE 4:673eb9735d44 257 /***************************************************************************/
RichardE 4:673eb9735d44 258 /* REMOVE ALL OBJECTS IN AN ARRAY THAT ARE NOT RETAINED ON A LEVEL RESTART */
RichardE 4:673eb9735d44 259 /***************************************************************************/
RichardE 4:673eb9735d44 260 // Pass pointer to array of pointers to GameObjects in objects.
RichardE 4:673eb9735d44 261 // Pass number of pointers in the array in objectCount.
RichardE 4:673eb9735d44 262 // All objects pointed to in the array that have their RetainOnLevelRestart property set
RichardE 4:673eb9735d44 263 // to false are removed by writing NULL into the array.
RichardE 4:673eb9735d44 264 static void RemoveUnretainedObjects( GameObject **objects, UInt8 objectCount );
RichardE 4:673eb9735d44 265
RichardE 4:673eb9735d44 266 /*******************************/
RichardE 4:673eb9735d44 267 /* MOVE TOWARDS ANOTHER OBJECT */
RichardE 4:673eb9735d44 268 /*******************************/
RichardE 4:673eb9735d44 269 // Pass object to move towards in object.
RichardE 4:673eb9735d44 270 // Pass speed at which to move in speed.
RichardE 4:673eb9735d44 271 void MoveTowards( GameObject *object, Int16 speed );
RichardE 4:673eb9735d44 272
RichardE 4:673eb9735d44 273 protected :
RichardE 4:673eb9735d44 274
RichardE 4:673eb9735d44 275 /************************/
RichardE 4:673eb9735d44 276 /* MOVE THE GAME OBJECT */
RichardE 4:673eb9735d44 277 /************************/
RichardE 4:673eb9735d44 278 virtual void ProtectedMove( void ) = 0;
RichardE 4:673eb9735d44 279
RichardE 4:673eb9735d44 280 private :
RichardE 4:673eb9735d44 281
RichardE 4:673eb9735d44 282 };
RichardE 4:673eb9735d44 283
RichardE 4:673eb9735d44 284 #endif
RichardE 4:673eb9735d44 285
RichardE 4:673eb9735d44 286 /* END of GameObject.h */
RichardE 4:673eb9735d44 287
RichardE 4:673eb9735d44 288