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:
Sun Jun 09 19:34:56 2013 +0000
Revision:
10:bfa1c307c99d
Parent:
0:5fa232ee5fdf
Child:
11:2ddaf46e95cb
Changed how levels are represented so that dynamic allocation of memory is used. Maple version couldn't do this. Still only 2 levels. Use EnemyFactory whenever creating or destroying enemies.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardE 0:5fa232ee5fdf 1 /*
RichardE 0:5fa232ee5fdf 2 * SOURCE FILE : LevelCollection.cpp
RichardE 0:5fa232ee5fdf 3 *
RichardE 0:5fa232ee5fdf 4 * Definition of class LevelCollection.
RichardE 0:5fa232ee5fdf 5 *
RichardE 0:5fa232ee5fdf 6 */
RichardE 0:5fa232ee5fdf 7
RichardE 0:5fa232ee5fdf 8 #include <stdio.h>
RichardE 0:5fa232ee5fdf 9 #include "LevelCollection.h"
RichardE 0:5fa232ee5fdf 10 #include "Level0.h"
RichardE 10:bfa1c307c99d 11 #include "LevelNormal.h"
RichardE 10:bfa1c307c99d 12 #include "LevelDescriptor.h"
RichardE 0:5fa232ee5fdf 13
RichardE 0:5fa232ee5fdf 14 /***************/
RichardE 0:5fa232ee5fdf 15 /* CONSTRUCTOR */
RichardE 0:5fa232ee5fdf 16 /***************/
RichardE 0:5fa232ee5fdf 17 LevelCollection::LevelCollection() {
RichardE 0:5fa232ee5fdf 18 }
RichardE 0:5fa232ee5fdf 19
RichardE 0:5fa232ee5fdf 20 /**************/
RichardE 0:5fa232ee5fdf 21 /* DESTRUCTOR */
RichardE 0:5fa232ee5fdf 22 /**************/
RichardE 0:5fa232ee5fdf 23 LevelCollection::~LevelCollection() {
RichardE 0:5fa232ee5fdf 24 }
RichardE 0:5fa232ee5fdf 25
RichardE 0:5fa232ee5fdf 26 #define LEVELCOUNT 3
RichardE 0:5fa232ee5fdf 27
RichardE 0:5fa232ee5fdf 28 /************************/
RichardE 0:5fa232ee5fdf 29 /* GET NUMBER OF LEVELS */
RichardE 0:5fa232ee5fdf 30 /************************/
RichardE 0:5fa232ee5fdf 31 UInt8 LevelCollection::GetLevelCount( void ) const {
RichardE 0:5fa232ee5fdf 32 return LEVELCOUNT;
RichardE 0:5fa232ee5fdf 33 }
RichardE 0:5fa232ee5fdf 34
RichardE 10:bfa1c307c99d 35 // Level 0 which is NOT dynamically allocated.
RichardE 10:bfa1c307c99d 36 // Not a real level. This is attract mode.
RichardE 10:bfa1c307c99d 37 static Level0 level0;
RichardE 0:5fa232ee5fdf 38
RichardE 10:bfa1c307c99d 39 // Level descriptors.
RichardE 10:bfa1c307c99d 40 static const UInt8 ld0[] = { ENDDESCRIPTOR };
RichardE 10:bfa1c307c99d 41 static const UInt8 ld1[] = { Grunt, 5, Crusher, 5, ENDDESCRIPTOR };
RichardE 10:bfa1c307c99d 42 static const UInt8 ld2[] = { Grunt, 10, Brain, 2, ENDDESCRIPTOR };
RichardE 10:bfa1c307c99d 43
RichardE 10:bfa1c307c99d 44 // Array pointing to level data for each level.
RichardE 10:bfa1c307c99d 45 static const UInt8* const levelDescriptors[ LEVELCOUNT ] = {
RichardE 10:bfa1c307c99d 46 ld0,
RichardE 10:bfa1c307c99d 47 ld1,
RichardE 10:bfa1c307c99d 48 ld2,
RichardE 0:5fa232ee5fdf 49 };
RichardE 0:5fa232ee5fdf 50
RichardE 0:5fa232ee5fdf 51 /***************/
RichardE 0:5fa232ee5fdf 52 /* GET A LEVEL */
RichardE 0:5fa232ee5fdf 53 /***************/
RichardE 0:5fa232ee5fdf 54 // Pass level number in levelNumber.
RichardE 0:5fa232ee5fdf 55 // Returns pointer to level or NULL if no such level.
RichardE 0:5fa232ee5fdf 56 Level *LevelCollection::GetLevel( UInt8 levelNumber ) {
RichardE 0:5fa232ee5fdf 57 if( levelNumber >= LEVELCOUNT ) {
RichardE 10:bfa1c307c99d 58 // Level number out of range.
RichardE 0:5fa232ee5fdf 59 return (Level*)NULL;
RichardE 0:5fa232ee5fdf 60 }
RichardE 10:bfa1c307c99d 61 else if( levelNumber == 0 ) {
RichardE 10:bfa1c307c99d 62 // Level zero is the attract mode and is not dynamically allocated.
RichardE 10:bfa1c307c99d 63 return &level0;
RichardE 10:bfa1c307c99d 64 }
RichardE 0:5fa232ee5fdf 65 else {
RichardE 10:bfa1c307c99d 66 // Fetch level descriptor for this level and create a Level from it.
RichardE 10:bfa1c307c99d 67 Level *level = new LevelNormal( levelDescriptors[ levelNumber ] );
RichardE 10:bfa1c307c99d 68 // Tag it with the correct level number before returning it.
RichardE 0:5fa232ee5fdf 69 level->LevelNumber = levelNumber;
RichardE 0:5fa232ee5fdf 70 return level;
RichardE 0:5fa232ee5fdf 71 }
RichardE 0:5fa232ee5fdf 72 }
RichardE 0:5fa232ee5fdf 73
RichardE 10:bfa1c307c99d 74 /*******************************/
RichardE 10:bfa1c307c99d 75 /* FREE MEMORY USED BY A LEVEL */
RichardE 10:bfa1c307c99d 76 /*******************************/
RichardE 10:bfa1c307c99d 77 // Pass pointer to a level.
RichardE 10:bfa1c307c99d 78 // Frees memory used by level.
RichardE 10:bfa1c307c99d 79 void LevelCollection::FreeLevel( Level *level ) {
RichardE 10:bfa1c307c99d 80 if( ( level != (Level*)NULL ) && level->IsDynamicallyAllocated ) {
RichardE 10:bfa1c307c99d 81 delete level;
RichardE 10:bfa1c307c99d 82 }
RichardE 10:bfa1c307c99d 83 }