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:
Tue Jun 11 21:04:48 2013 +0000
Revision:
14:46a353b2a8e8
Parent:
4:673eb9735d44
Child:
15:d8ea0c7b7e64
Started to modify how high scores are entered but not finished. Currently asks for a name when program first starts. Remove this code later.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RichardE 0:5fa232ee5fdf 1 /*
RichardE 0:5fa232ee5fdf 2 * SOURCE FILE : HighScoreEntry.cpp
RichardE 0:5fa232ee5fdf 3 *
RichardE 0:5fa232ee5fdf 4 * Definition of class HighScoreEntry.
RichardE 0:5fa232ee5fdf 5 * Routine to allow player to enter their name using joysticks.
RichardE 0:5fa232ee5fdf 6 *
RichardE 0:5fa232ee5fdf 7 */
RichardE 0:5fa232ee5fdf 8
RichardE 0:5fa232ee5fdf 9 #include "HighScoreEntry.h"
RichardE 0:5fa232ee5fdf 10 #include "Gameduino.h" // Gameduino stuff
RichardE 4:673eb9735d44 11 #include "GDExtra.h" // more Gameduino stuff
RichardE 4:673eb9735d44 12 #include "GDConst.h" // Gameduino constants
RichardE 4:673eb9735d44 13 #include "FrameCounter.h" // counter updated every vertical flyback
RichardE 4:673eb9735d44 14 #include "CharBlocks.h" // blocks of characters in program memory
RichardE 4:673eb9735d44 15 #include "CharFrame.h" // for drawing frames made of characters
RichardE 4:673eb9735d44 16 #include "CharCodes.h" // character codes
RichardE 0:5fa232ee5fdf 17
RichardE 0:5fa232ee5fdf 18 /***************/
RichardE 0:5fa232ee5fdf 19 /* CONSTRUCTOR */
RichardE 0:5fa232ee5fdf 20 /***************/
RichardE 0:5fa232ee5fdf 21 HighScoreEntry::HighScoreEntry() :
RichardE 0:5fa232ee5fdf 22 cursorPos( 0 )
RichardE 0:5fa232ee5fdf 23 {
RichardE 0:5fa232ee5fdf 24 }
RichardE 0:5fa232ee5fdf 25
RichardE 0:5fa232ee5fdf 26 /**************/
RichardE 0:5fa232ee5fdf 27 /* DESTRUCTOR */
RichardE 0:5fa232ee5fdf 28 /**************/
RichardE 0:5fa232ee5fdf 29 HighScoreEntry::~HighScoreEntry() {
RichardE 0:5fa232ee5fdf 30 }
RichardE 0:5fa232ee5fdf 31
RichardE 0:5fa232ee5fdf 32 /*********************/
RichardE 0:5fa232ee5fdf 33 /* GET A PLAYER NAME */
RichardE 0:5fa232ee5fdf 34 /*********************/
RichardE 0:5fa232ee5fdf 35 // Pass pointer to place to store name in name.
RichardE 0:5fa232ee5fdf 36 // Pass pointer to controls to read in controls.
RichardE 4:673eb9735d44 37 // Pass pointer to Gameduino to display on in gd.
RichardE 4:673eb9735d44 38 void HighScoreEntry::GetName( PlayerName *name, PanelControls *controls, Gameduino *gd ) {
RichardE 0:5fa232ee5fdf 39 UInt16 inputs;
RichardE 0:5fa232ee5fdf 40 UInt8 countdown = 0;
RichardE 0:5fa232ee5fdf 41 char *curPtr;
RichardE 0:5fa232ee5fdf 42 // Initialise name to all 'A' characters.
RichardE 0:5fa232ee5fdf 43 for( UInt8 i = 0; i < PlayerName::Length; ++i ) {
RichardE 0:5fa232ee5fdf 44 name->Name[ i ] = 'A';
RichardE 0:5fa232ee5fdf 45 }
RichardE 0:5fa232ee5fdf 46 // Draw screen.
RichardE 4:673eb9735d44 47 DrawScreen( gd );
RichardE 0:5fa232ee5fdf 48 // Wait until player releases all controls.
RichardE 4:673eb9735d44 49 WaitControls( gd, controls, false );
RichardE 0:5fa232ee5fdf 50 // Start at leftmost character.
RichardE 0:5fa232ee5fdf 51 cursorPos = 0;
RichardE 0:5fa232ee5fdf 52 // Loop until cursor moves beyond rightmost character.
RichardE 0:5fa232ee5fdf 53 while( cursorPos < PlayerName::Length ) {
RichardE 0:5fa232ee5fdf 54 // Read panel controls.
RichardE 0:5fa232ee5fdf 55 controls->Read();
RichardE 0:5fa232ee5fdf 56 inputs = controls->GetInputs();
RichardE 0:5fa232ee5fdf 57 // Point to character under cursor.
RichardE 0:5fa232ee5fdf 58 curPtr = name->Name + cursorPos;
RichardE 0:5fa232ee5fdf 59 // Only react to controls every so often to slow things down.
RichardE 0:5fa232ee5fdf 60 if( countdown == 0 ) {
RichardE 0:5fa232ee5fdf 61 countdown = 10;
RichardE 0:5fa232ee5fdf 62 if( inputs & PanelControls::Up1 ) {
RichardE 0:5fa232ee5fdf 63 // Joystick up selects next character up.
RichardE 0:5fa232ee5fdf 64 if( *curPtr >= PlayerName::MaxChar ) {
RichardE 0:5fa232ee5fdf 65 *curPtr = PlayerName::MinChar;
RichardE 0:5fa232ee5fdf 66 }
RichardE 0:5fa232ee5fdf 67 else {
RichardE 0:5fa232ee5fdf 68 (*curPtr)++;
RichardE 0:5fa232ee5fdf 69 }
RichardE 0:5fa232ee5fdf 70 }
RichardE 0:5fa232ee5fdf 71 else if( inputs & PanelControls::Down1 ) {
RichardE 0:5fa232ee5fdf 72 // Joystick down selects previous character down.
RichardE 0:5fa232ee5fdf 73 if( *curPtr <= PlayerName::MinChar ) {
RichardE 0:5fa232ee5fdf 74 *curPtr = PlayerName::MaxChar;
RichardE 0:5fa232ee5fdf 75 }
RichardE 0:5fa232ee5fdf 76 else {
RichardE 0:5fa232ee5fdf 77 (*curPtr)--;
RichardE 0:5fa232ee5fdf 78 }
RichardE 0:5fa232ee5fdf 79 }
RichardE 0:5fa232ee5fdf 80 else if( inputs & PanelControls::Left1 ) {
RichardE 0:5fa232ee5fdf 81 // Joystick left moves cursor back.
RichardE 0:5fa232ee5fdf 82 if( cursorPos > 0 ) {
RichardE 0:5fa232ee5fdf 83 cursorPos--;
RichardE 0:5fa232ee5fdf 84 // Wait until all controls released.
RichardE 4:673eb9735d44 85 WaitControls( gd, controls, false );
RichardE 0:5fa232ee5fdf 86 }
RichardE 0:5fa232ee5fdf 87 }
RichardE 0:5fa232ee5fdf 88 else if( inputs & PanelControls::Right1 ) {
RichardE 0:5fa232ee5fdf 89 // Joystick right moves cursor forwards.
RichardE 0:5fa232ee5fdf 90 cursorPos++;
RichardE 0:5fa232ee5fdf 91 // Wait until all controls released.
RichardE 4:673eb9735d44 92 WaitControls( gd, controls, false );
RichardE 0:5fa232ee5fdf 93 }
RichardE 0:5fa232ee5fdf 94 }
RichardE 0:5fa232ee5fdf 95 else {
RichardE 0:5fa232ee5fdf 96 countdown--;
RichardE 0:5fa232ee5fdf 97 }
RichardE 0:5fa232ee5fdf 98 // Wait for vertical flyback. Then draw name and do animation.
RichardE 4:673eb9735d44 99 gd->waitvblank();
RichardE 0:5fa232ee5fdf 100 FrameCounter++;
RichardE 4:673eb9735d44 101 DrawName( gd, name );
RichardE 4:673eb9735d44 102 Animate( gd );
RichardE 0:5fa232ee5fdf 103 }
RichardE 0:5fa232ee5fdf 104 // Wait until player releases all controls before returning.
RichardE 4:673eb9735d44 105 WaitControls( gd, controls, false );
RichardE 0:5fa232ee5fdf 106 }
RichardE 0:5fa232ee5fdf 107
RichardE 0:5fa232ee5fdf 108 /*********************/
RichardE 0:5fa232ee5fdf 109 /* WAIT FOR CONTROLS */
RichardE 0:5fa232ee5fdf 110 /*********************/
RichardE 4:673eb9735d44 111 // Pass pointer to Gameduino to display on in gd.
RichardE 0:5fa232ee5fdf 112 // Pass pointer to controls to read in controls.
RichardE 0:5fa232ee5fdf 113 // Pass true in waitActivate to wait for a control to be used.
RichardE 0:5fa232ee5fdf 114 // Pass false to wait for release.
RichardE 4:673eb9735d44 115 void HighScoreEntry::WaitControls( Gameduino *gd, PanelControls *controls, bool waitActivate ) {
RichardE 4:673eb9735d44 116 bool released = false;
RichardE 0:5fa232ee5fdf 117 UInt16 inputs;
RichardE 0:5fa232ee5fdf 118 while( ! released ) {
RichardE 0:5fa232ee5fdf 119 controls->Read();
RichardE 0:5fa232ee5fdf 120 inputs = controls->GetInputs();
RichardE 0:5fa232ee5fdf 121 released = ( waitActivate ? ( inputs != 0 ) : ( inputs == 0 ) );
RichardE 0:5fa232ee5fdf 122 if( ! released ) {
RichardE 4:673eb9735d44 123 gd->waitvblank();
RichardE 0:5fa232ee5fdf 124 FrameCounter++;
RichardE 4:673eb9735d44 125 Animate( gd );
RichardE 0:5fa232ee5fdf 126 }
RichardE 0:5fa232ee5fdf 127 }
RichardE 0:5fa232ee5fdf 128 }
RichardE 0:5fa232ee5fdf 129
RichardE 0:5fa232ee5fdf 130 /*******************/
RichardE 0:5fa232ee5fdf 131 /* DRAW THE SCREEN */
RichardE 0:5fa232ee5fdf 132 /*******************/
RichardE 4:673eb9735d44 133 // Pass pointer to Gameduino to draw on in gd.
RichardE 4:673eb9735d44 134 void HighScoreEntry::DrawScreen( Gameduino *gd ) {
RichardE 4:673eb9735d44 135 gd->waitvblank();
RichardE 0:5fa232ee5fdf 136 // Clear the screen to zero characters.
RichardE 4:673eb9735d44 137 gd->fill( Gameduino::RAM_PIC, 0, RAM_PIC_SIZE );
RichardE 0:5fa232ee5fdf 138 // Turn off all the sprites.
RichardE 0:5fa232ee5fdf 139 for( UInt16 s = 0; s < SPRITE_COUNT; ++s ) {
RichardE 4:673eb9735d44 140 gd->sprite( s, 0, 400, 0, 0 );
RichardE 0:5fa232ee5fdf 141 }
RichardE 0:5fa232ee5fdf 142 // Draw border around screen.
RichardE 4:673eb9735d44 143 CharFrame::Draw( gd, 0, 0, VISIBLE_CHAR_WIDTH, VISIBLE_CHAR_HEIGHT );
RichardE 14:46a353b2a8e8 144 // Draw instructions.
RichardE 14:46a353b2a8e8 145 gd->putstr( 2, 2, " CONGRATULATIONS : YOU HAVE A HIGH SCORE!" );
RichardE 14:46a353b2a8e8 146 gd->putstr( 2, 4, "PLEASE ENTER YOUR NAME USING THE LEFT JOYSTICK" );
RichardE 14:46a353b2a8e8 147 gd->putstr( 2, 6, " TO MOVE THE CURSOR. PRESS THE LEFT BUTTON TO" );
RichardE 14:46a353b2a8e8 148 gd->putstr( 2, 8, " ENTER EACH LETTER. MOVE CURSOR TO FOOT OF" );
RichardE 14:46a353b2a8e8 149 gd->putstr( 2, 10, " SCREEN AND PRESS LEFT BUTTON WHEN FINISHED." );
RichardE 14:46a353b2a8e8 150 // Draw character grid.
RichardE 14:46a353b2a8e8 151 DrawGrid( gd );
RichardE 14:46a353b2a8e8 152 }
RichardE 14:46a353b2a8e8 153
RichardE 14:46a353b2a8e8 154 // Grid constants.
RichardE 14:46a353b2a8e8 155 #define GRIDX 5
RichardE 14:46a353b2a8e8 156 #define GRIDY 14
RichardE 14:46a353b2a8e8 157 #define GRIDCOLUMNS 20
RichardE 14:46a353b2a8e8 158 #define GRIDROWS 3
RichardE 14:46a353b2a8e8 159 #define GRIDCOLUMNSPACING 2
RichardE 14:46a353b2a8e8 160 #define GRIDROWSPACING 2
RichardE 14:46a353b2a8e8 161
RichardE 14:46a353b2a8e8 162 /***************************/
RichardE 14:46a353b2a8e8 163 /* DRAW THE CHARACTER GRID */
RichardE 14:46a353b2a8e8 164 /***************************/
RichardE 14:46a353b2a8e8 165 // Pass pointer to Gameduino to draw on in gd.
RichardE 14:46a353b2a8e8 166 void HighScoreEntry::DrawGrid( Gameduino *gd ) {
RichardE 14:46a353b2a8e8 167 UInt8 code = PlayerName::MinChar;
RichardE 14:46a353b2a8e8 168 UInt8 x = GRIDX, y = GRIDY;
RichardE 14:46a353b2a8e8 169 UInt8 columnNumber = 0;
RichardE 14:46a353b2a8e8 170 char str [] = "X";
RichardE 14:46a353b2a8e8 171 while( code <= PlayerName::MaxChar ) {
RichardE 14:46a353b2a8e8 172 str[ 0 ] = (char)code++;
RichardE 14:46a353b2a8e8 173 gd->putstr( x, y, str );
RichardE 14:46a353b2a8e8 174 columnNumber++;
RichardE 14:46a353b2a8e8 175 if( columnNumber >= GRIDCOLUMNS ) {
RichardE 14:46a353b2a8e8 176 columnNumber = 0;
RichardE 14:46a353b2a8e8 177 x = GRIDX;
RichardE 14:46a353b2a8e8 178 y += GRIDROWSPACING;
RichardE 14:46a353b2a8e8 179 }
RichardE 14:46a353b2a8e8 180 else {
RichardE 14:46a353b2a8e8 181 x += GRIDCOLUMNSPACING;
RichardE 14:46a353b2a8e8 182 }
RichardE 14:46a353b2a8e8 183 }
RichardE 0:5fa232ee5fdf 184 }
RichardE 0:5fa232ee5fdf 185
RichardE 0:5fa232ee5fdf 186 /********************************/
RichardE 0:5fa232ee5fdf 187 /* DRAW THE NAME AND THE CURSOR */
RichardE 0:5fa232ee5fdf 188 /********************************/
RichardE 4:673eb9735d44 189 // Pass pointer to Gameduino to draw on in gd.
RichardE 0:5fa232ee5fdf 190 // Pass player name in name.
RichardE 4:673eb9735d44 191 void HighScoreEntry::DrawName( Gameduino *gd, PlayerName *name ) {
RichardE 4:673eb9735d44 192 gd->putstr( 21, 11, name->Name );
RichardE 4:673eb9735d44 193 UInt16 address = Gameduino::RAM_PIC + 12 * SCREEN_CHAR_WIDTH + 21;
RichardE 0:5fa232ee5fdf 194 for( UInt8 i = 0; i < PlayerName::Length; ++i ) {
RichardE 4:673eb9735d44 195 gd->wr( address, ( i == cursorPos ) ? ArrowUp : ' ' );
RichardE 0:5fa232ee5fdf 196 address++;
RichardE 0:5fa232ee5fdf 197 }
RichardE 0:5fa232ee5fdf 198 }
RichardE 0:5fa232ee5fdf 199
RichardE 0:5fa232ee5fdf 200 /********************/
RichardE 0:5fa232ee5fdf 201 /* UPDATE ANIMATION */
RichardE 0:5fa232ee5fdf 202 /********************/
RichardE 4:673eb9735d44 203 // Pass pointer to Gameduino to display on in gd.
RichardE 4:673eb9735d44 204 void HighScoreEntry::Animate( Gameduino *gd ) {
RichardE 0:5fa232ee5fdf 205 }