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:
Sat Jun 15 19:27:36 2013 +0000
Revision:
16:d0b142ba4362
Parent:
15:d8ea0c7b7e64
Child:
17:194789db2215
Entering of high scores nearly there. Just requires code to allow you to backspace and confirm when you have finished.

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