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
LevelCollection.cpp@10:bfa1c307c99d, 2013-06-09 (annotated)
- 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?
User | Revision | Line number | New 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 | } |