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 16 08:54:57 2013 +0000
Revision:
17:194789db2215
Parent:
16:d0b142ba4362
Child:
18:70190f956a24
New high score entry routines completed and working.

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 16:d0b142ba4362 17 #include "CharFrame.h" // for drawing frames of characters
RichardE 0:5fa232ee5fdf 18
RichardE 15:d8ea0c7b7e64 19 // Define this for debugging messages on serial port.
RichardE 16:d0b142ba4362 20 #undef CHATTY
RichardE 15:d8ea0c7b7e64 21
RichardE 15:d8ea0c7b7e64 22 #ifdef CHATTY
RichardE 15:d8ea0c7b7e64 23 extern Serial pc;
RichardE 15:d8ea0c7b7e64 24 #endif
RichardE 15:d8ea0c7b7e64 25
RichardE 15:d8ea0c7b7e64 26 // Grid constants.
RichardE 15:d8ea0c7b7e64 27 #define GRIDX 5
RichardE 16:d0b142ba4362 28 #define GRIDY 16
RichardE 15:d8ea0c7b7e64 29 #define GRIDCOLUMNS 20
RichardE 17:194789db2215 30 #define GRIDROWS 4 // 3 rows for characters, 1 row for special functions
RichardE 15:d8ea0c7b7e64 31 #define GRIDCOLUMNSPACING 2
RichardE 15:d8ea0c7b7e64 32 #define GRIDROWSPACING 2
RichardE 15:d8ea0c7b7e64 33
RichardE 17:194789db2215 34 // Some text.
RichardE 17:194789db2215 35 const char HighScoreEntry::textDelete[] = "DELETE";
RichardE 17:194789db2215 36 const char HighScoreEntry::textEnter[] = "ENTER";
RichardE 17:194789db2215 37
RichardE 0:5fa232ee5fdf 38 /***************/
RichardE 0:5fa232ee5fdf 39 /* CONSTRUCTOR */
RichardE 0:5fa232ee5fdf 40 /***************/
RichardE 0:5fa232ee5fdf 41 HighScoreEntry::HighScoreEntry() :
RichardE 16:d0b142ba4362 42 charIndex( 0 ),
RichardE 16:d0b142ba4362 43 cursorRow( 0 ),
RichardE 16:d0b142ba4362 44 cursorColumn( 0 ),
RichardE 15:d8ea0c7b7e64 45 grid( GRIDROWS )
RichardE 0:5fa232ee5fdf 46 {
RichardE 15:d8ea0c7b7e64 47 // Initialise grid around which cursor moves.
RichardE 15:d8ea0c7b7e64 48 InitialiseGrid();
RichardE 15:d8ea0c7b7e64 49 #ifdef CHATTY
RichardE 15:d8ea0c7b7e64 50 for( UInt8 rowNum = 0; rowNum < grid.GetRowCount(); ++rowNum ) {
RichardE 15:d8ea0c7b7e64 51 FieldRow *row = grid.GetRow( rowNum );
RichardE 15:d8ea0c7b7e64 52 if( row != (FieldRow*)NULL ) {
RichardE 15:d8ea0c7b7e64 53 FieldCell *cell = row->GetFirstCell();
RichardE 15:d8ea0c7b7e64 54 UInt8 columnNum = 0;
RichardE 15:d8ea0c7b7e64 55 while( cell != (FieldCell*)NULL ) {
RichardE 15:d8ea0c7b7e64 56 pc.printf(
RichardE 15:d8ea0c7b7e64 57 "Row %d column %d -> %d,%d,%d,%d\r\n",
RichardE 15:d8ea0c7b7e64 58 (int)rowNum, (int)columnNum,
RichardE 15:d8ea0c7b7e64 59 (int)cell->Rect.X1, (int)cell->Rect.Y1, (int)cell->Rect.X2, (int)cell->Rect.Y2
RichardE 15:d8ea0c7b7e64 60 );
RichardE 15:d8ea0c7b7e64 61 cell = row->GetNextCell();
RichardE 15:d8ea0c7b7e64 62 columnNum++;
RichardE 15:d8ea0c7b7e64 63 }
RichardE 15:d8ea0c7b7e64 64 }
RichardE 15:d8ea0c7b7e64 65 }
RichardE 15:d8ea0c7b7e64 66 #endif
RichardE 0:5fa232ee5fdf 67 }
RichardE 0:5fa232ee5fdf 68
RichardE 0:5fa232ee5fdf 69 /**************/
RichardE 0:5fa232ee5fdf 70 /* DESTRUCTOR */
RichardE 0:5fa232ee5fdf 71 /**************/
RichardE 0:5fa232ee5fdf 72 HighScoreEntry::~HighScoreEntry() {
RichardE 0:5fa232ee5fdf 73 }
RichardE 0:5fa232ee5fdf 74
RichardE 15:d8ea0c7b7e64 75 /*******************/
RichardE 15:d8ea0c7b7e64 76 /* INITIALISE GRID */
RichardE 15:d8ea0c7b7e64 77 /*******************/
RichardE 15:d8ea0c7b7e64 78 void HighScoreEntry::InitialiseGrid( void ) {
RichardE 17:194789db2215 79 // First initialise rows used for characters.
RichardE 16:d0b142ba4362 80 UInt8 code = PlayerName::MinChar;
RichardE 16:d0b142ba4362 81 UInt8 x = GRIDX, y = GRIDY;
RichardE 16:d0b142ba4362 82 UInt8 columnNumber = 0, rowNumber = 0;;
RichardE 16:d0b142ba4362 83 FieldRow *row = grid.GetRow( rowNumber++ );
RichardE 16:d0b142ba4362 84 while( code <= PlayerName::MaxChar ) {
RichardE 15:d8ea0c7b7e64 85 if( row != (FieldRow*)NULL ) {
RichardE 16:d0b142ba4362 86 FieldCell *cell = new FieldCell();
RichardE 16:d0b142ba4362 87 cell->Rect.X1 = x - 1;
RichardE 16:d0b142ba4362 88 cell->Rect.Y1 = y - 1;
RichardE 16:d0b142ba4362 89 cell->Rect.X2 = x + 1;
RichardE 16:d0b142ba4362 90 cell->Rect.Y2 = y + 1;
RichardE 16:d0b142ba4362 91 row->AddCell( cell );
RichardE 16:d0b142ba4362 92 }
RichardE 16:d0b142ba4362 93 columnNumber++;
RichardE 16:d0b142ba4362 94 if( columnNumber >= GRIDCOLUMNS ) {
RichardE 16:d0b142ba4362 95 columnNumber = 0;
RichardE 15:d8ea0c7b7e64 96 x = GRIDX;
RichardE 16:d0b142ba4362 97 y += GRIDROWSPACING;
RichardE 16:d0b142ba4362 98 row = grid.GetRow( rowNumber++ );
RichardE 15:d8ea0c7b7e64 99 }
RichardE 16:d0b142ba4362 100 else {
RichardE 16:d0b142ba4362 101 x += GRIDCOLUMNSPACING;
RichardE 16:d0b142ba4362 102 }
RichardE 16:d0b142ba4362 103 code++;
RichardE 15:d8ea0c7b7e64 104 }
RichardE 17:194789db2215 105 // Add another row for special functions.
RichardE 17:194789db2215 106 columnNumber = 0;
RichardE 17:194789db2215 107 x = GRIDX;
RichardE 17:194789db2215 108 y += GRIDROWSPACING;
RichardE 17:194789db2215 109 row = grid.GetRow( rowNumber++ );
RichardE 17:194789db2215 110 if( row != (FieldRow*)NULL ) {
RichardE 17:194789db2215 111 AddTextCell( x, y, row, textDelete );
RichardE 17:194789db2215 112 AddTextCell( x, y, row, textEnter );
RichardE 17:194789db2215 113 }
RichardE 15:d8ea0c7b7e64 114 }
RichardE 15:d8ea0c7b7e64 115
RichardE 17:194789db2215 116 /***************************************/
RichardE 17:194789db2215 117 /* ADD A CELL CONTAINING TEXT TO A ROW */
RichardE 17:194789db2215 118 /***************************************/
RichardE 17:194789db2215 119 // Pass character coordinates in x and y. These will be updated.
RichardE 17:194789db2215 120 // Pass row to which cells should be added in row.
RichardE 17:194789db2215 121 // Pass text which is to be contained in cell in text.
RichardE 17:194789db2215 122 void HighScoreEntry::AddTextCell( UInt8 &x, UInt8 &y, FieldRow *row, const char *text ) {
RichardE 17:194789db2215 123 int len = strlen( text );
RichardE 17:194789db2215 124 FieldCell *cell = new FieldCell();
RichardE 17:194789db2215 125 cell->Rect.X1 = x - 1;
RichardE 17:194789db2215 126 cell->Rect.Y1 = y - 1;
RichardE 17:194789db2215 127 cell->Rect.X2 = x + len;
RichardE 17:194789db2215 128 cell->Rect.Y2 = y + 1;
RichardE 17:194789db2215 129 row->AddCell( cell );
RichardE 17:194789db2215 130 x += ( len + 1 );
RichardE 17:194789db2215 131 }
RichardE 17:194789db2215 132
RichardE 0:5fa232ee5fdf 133 /*********************/
RichardE 0:5fa232ee5fdf 134 /* GET A PLAYER NAME */
RichardE 0:5fa232ee5fdf 135 /*********************/
RichardE 0:5fa232ee5fdf 136 // Pass pointer to place to store name in name.
RichardE 0:5fa232ee5fdf 137 // Pass pointer to controls to read in controls.
RichardE 4:673eb9735d44 138 // Pass pointer to Gameduino to display on in gd.
RichardE 4:673eb9735d44 139 void HighScoreEntry::GetName( PlayerName *name, PanelControls *controls, Gameduino *gd ) {
RichardE 0:5fa232ee5fdf 140 UInt16 inputs;
RichardE 0:5fa232ee5fdf 141 UInt8 countdown = 0;
RichardE 0:5fa232ee5fdf 142 // Initialise name to all 'A' characters.
RichardE 0:5fa232ee5fdf 143 for( UInt8 i = 0; i < PlayerName::Length; ++i ) {
RichardE 0:5fa232ee5fdf 144 name->Name[ i ] = 'A';
RichardE 0:5fa232ee5fdf 145 }
RichardE 0:5fa232ee5fdf 146 // Draw screen.
RichardE 16:d0b142ba4362 147 DrawScreen( gd, name );
RichardE 0:5fa232ee5fdf 148 // Wait until player releases all controls.
RichardE 4:673eb9735d44 149 WaitControls( gd, controls, false );
RichardE 16:d0b142ba4362 150 // Loop until player activates done cell.
RichardE 16:d0b142ba4362 151 bool done = false;
RichardE 16:d0b142ba4362 152 while( ! done ) {
RichardE 0:5fa232ee5fdf 153 // Read panel controls.
RichardE 0:5fa232ee5fdf 154 controls->Read();
RichardE 0:5fa232ee5fdf 155 inputs = controls->GetInputs();
RichardE 0:5fa232ee5fdf 156 // Only react to controls every so often to slow things down.
RichardE 0:5fa232ee5fdf 157 if( countdown == 0 ) {
RichardE 0:5fa232ee5fdf 158 countdown = 10;
RichardE 16:d0b142ba4362 159 bool cursorMoved = false;
RichardE 16:d0b142ba4362 160 // Point to current cell before changing.
RichardE 16:d0b142ba4362 161 FieldCell *lastCell = grid.GetCellAt( cursorRow, cursorColumn );
RichardE 0:5fa232ee5fdf 162 if( inputs & PanelControls::Up1 ) {
RichardE 16:d0b142ba4362 163 // Joystick up moves cursor up.
RichardE 16:d0b142ba4362 164 if( cursorRow > 0 ) {
RichardE 16:d0b142ba4362 165 cursorRow--;
RichardE 16:d0b142ba4362 166 ValidateCursorColumn();
RichardE 16:d0b142ba4362 167 cursorMoved = true;
RichardE 0:5fa232ee5fdf 168 }
RichardE 0:5fa232ee5fdf 169 }
RichardE 0:5fa232ee5fdf 170 else if( inputs & PanelControls::Down1 ) {
RichardE 16:d0b142ba4362 171 // Joystick down moves cursor down.
RichardE 16:d0b142ba4362 172 if( cursorRow < grid.GetRowCount() - 1 ) {
RichardE 16:d0b142ba4362 173 cursorRow++;
RichardE 16:d0b142ba4362 174 ValidateCursorColumn();
RichardE 16:d0b142ba4362 175 cursorMoved = true;
RichardE 0:5fa232ee5fdf 176 }
RichardE 0:5fa232ee5fdf 177 }
RichardE 16:d0b142ba4362 178 if( inputs & PanelControls::Left1 ) {
RichardE 16:d0b142ba4362 179 // Joystick left moves cursor left.
RichardE 16:d0b142ba4362 180 if( cursorColumn > 0 ) {
RichardE 16:d0b142ba4362 181 cursorColumn--;
RichardE 16:d0b142ba4362 182 cursorMoved = true;
RichardE 0:5fa232ee5fdf 183 }
RichardE 0:5fa232ee5fdf 184 }
RichardE 0:5fa232ee5fdf 185 else if( inputs & PanelControls::Right1 ) {
RichardE 16:d0b142ba4362 186 // Joystick right moves cursor right.
RichardE 16:d0b142ba4362 187 FieldRow *row = grid.GetRow( cursorRow );
RichardE 16:d0b142ba4362 188 if( ( row != (FieldRow*)NULL ) && ( cursorColumn < row->GetColumnCount() - 1 ) ) {
RichardE 16:d0b142ba4362 189 cursorColumn++;
RichardE 16:d0b142ba4362 190 cursorMoved = true;
RichardE 16:d0b142ba4362 191 }
RichardE 16:d0b142ba4362 192 }
RichardE 16:d0b142ba4362 193 if( inputs & PanelControls::Button1 ) {
RichardE 16:d0b142ba4362 194 // Button 1 adds a character or possibly does something special.
RichardE 17:194789db2215 195 if( cursorRow < grid.GetRowCount() - 1 ) {
RichardE 16:d0b142ba4362 196 char newChar = (char)( PlayerName::MinChar + cursorRow * GRIDCOLUMNS + cursorColumn );
RichardE 16:d0b142ba4362 197 name->Name[ charIndex ] = newChar;
RichardE 16:d0b142ba4362 198 if( charIndex < PlayerName::Length - 1 ) {
RichardE 16:d0b142ba4362 199 charIndex++;
RichardE 16:d0b142ba4362 200 }
RichardE 16:d0b142ba4362 201 }
RichardE 16:d0b142ba4362 202 else {
RichardE 17:194789db2215 203 // Last row contains special functions.
RichardE 17:194789db2215 204 SpecialFunction( gd, cursorColumn, name, done );
RichardE 16:d0b142ba4362 205 }
RichardE 16:d0b142ba4362 206 // Draw modified name.
RichardE 16:d0b142ba4362 207 gd->waitvblank();
RichardE 16:d0b142ba4362 208 DrawName( gd, name );
RichardE 16:d0b142ba4362 209 // Wait until player releases all controls.
RichardE 16:d0b142ba4362 210 WaitControls( gd, controls, false );
RichardE 16:d0b142ba4362 211 }
RichardE 16:d0b142ba4362 212 // If necessary redraw the cursor.
RichardE 16:d0b142ba4362 213 if( cursorMoved ) {
RichardE 16:d0b142ba4362 214 WipeCursor( gd, lastCell );
RichardE 16:d0b142ba4362 215 DrawCursor( gd, grid.GetCellAt( cursorRow, cursorColumn ) );
RichardE 0:5fa232ee5fdf 216 }
RichardE 0:5fa232ee5fdf 217 }
RichardE 0:5fa232ee5fdf 218 else {
RichardE 0:5fa232ee5fdf 219 countdown--;
RichardE 0:5fa232ee5fdf 220 }
RichardE 16:d0b142ba4362 221 // Wait for vertical flyback. Then do animation.
RichardE 4:673eb9735d44 222 gd->waitvblank();
RichardE 0:5fa232ee5fdf 223 FrameCounter++;
RichardE 4:673eb9735d44 224 Animate( gd );
RichardE 0:5fa232ee5fdf 225 }
RichardE 0:5fa232ee5fdf 226 // Wait until player releases all controls before returning.
RichardE 4:673eb9735d44 227 WaitControls( gd, controls, false );
RichardE 0:5fa232ee5fdf 228 }
RichardE 0:5fa232ee5fdf 229
RichardE 17:194789db2215 230 /************************************************************************/
RichardE 17:194789db2215 231 /* PERFORM A SPECIAL FUNCTION TRIGGERED FROM A CELL ON LAST ROW OF GRID */
RichardE 17:194789db2215 232 /************************************************************************/
RichardE 17:194789db2215 233 // Pass pointer to Gameduino to draw on in gd.
RichardE 17:194789db2215 234 // Pass function number in funcNum (this is the cursor column number).
RichardE 17:194789db2215 235 // Pass player name in name.
RichardE 17:194789db2215 236 // Pass reference to done flag in done.
RichardE 17:194789db2215 237 void HighScoreEntry::SpecialFunction( Gameduino *gd, UInt8 funcNum, PlayerName *name, bool &done ) {
RichardE 17:194789db2215 238 switch( funcNum ) {
RichardE 17:194789db2215 239
RichardE 17:194789db2215 240 case 0 : // DELETE function
RichardE 17:194789db2215 241 if( charIndex > 0 ) {
RichardE 17:194789db2215 242 name->Name[ charIndex-- ] = ' ';
RichardE 17:194789db2215 243 }
RichardE 17:194789db2215 244 break;
RichardE 17:194789db2215 245
RichardE 17:194789db2215 246 case 1 : // ENTER function
RichardE 17:194789db2215 247 done = true;
RichardE 17:194789db2215 248 break;
RichardE 17:194789db2215 249
RichardE 17:194789db2215 250 }
RichardE 17:194789db2215 251 }
RichardE 17:194789db2215 252
RichardE 0:5fa232ee5fdf 253 /*********************/
RichardE 0:5fa232ee5fdf 254 /* WAIT FOR CONTROLS */
RichardE 0:5fa232ee5fdf 255 /*********************/
RichardE 4:673eb9735d44 256 // Pass pointer to Gameduino to display on in gd.
RichardE 0:5fa232ee5fdf 257 // Pass pointer to controls to read in controls.
RichardE 0:5fa232ee5fdf 258 // Pass true in waitActivate to wait for a control to be used.
RichardE 0:5fa232ee5fdf 259 // Pass false to wait for release.
RichardE 4:673eb9735d44 260 void HighScoreEntry::WaitControls( Gameduino *gd, PanelControls *controls, bool waitActivate ) {
RichardE 4:673eb9735d44 261 bool released = false;
RichardE 0:5fa232ee5fdf 262 UInt16 inputs;
RichardE 0:5fa232ee5fdf 263 while( ! released ) {
RichardE 0:5fa232ee5fdf 264 controls->Read();
RichardE 0:5fa232ee5fdf 265 inputs = controls->GetInputs();
RichardE 0:5fa232ee5fdf 266 released = ( waitActivate ? ( inputs != 0 ) : ( inputs == 0 ) );
RichardE 0:5fa232ee5fdf 267 if( ! released ) {
RichardE 4:673eb9735d44 268 gd->waitvblank();
RichardE 0:5fa232ee5fdf 269 FrameCounter++;
RichardE 4:673eb9735d44 270 Animate( gd );
RichardE 0:5fa232ee5fdf 271 }
RichardE 0:5fa232ee5fdf 272 }
RichardE 0:5fa232ee5fdf 273 }
RichardE 0:5fa232ee5fdf 274
RichardE 0:5fa232ee5fdf 275 /*******************/
RichardE 0:5fa232ee5fdf 276 /* DRAW THE SCREEN */
RichardE 0:5fa232ee5fdf 277 /*******************/
RichardE 4:673eb9735d44 278 // Pass pointer to Gameduino to draw on in gd.
RichardE 16:d0b142ba4362 279 // Pass player name in name.
RichardE 16:d0b142ba4362 280 void HighScoreEntry::DrawScreen( Gameduino *gd, PlayerName *name ) {
RichardE 4:673eb9735d44 281 gd->waitvblank();
RichardE 0:5fa232ee5fdf 282 // Clear the screen to zero characters.
RichardE 4:673eb9735d44 283 gd->fill( Gameduino::RAM_PIC, 0, RAM_PIC_SIZE );
RichardE 0:5fa232ee5fdf 284 // Turn off all the sprites.
RichardE 0:5fa232ee5fdf 285 for( UInt16 s = 0; s < SPRITE_COUNT; ++s ) {
RichardE 4:673eb9735d44 286 gd->sprite( s, 0, 400, 0, 0 );
RichardE 0:5fa232ee5fdf 287 }
RichardE 0:5fa232ee5fdf 288 // Draw border around screen.
RichardE 4:673eb9735d44 289 CharFrame::Draw( gd, 0, 0, VISIBLE_CHAR_WIDTH, VISIBLE_CHAR_HEIGHT );
RichardE 14:46a353b2a8e8 290 // Draw instructions.
RichardE 14:46a353b2a8e8 291 gd->putstr( 2, 2, " CONGRATULATIONS : YOU HAVE A HIGH SCORE!" );
RichardE 14:46a353b2a8e8 292 gd->putstr( 2, 4, "PLEASE ENTER YOUR NAME USING THE LEFT JOYSTICK" );
RichardE 14:46a353b2a8e8 293 gd->putstr( 2, 6, " TO MOVE THE CURSOR. PRESS THE LEFT BUTTON TO" );
RichardE 17:194789db2215 294 gd->putstr( 2, 8, " ENTER EACH LETTER. MOVE CURSOR TO \"ENTER\"" );
RichardE 17:194789db2215 295 gd->putstr( 2, 10, " AND PRESS LEFT BUTTON WHEN FINISHED." );
RichardE 16:d0b142ba4362 296 // Draw player's name.
RichardE 16:d0b142ba4362 297 DrawName( gd, name );
RichardE 14:46a353b2a8e8 298 // Draw character grid.
RichardE 14:46a353b2a8e8 299 DrawGrid( gd );
RichardE 16:d0b142ba4362 300 // Draw cursor.
RichardE 16:d0b142ba4362 301 DrawCursor( gd, grid.GetCellAt( cursorRow, cursorColumn ) );
RichardE 14:46a353b2a8e8 302 }
RichardE 14:46a353b2a8e8 303
RichardE 14:46a353b2a8e8 304 /***************************/
RichardE 14:46a353b2a8e8 305 /* DRAW THE CHARACTER GRID */
RichardE 14:46a353b2a8e8 306 /***************************/
RichardE 14:46a353b2a8e8 307 // Pass pointer to Gameduino to draw on in gd.
RichardE 14:46a353b2a8e8 308 void HighScoreEntry::DrawGrid( Gameduino *gd ) {
RichardE 17:194789db2215 309 // Draw rows containing characters.
RichardE 14:46a353b2a8e8 310 UInt8 code = PlayerName::MinChar;
RichardE 14:46a353b2a8e8 311 UInt8 x = GRIDX, y = GRIDY;
RichardE 14:46a353b2a8e8 312 UInt8 columnNumber = 0;
RichardE 14:46a353b2a8e8 313 char str [] = "X";
RichardE 14:46a353b2a8e8 314 while( code <= PlayerName::MaxChar ) {
RichardE 14:46a353b2a8e8 315 str[ 0 ] = (char)code++;
RichardE 14:46a353b2a8e8 316 gd->putstr( x, y, str );
RichardE 14:46a353b2a8e8 317 columnNumber++;
RichardE 14:46a353b2a8e8 318 if( columnNumber >= GRIDCOLUMNS ) {
RichardE 14:46a353b2a8e8 319 columnNumber = 0;
RichardE 14:46a353b2a8e8 320 x = GRIDX;
RichardE 14:46a353b2a8e8 321 y += GRIDROWSPACING;
RichardE 14:46a353b2a8e8 322 }
RichardE 14:46a353b2a8e8 323 else {
RichardE 14:46a353b2a8e8 324 x += GRIDCOLUMNSPACING;
RichardE 14:46a353b2a8e8 325 }
RichardE 14:46a353b2a8e8 326 }
RichardE 17:194789db2215 327 // Draw row containing special functions.
RichardE 17:194789db2215 328 x = GRIDX;
RichardE 17:194789db2215 329 y += GRIDROWSPACING;
RichardE 17:194789db2215 330 gd->putstr( x, y, textDelete );
RichardE 17:194789db2215 331 x += ( strlen( textDelete ) + 1 );
RichardE 17:194789db2215 332 gd->putstr( x, y, textEnter );
RichardE 0:5fa232ee5fdf 333 }
RichardE 0:5fa232ee5fdf 334
RichardE 0:5fa232ee5fdf 335 /********************************/
RichardE 0:5fa232ee5fdf 336 /* DRAW THE NAME AND THE CURSOR */
RichardE 0:5fa232ee5fdf 337 /********************************/
RichardE 4:673eb9735d44 338 // Pass pointer to Gameduino to draw on in gd.
RichardE 0:5fa232ee5fdf 339 // Pass player name in name.
RichardE 4:673eb9735d44 340 void HighScoreEntry::DrawName( Gameduino *gd, PlayerName *name ) {
RichardE 16:d0b142ba4362 341 gd->putstr( 23, 13, name->Name );
RichardE 16:d0b142ba4362 342 UInt16 address = Gameduino::RAM_PIC + 14 * SCREEN_CHAR_WIDTH + 23;
RichardE 0:5fa232ee5fdf 343 for( UInt8 i = 0; i < PlayerName::Length; ++i ) {
RichardE 16:d0b142ba4362 344 gd->wr( address, ( i == charIndex ) ? ArrowUp : ' ' );
RichardE 0:5fa232ee5fdf 345 address++;
RichardE 0:5fa232ee5fdf 346 }
RichardE 0:5fa232ee5fdf 347 }
RichardE 0:5fa232ee5fdf 348
RichardE 0:5fa232ee5fdf 349 /********************/
RichardE 0:5fa232ee5fdf 350 /* UPDATE ANIMATION */
RichardE 0:5fa232ee5fdf 351 /********************/
RichardE 4:673eb9735d44 352 // Pass pointer to Gameduino to display on in gd.
RichardE 4:673eb9735d44 353 void HighScoreEntry::Animate( Gameduino *gd ) {
RichardE 0:5fa232ee5fdf 354 }
RichardE 16:d0b142ba4362 355
RichardE 16:d0b142ba4362 356 /*******************/
RichardE 16:d0b142ba4362 357 /* WIPE THE CURSOR */
RichardE 16:d0b142ba4362 358 /*******************/
RichardE 16:d0b142ba4362 359 // Pass pointer to Gameduino to display on in gd.
RichardE 16:d0b142ba4362 360 // Pass cell to draw in cell.
RichardE 16:d0b142ba4362 361 void HighScoreEntry::WipeCursor( Gameduino *gd, FieldCell *cell ) {
RichardE 16:d0b142ba4362 362 if( cell != (FieldCell*)NULL ) {
RichardE 16:d0b142ba4362 363 CharFrame::Wipe( gd, cell->Rect.X1, cell->Rect.Y1, cell->Rect.GetWidth(), cell->Rect.GetHeight() );
RichardE 16:d0b142ba4362 364 }
RichardE 16:d0b142ba4362 365 }
RichardE 16:d0b142ba4362 366
RichardE 16:d0b142ba4362 367 /*******************/
RichardE 16:d0b142ba4362 368 /* DRAW THE CURSOR */
RichardE 16:d0b142ba4362 369 /*******************/
RichardE 16:d0b142ba4362 370 // Pass pointer to Gameduino to display on in gd.
RichardE 16:d0b142ba4362 371 // Pass cell to draw in cell.
RichardE 16:d0b142ba4362 372 void HighScoreEntry::DrawCursor( Gameduino *gd, FieldCell *cell ) {
RichardE 16:d0b142ba4362 373 if( cell != (FieldCell*)NULL ) {
RichardE 16:d0b142ba4362 374 CharFrame::Draw( gd, cell->Rect.X1, cell->Rect.Y1, cell->Rect.GetWidth(), cell->Rect.GetHeight() );
RichardE 16:d0b142ba4362 375 }
RichardE 16:d0b142ba4362 376 }
RichardE 16:d0b142ba4362 377
RichardE 16:d0b142ba4362 378 /**************************/
RichardE 16:d0b142ba4362 379 /* VALIDATE CURSOR COLUMN */
RichardE 16:d0b142ba4362 380 /**************************/
RichardE 16:d0b142ba4362 381 // If cursor column is beyond end of row then forces it back.
RichardE 16:d0b142ba4362 382 void HighScoreEntry::ValidateCursorColumn( void ) {
RichardE 16:d0b142ba4362 383 FieldRow *row = grid.GetRow( cursorRow );
RichardE 16:d0b142ba4362 384 if( row != (FieldRow*)NULL ) {
RichardE 16:d0b142ba4362 385 UInt8 columnCount = row->GetColumnCount();
RichardE 16:d0b142ba4362 386 if( cursorColumn >= columnCount ) {
RichardE 16:d0b142ba4362 387 cursorColumn = columnCount - 1;
RichardE 16:d0b142ba4362 388 }
RichardE 16:d0b142ba4362 389 }
RichardE 16:d0b142ba4362 390 }