Racing Cars game using N5110 LCD and thumb Joystick

Dependencies:   N5110 PowerControl beep mbed

Committer:
el13gs
Date:
Fri May 08 12:58:22 2015 +0000
Revision:
7:edf0f1fcb16b
Parent:
6:289f237b8d90
Child:
8:699055e89c7d
*EXCELLENT WORKING VERSION *

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el13gs 5:243718c3cd8b 1 /**
el13gs 5:243718c3cd8b 2 @file main.cpp
el13gs 5:243718c3cd8b 3 @brief Contains all functions implementations, and main program
el13gs 5:243718c3cd8b 4 */
el13gs 5:243718c3cd8b 5 #include "main.h"
el13gs 4:f9a899c6ac50 6
el13gs 4:f9a899c6ac50 7 int main()
el13gs 4:f9a899c6ac50 8
el13gs 4:f9a899c6ac50 9 {
el13gs 7:edf0f1fcb16b 10 sprintf(soundString,"%s","YES"); //set the Sound Initial String to YES
el13gs 5:243718c3cd8b 11
el13gs 4:f9a899c6ac50 12 calibrateJoystick(); // get centred values of joystick
el13gs 5:243718c3cd8b 13 pollJoystick.attach(&updateJoystick,1.0/10.0); // read joystick 30 times per second
el13gs 5:243718c3cd8b 14
el13gs 5:243718c3cd8b 15 lcd.setXYAddress(0,0);//set the XY address to 0.0 as initialising condition
el13gs 5:243718c3cd8b 16 initTable();//initialise the array table
el13gs 5:243718c3cd8b 17 lcd.init();//initialise LCD screen
el13gs 4:f9a899c6ac50 18 lcd.refresh();
el13gs 7:edf0f1fcb16b 19 start.rise(&startButtonPressed); // Call function startButtonPressed when START button pressed
el13gs 7:edf0f1fcb16b 20 reset.rise(&resetButtonPressed); // Call function resetButtonPressed when RESET button pressed
el13gs 4:f9a899c6ac50 21
el13gs 4:f9a899c6ac50 22
el13gs 4:f9a899c6ac50 23 MainMenu:
el13gs 7:edf0f1fcb16b 24 /* INITIAL DISPLAY IN MAIN MENU */
el13gs 7:edf0f1fcb16b 25 calibrateJoystick(); // calibrate the Joystick
el13gs 7:edf0f1fcb16b 26 int menuPointer=1; // set the Pointer in Main Menu initially to 1
el13gs 7:edf0f1fcb16b 27 startButtonFlag=0; // reset the pointing flags
el13gs 7:edf0f1fcb16b 28 resetButtonFlag=0; // reset the pointing flags
el13gs 7:edf0f1fcb16b 29 clearCells(84,48); // clear the whole Screen Cells
el13gs 7:edf0f1fcb16b 30 lcd.refresh(); // refresh are done after and before setting or clearing Pixels
el13gs 7:edf0f1fcb16b 31 lcd.drawCircle(22,19,2,1); //initial condition draw pointer around Play submenu
el13gs 7:edf0f1fcb16b 32 lcd.drawCircle(53,19,2,1); //initial condition draw pointer around Play submenu
el13gs 7:edf0f1fcb16b 33
el13gs 4:f9a899c6ac50 34 lcd.printString("MAIN MENU",15,0); //print title
el13gs 4:f9a899c6ac50 35 lcd.printString("Play",26,2); //print submenu title
el13gs 4:f9a899c6ac50 36 lcd.printString("Options",20,3); //print submenu title
el13gs 4:f9a899c6ac50 37 lcd.drawLine(15,9,65,9,1);//underline main menu title
el13gs 4:f9a899c6ac50 38
el13gs 7:edf0f1fcb16b 39 /* While start Button is not pressed user can navigate through main Menu Submenus */
el13gs 6:289f237b8d90 40 while(startButtonFlag==0) {
el13gs 4:f9a899c6ac50 41
el13gs 7:edf0f1fcb16b 42 /* when joystick moves down, pointer selects Options subMenu */
el13gs 4:f9a899c6ac50 43 if (joystick.direction==DOWN) {
el13gs 4:f9a899c6ac50 44 lcd.drawCircle(16,27,2,1); //draw pointer around Options submenu when selected
el13gs 4:f9a899c6ac50 45 lcd.drawCircle(64,27,2,1); //draw pointer around Options submenu when selected
el13gs 4:f9a899c6ac50 46
el13gs 7:edf0f1fcb16b 47 lcd.clearCircle(53,19,2,1); //clear pointer around Play submenu
el13gs 7:edf0f1fcb16b 48 lcd.clearCircle(22,19,2,1); //clear pointer around Play submenu
el13gs 4:f9a899c6ac50 49
el13gs 7:edf0f1fcb16b 50 menuPointer=2; //set Pointer to 2
el13gs 7:edf0f1fcb16b 51 }
el13gs 7:edf0f1fcb16b 52 wait(0.25); // some delay between joystick movement
el13gs 4:f9a899c6ac50 53
el13gs 7:edf0f1fcb16b 54 /* when joystick moves up, pointer selects Options subMenu */
el13gs 4:f9a899c6ac50 55 if(joystick.direction==UP) {
el13gs 4:f9a899c6ac50 56 lcd.drawCircle(22,19,2,1); //draw pointer around Play submenu when selected
el13gs 4:f9a899c6ac50 57 lcd.drawCircle(53,19,2,1); //draw pointer around Play submenu when selected
el13gs 4:f9a899c6ac50 58
el13gs 7:edf0f1fcb16b 59 lcd.clearCircle(16,27,2,1); //clear pointer around Options submenu
el13gs 7:edf0f1fcb16b 60 lcd.clearCircle(64,27,2,1); //clear pointer around Options submenu
el13gs 7:edf0f1fcb16b 61 menuPointer=1; //set Pointer to 1
el13gs 4:f9a899c6ac50 62 }
el13gs 4:f9a899c6ac50 63 }
el13gs 4:f9a899c6ac50 64
el13gs 7:edf0f1fcb16b 65 /* SELECT POINTER CONDITION */
el13gs 5:243718c3cd8b 66 switch(menuPointer) {
el13gs 4:f9a899c6ac50 67
el13gs 7:edf0f1fcb16b 68 /* Case when Play was selected */
el13gs 4:f9a899c6ac50 69 case 1:
el13gs 7:edf0f1fcb16b 70 /*INITIAL GAME CONDITIONS */
el13gs 7:edf0f1fcb16b 71 startButtonFlag=0; //reset start Button Flag
el13gs 7:edf0f1fcb16b 72 gamePlays=1; // Begin the game with pointer set to 1
el13gs 7:edf0f1fcb16b 73 lives=5; // set lives to 5
el13gs 7:edf0f1fcb16b 74 round=1; // set round number to 1
el13gs 7:edf0f1fcb16b 75 coins=0; // set coin number to 0
el13gs 7:edf0f1fcb16b 76 clearCells(84,48); //clear the whole LCD screen
el13gs 7:edf0f1fcb16b 77 gameReset(); // set and draw initial player and enemies position
el13gs 4:f9a899c6ac50 78 lcd.refresh();
el13gs 7:edf0f1fcb16b 79 timer.attach(&movePlayer,0.1);// attach timer to call function that moves the Player
el13gs 5:243718c3cd8b 80
el13gs 4:f9a899c6ac50 81
el13gs 5:243718c3cd8b 82 while(gamePlays) {
el13gs 4:f9a899c6ac50 83
el13gs 7:edf0f1fcb16b 84 //print Round number on buffer and display
el13gs 7:edf0f1fcb16b 85 sprintf(roundBuffer,"%d",round);
el13gs 7:edf0f1fcb16b 86 lcd.printString(roundBuffer,74,3);
el13gs 4:f9a899c6ac50 87
el13gs 7:edf0f1fcb16b 88 //print Lives number on buffer and display
el13gs 7:edf0f1fcb16b 89 sprintf(livesBuffer,"%d",lives);
el13gs 7:edf0f1fcb16b 90 lcd.printString(livesBuffer,74,1);
el13gs 6:289f237b8d90 91
el13gs 7:edf0f1fcb16b 92 //print Coins number on buffer and display
el13gs 7:edf0f1fcb16b 93 sprintf(coinsBuffer,"%d",coins);
el13gs 7:edf0f1fcb16b 94 lcd.printString(coinsBuffer,72,5);
el13gs 4:f9a899c6ac50 95
el13gs 7:edf0f1fcb16b 96 enemy1MovesDown(); //move enemy 1 downwards
el13gs 7:edf0f1fcb16b 97 checkPlayerPos(); //check player position frequently
el13gs 7:edf0f1fcb16b 98 // if gameplay is 0 returns to initial MAIN MENU
el13gs 7:edf0f1fcb16b 99 if (gamePlays==0) {
el13gs 7:edf0f1fcb16b 100 goto MainMenu;
el13gs 7:edf0f1fcb16b 101 }
el13gs 4:f9a899c6ac50 102
el13gs 7:edf0f1fcb16b 103 enemy2MovesDown(); //move enemy 2 downwards
el13gs 4:f9a899c6ac50 104 checkPlayerPos();
el13gs 7:edf0f1fcb16b 105 if (gamePlays==0) {
el13gs 7:edf0f1fcb16b 106 goto MainMenu;
el13gs 7:edf0f1fcb16b 107 }
el13gs 7:edf0f1fcb16b 108
el13gs 7:edf0f1fcb16b 109 enemy3MovesDown(); //move enemy 3 downwards
el13gs 5:243718c3cd8b 110
el13gs 7:edf0f1fcb16b 111 coinMoves(); // move coin downwards
el13gs 5:243718c3cd8b 112 checkPlayerPos();
el13gs 7:edf0f1fcb16b 113 if (gamePlays==0) {
el13gs 7:edf0f1fcb16b 114 goto MainMenu;
el13gs 7:edf0f1fcb16b 115 }
el13gs 4:f9a899c6ac50 116 }
el13gs 7:edf0f1fcb16b 117
el13gs 4:f9a899c6ac50 118 break;
el13gs 4:f9a899c6ac50 119
el13gs 4:f9a899c6ac50 120 case 2:
el13gs 4:f9a899c6ac50 121
el13gs 7:edf0f1fcb16b 122 int optionsMenu=1; // set options Menu enabled
el13gs 4:f9a899c6ac50 123
el13gs 7:edf0f1fcb16b 124 startButtonFlag=0; //reset START Button Flag
el13gs 4:f9a899c6ac50 125
el13gs 7:edf0f1fcb16b 126 clearCells(84,48); // clear all screen Cells
el13gs 4:f9a899c6ac50 127 lcd.refresh();
el13gs 4:f9a899c6ac50 128 wait(0.02);
el13gs 7:edf0f1fcb16b 129 /* PRINT OPTIONS SUBMENU DISPLAY */
el13gs 4:f9a899c6ac50 130 lcd.printString("OPTIONS",18,0);
el13gs 4:f9a899c6ac50 131 lcd.printString("Exit",23,5);
el13gs 4:f9a899c6ac50 132 lcd.printString("Brightness",6,3);
el13gs 4:f9a899c6ac50 133 lcd.printString("Sound",6,2);
el13gs 7:edf0f1fcb16b 134 lcd.drawLine(15,8,61,8,1); //underline Options Menu title
el13gs 4:f9a899c6ac50 135
el13gs 7:edf0f1fcb16b 136 /* Print brightness value ranged from 1 to 10 to user */
el13gs 7:edf0f1fcb16b 137 sprintf(brightnessBuffer,"%d",brightnessDisplay);
el13gs 7:edf0f1fcb16b 138 lcd.printString(brightnessBuffer,68,3);
el13gs 4:f9a899c6ac50 139
el13gs 7:edf0f1fcb16b 140 /* Print Sound string value , "YES" or "NO"*/
el13gs 4:f9a899c6ac50 141 lcd.printString(soundString,40,2);
el13gs 4:f9a899c6ac50 142
el13gs 7:edf0f1fcb16b 143 /* USER NAVIGATES WHILE IN OPTIONS MENU */
el13gs 4:f9a899c6ac50 144 while(optionsMenu) {
el13gs 4:f9a899c6ac50 145
el13gs 7:edf0f1fcb16b 146 /* If direction is up pointer value decrease by 1 (cannot decrease to less than 1) */
el13gs 4:f9a899c6ac50 147 if (joystick.direction==UP) {
el13gs 4:f9a899c6ac50 148 optionsPointer--;
el13gs 4:f9a899c6ac50 149 if(optionsPointer==0) {
el13gs 4:f9a899c6ac50 150 optionsPointer=1;
el13gs 4:f9a899c6ac50 151 }
el13gs 4:f9a899c6ac50 152 }
el13gs 4:f9a899c6ac50 153 wait(0.1);
el13gs 4:f9a899c6ac50 154
el13gs 7:edf0f1fcb16b 155 /* If direction is down pointer value increase by 1 (cannot increase to more than 3) */
el13gs 4:f9a899c6ac50 156 if(joystick.direction==DOWN) {
el13gs 4:f9a899c6ac50 157 optionsPointer++;
el13gs 4:f9a899c6ac50 158 if(optionsPointer>3) {
el13gs 4:f9a899c6ac50 159 optionsPointer=3;
el13gs 4:f9a899c6ac50 160 }
el13gs 4:f9a899c6ac50 161 }
el13gs 7:edf0f1fcb16b 162 /* CASES FOR EACH POINTER VALUE */
el13gs 7:edf0f1fcb16b 163 wait(0.1);
el13gs 7:edf0f1fcb16b 164 /* when it is 1, Sound submenu is selected */
el13gs 4:f9a899c6ac50 165 if (optionsPointer==1) {
el13gs 7:edf0f1fcb16b 166 /* print Circle pointer around Sound submenu */
el13gs 4:f9a899c6ac50 167 lcd.drawCircle(2,19,2,1);
el13gs 4:f9a899c6ac50 168 lcd.clearCircle(2,27,2,1);
el13gs 4:f9a899c6ac50 169 lcd.clearCircle(19,44,2,1);
el13gs 7:edf0f1fcb16b 170 /* if pointer is 1 and joystick direction is left, sound is enabled (=1)*/
el13gs 4:f9a899c6ac50 171 if(joystick.direction==LEFT) {
el13gs 4:f9a899c6ac50 172 sounds=1;
el13gs 4:f9a899c6ac50 173 lcd.refresh();
el13gs 4:f9a899c6ac50 174 sprintf(soundString,"%s","YES");
el13gs 4:f9a899c6ac50 175 lcd.printString(soundString,40,2);
el13gs 4:f9a899c6ac50 176 }
el13gs 7:edf0f1fcb16b 177 /* if pointer is 1 and joystick direction is right, sound is disabled (=0)*/
el13gs 4:f9a899c6ac50 178 if(joystick.direction==RIGHT) {
el13gs 4:f9a899c6ac50 179 sounds=0;
el13gs 4:f9a899c6ac50 180 lcd.refresh();
el13gs 7:edf0f1fcb16b 181 sprintf(soundString,"%s","NO "); //print string in buffer
el13gs 7:edf0f1fcb16b 182 lcd.printString(soundString,40,2); //display value of buffer
el13gs 4:f9a899c6ac50 183 }
el13gs 4:f9a899c6ac50 184
el13gs 4:f9a899c6ac50 185 }
el13gs 7:edf0f1fcb16b 186 /* when it is 2, brightness submenu is selected */
el13gs 4:f9a899c6ac50 187 if (optionsPointer==2) {
el13gs 7:edf0f1fcb16b 188 /* print Circle pointer around Brightness submenu */
el13gs 4:f9a899c6ac50 189 lcd.drawCircle(2,27,2,1);
el13gs 4:f9a899c6ac50 190 lcd.clearCircle(2,19,2,1);
el13gs 4:f9a899c6ac50 191 lcd.clearCircle(19,44,2,1);
el13gs 4:f9a899c6ac50 192
el13gs 7:edf0f1fcb16b 193 /* if pointer is 2 and joystick direction is left, brightness decreases by 0.1*/
el13gs 4:f9a899c6ac50 194 if(joystick.direction==LEFT) {
el13gs 4:f9a899c6ac50 195 brightness=brightness-.1;
el13gs 7:edf0f1fcb16b 196 brightnessDisplay=brightnessDisplay-1; // user displayed value also decrease
el13gs 7:edf0f1fcb16b 197 if(brightness<0.1||brightnessDisplay<0) { // brightnessDisplay and brightness never go below 0 and 0.1 respectively
el13gs 4:f9a899c6ac50 198 brightnessDisplay=1;
el13gs 4:f9a899c6ac50 199 brightness=0.1;
el13gs 4:f9a899c6ac50 200 }
el13gs 7:edf0f1fcb16b 201 lcd.setBrightness(brightness); //sets the brightness
el13gs 4:f9a899c6ac50 202
el13gs 7:edf0f1fcb16b 203 /* print brightness Display on screen */
el13gs 7:edf0f1fcb16b 204 sprintf(brightnessBuffer,"%d",brightnessDisplay);
el13gs 7:edf0f1fcb16b 205 lcd.printString(brightnessBuffer,68,3);
el13gs 4:f9a899c6ac50 206 }
el13gs 4:f9a899c6ac50 207
el13gs 7:edf0f1fcb16b 208 /* if pointer is 2 and joystick direction is right, brightness increases by 0.1*/
el13gs 4:f9a899c6ac50 209 if(joystick.direction==RIGHT) {
el13gs 4:f9a899c6ac50 210 brightness=brightness+.1;
el13gs 7:edf0f1fcb16b 211 brightnessDisplay=brightnessDisplay+1; // user displayed value also increase
el13gs 7:edf0f1fcb16b 212 if(brightness>0.9||brightnessDisplay>9) {// brightnessDisplay and brightness never go above 9 and 0.9 respectively
el13gs 4:f9a899c6ac50 213 brightnessDisplay=9;
el13gs 4:f9a899c6ac50 214 brightness=0.9;
el13gs 4:f9a899c6ac50 215 }
el13gs 7:edf0f1fcb16b 216 lcd.setBrightness(brightness); //sets the brightness
el13gs 4:f9a899c6ac50 217
el13gs 7:edf0f1fcb16b 218 /* print brightness Display on screen */
el13gs 7:edf0f1fcb16b 219 sprintf(brightnessBuffer,"%d",brightnessDisplay);
el13gs 7:edf0f1fcb16b 220 lcd.printString(brightnessBuffer,68,3);
el13gs 4:f9a899c6ac50 221 }
el13gs 4:f9a899c6ac50 222
el13gs 4:f9a899c6ac50 223 }
el13gs 4:f9a899c6ac50 224 if (optionsPointer==3) {
el13gs 7:edf0f1fcb16b 225 /* print Circle pointer around Exit submenu */
el13gs 4:f9a899c6ac50 226 lcd.drawCircle(19,44,2,1);
el13gs 4:f9a899c6ac50 227 lcd.clearCircle(2,19,2,1);
el13gs 4:f9a899c6ac50 228 lcd.clearCircle(2,27,2,1);
el13gs 4:f9a899c6ac50 229
el13gs 7:edf0f1fcb16b 230 /* if START button is press while pointer is on Exit goes back to Main Menu label */
el13gs 6:289f237b8d90 231 if(startButtonFlag) {
el13gs 7:edf0f1fcb16b 232 wait(0.1);
el13gs 6:289f237b8d90 233 startButtonFlag=0;
el13gs 7:edf0f1fcb16b 234 optionsMenu=0;
el13gs 4:f9a899c6ac50 235 goto MainMenu;
el13gs 4:f9a899c6ac50 236 }
el13gs 4:f9a899c6ac50 237 }
el13gs 5:243718c3cd8b 238 wait(0.1);
el13gs 4:f9a899c6ac50 239
el13gs 4:f9a899c6ac50 240 }
el13gs 4:f9a899c6ac50 241 break;
el13gs 4:f9a899c6ac50 242 }
el13gs 4:f9a899c6ac50 243 }
el13gs 4:f9a899c6ac50 244
el13gs 6:289f237b8d90 245 void startButtonPressed()
el13gs 4:f9a899c6ac50 246 {
el13gs 6:289f237b8d90 247 startButtonFlag=!startButtonFlag;
el13gs 4:f9a899c6ac50 248 }
el13gs 4:f9a899c6ac50 249
el13gs 6:289f237b8d90 250 void resetButtonPressed()
el13gs 6:289f237b8d90 251 {
el13gs 6:289f237b8d90 252 resetButtonFlag=!resetButtonFlag;
el13gs 6:289f237b8d90 253 }
el13gs 6:289f237b8d90 254
el13gs 4:f9a899c6ac50 255 void movePlayer()
el13gs 4:f9a899c6ac50 256 {
el13gs 4:f9a899c6ac50 257 if (gamePlays) {
el13gs 4:f9a899c6ac50 258 //lcd.refresh();
el13gs 4:f9a899c6ac50 259 if (joystick.direction==RIGHT&&x+w<58) {
el13gs 4:f9a899c6ac50 260
el13gs 5:243718c3cd8b 261 clearRect(x,v,w,h);
el13gs 5:243718c3cd8b 262 lcd.refresh();
el13gs 4:f9a899c6ac50 263 x=x+4;
el13gs 4:f9a899c6ac50 264 lcd.drawRect(x,v,w,h,0);
el13gs 4:f9a899c6ac50 265 lcd.refresh();
el13gs 4:f9a899c6ac50 266 }
el13gs 4:f9a899c6ac50 267
el13gs 4:f9a899c6ac50 268 if (joystick.direction==LEFT&&x+w>10) {
el13gs 4:f9a899c6ac50 269
el13gs 5:243718c3cd8b 270 clearRect(x,v,w,h);
el13gs 5:243718c3cd8b 271 lcd.refresh();
el13gs 4:f9a899c6ac50 272 x=x-4;
el13gs 5:243718c3cd8b 273
el13gs 4:f9a899c6ac50 274 lcd.drawRect(x,v,w,h,0);
el13gs 5:243718c3cd8b 275 lcd.refresh();
el13gs 4:f9a899c6ac50 276 }
el13gs 4:f9a899c6ac50 277
el13gs 4:f9a899c6ac50 278 if (joystick.direction==UP && v>2) {
el13gs 4:f9a899c6ac50 279
el13gs 5:243718c3cd8b 280 clearRect(x,v,w,h);
el13gs 5:243718c3cd8b 281 lcd.refresh();
el13gs 4:f9a899c6ac50 282 v=v-4;
el13gs 4:f9a899c6ac50 283 lcd.drawRect(x,v,w,h,0);
el13gs 5:243718c3cd8b 284 lcd.refresh();
el13gs 4:f9a899c6ac50 285 }
el13gs 4:f9a899c6ac50 286 if (joystick.direction==DOWN && v<32) {
el13gs 5:243718c3cd8b 287 clearRect(x,v,w,h);
el13gs 5:243718c3cd8b 288 lcd.refresh();
el13gs 4:f9a899c6ac50 289 v=v+4;
el13gs 4:f9a899c6ac50 290 lcd.drawRect(x,v,w,h,0);
el13gs 5:243718c3cd8b 291 lcd.refresh();
el13gs 4:f9a899c6ac50 292 }
el13gs 4:f9a899c6ac50 293
el13gs 4:f9a899c6ac50 294 }
el13gs 4:f9a899c6ac50 295 }
el13gs 4:f9a899c6ac50 296
el13gs 4:f9a899c6ac50 297 void calibrateJoystick()
el13gs 4:f9a899c6ac50 298 {
el13gs 4:f9a899c6ac50 299 button.mode(PullDown);
el13gs 4:f9a899c6ac50 300 // must not move during calibration
el13gs 4:f9a899c6ac50 301 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
el13gs 4:f9a899c6ac50 302 joystick.y0 = yPot;
el13gs 4:f9a899c6ac50 303 }
el13gs 4:f9a899c6ac50 304 void updateJoystick()
el13gs 4:f9a899c6ac50 305 {
el13gs 4:f9a899c6ac50 306 joystick.x = xPot - joystick.x0;
el13gs 4:f9a899c6ac50 307 joystick.y = yPot - joystick.y0;
el13gs 4:f9a899c6ac50 308 // read button state
el13gs 4:f9a899c6ac50 309 joystick.button = button;
el13gs 4:f9a899c6ac50 310
el13gs 4:f9a899c6ac50 311 // calculate direction depending on x,y values
el13gs 4:f9a899c6ac50 312 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
el13gs 4:f9a899c6ac50 313 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 314 joystick.direction = CENTRE;
el13gs 4:f9a899c6ac50 315 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 316 joystick.direction = UP;
el13gs 4:f9a899c6ac50 317 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 318 joystick.direction = DOWN;
el13gs 4:f9a899c6ac50 319 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 320 joystick.direction = LEFT;
el13gs 4:f9a899c6ac50 321 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
el13gs 4:f9a899c6ac50 322 joystick.direction = RIGHT;
el13gs 4:f9a899c6ac50 323 } else {
el13gs 4:f9a899c6ac50 324 joystick.direction = UNKNOWN;
el13gs 4:f9a899c6ac50 325 }
el13gs 4:f9a899c6ac50 326
el13gs 4:f9a899c6ac50 327 // set flag for printing
el13gs 4:f9a899c6ac50 328 printFlag = 1;
el13gs 4:f9a899c6ac50 329 }
el13gs 4:f9a899c6ac50 330
el13gs 4:f9a899c6ac50 331
el13gs 5:243718c3cd8b 332 void clearRect(int x,int v,int w,int h)
el13gs 4:f9a899c6ac50 333 {
el13gs 4:f9a899c6ac50 334 for(int i=x; i<=x+w; i++) {
el13gs 4:f9a899c6ac50 335 for(int j=v; j<=v+h; j++) {
el13gs 4:f9a899c6ac50 336 lcd.clearPixel(i,j);
el13gs 4:f9a899c6ac50 337 table[i][j]=0;
el13gs 4:f9a899c6ac50 338 }
el13gs 4:f9a899c6ac50 339 }
el13gs 4:f9a899c6ac50 340 }
el13gs 4:f9a899c6ac50 341
el13gs 4:f9a899c6ac50 342
el13gs 4:f9a899c6ac50 343 void enemy1MovesDown()
el13gs 4:f9a899c6ac50 344 {
el13gs 6:289f237b8d90 345 clearRect(enemy1x,(j-a),w,h);
el13gs 5:243718c3cd8b 346 lcd.refresh();
el13gs 4:f9a899c6ac50 347 lcd.drawRect(enemy1x,j,w,h,1);
el13gs 5:243718c3cd8b 348 lcd.refresh();
el13gs 5:243718c3cd8b 349 setRectCells(enemy1x,j,w,h);
el13gs 5:243718c3cd8b 350 lcd.refresh();
el13gs 4:f9a899c6ac50 351 wait(0.05);
el13gs 4:f9a899c6ac50 352
el13gs 6:289f237b8d90 353 j=j+a;
el13gs 5:243718c3cd8b 354 //lcd.refresh();
el13gs 4:f9a899c6ac50 355
el13gs 4:f9a899c6ac50 356 if(j>60) {
el13gs 4:f9a899c6ac50 357 j=-(rand()%100+80);
el13gs 4:f9a899c6ac50 358 }
el13gs 4:f9a899c6ac50 359
el13gs 4:f9a899c6ac50 360 }
el13gs 4:f9a899c6ac50 361
el13gs 4:f9a899c6ac50 362 void enemy2MovesDown()
el13gs 4:f9a899c6ac50 363 {
el13gs 6:289f237b8d90 364 clearRect(enemy2x,(p-a),w,h);
el13gs 5:243718c3cd8b 365 lcd.refresh();
el13gs 4:f9a899c6ac50 366 lcd.drawRect(enemy2x,p,w,h,1);
el13gs 5:243718c3cd8b 367 lcd.refresh();
el13gs 5:243718c3cd8b 368 setRectCells(enemy2x,p,w,h);
el13gs 5:243718c3cd8b 369 lcd.refresh();
el13gs 4:f9a899c6ac50 370 wait(0.05);
el13gs 6:289f237b8d90 371 p=p+a;
el13gs 5:243718c3cd8b 372 //lcd.refresh();
el13gs 4:f9a899c6ac50 373
el13gs 4:f9a899c6ac50 374 if(p>60) {
el13gs 4:f9a899c6ac50 375 p=-(rand()%40+20);
el13gs 4:f9a899c6ac50 376 }
el13gs 4:f9a899c6ac50 377 while(p==q) {
el13gs 4:f9a899c6ac50 378 p=-(rand()%40+20);
el13gs 4:f9a899c6ac50 379 }
el13gs 4:f9a899c6ac50 380
el13gs 4:f9a899c6ac50 381 }
el13gs 4:f9a899c6ac50 382
el13gs 4:f9a899c6ac50 383 void enemy3MovesDown()
el13gs 4:f9a899c6ac50 384 {
el13gs 6:289f237b8d90 385 clearRect(enemy3x,(q-a),w,h);
el13gs 5:243718c3cd8b 386 lcd.refresh();
el13gs 4:f9a899c6ac50 387 lcd.drawRect(enemy3x,q,w,h,1);
el13gs 5:243718c3cd8b 388 lcd.refresh();
el13gs 5:243718c3cd8b 389 setRectCells(enemy3x,q,w,h);
el13gs 5:243718c3cd8b 390 lcd.refresh();
el13gs 4:f9a899c6ac50 391 wait(0.05);
el13gs 4:f9a899c6ac50 392 lcd.refresh();
el13gs 6:289f237b8d90 393 q=q+a;
el13gs 4:f9a899c6ac50 394 if (q>70) {
el13gs 4:f9a899c6ac50 395 q=-(rand()%10+1);
el13gs 4:f9a899c6ac50 396 }
el13gs 4:f9a899c6ac50 397
el13gs 4:f9a899c6ac50 398 }
el13gs 4:f9a899c6ac50 399
el13gs 5:243718c3cd8b 400 void setRectCells(int x,int v,int w,int h)
el13gs 4:f9a899c6ac50 401 {
el13gs 4:f9a899c6ac50 402
el13gs 4:f9a899c6ac50 403 for(int i=x; i<=x+w; i++) {
el13gs 4:f9a899c6ac50 404 for(int j=v; j<=v+h; j++) {
el13gs 4:f9a899c6ac50 405 if(j>0&&j<48) {
el13gs 4:f9a899c6ac50 406 table[i][j]=1;
el13gs 4:f9a899c6ac50 407 }
el13gs 4:f9a899c6ac50 408 }
el13gs 4:f9a899c6ac50 409 }
el13gs 4:f9a899c6ac50 410 }
el13gs 4:f9a899c6ac50 411
el13gs 4:f9a899c6ac50 412 void initTable()
el13gs 4:f9a899c6ac50 413 {
el13gs 5:243718c3cd8b 414 for (int i=0; i<=83; i++) {
el13gs 5:243718c3cd8b 415 for(int j=0; j<=47; j++) {
el13gs 4:f9a899c6ac50 416 table[i][j]=0;
el13gs 4:f9a899c6ac50 417 }
el13gs 4:f9a899c6ac50 418 }
el13gs 4:f9a899c6ac50 419 }
el13gs 4:f9a899c6ac50 420
el13gs 4:f9a899c6ac50 421 void checkPlayerPos()
el13gs 4:f9a899c6ac50 422 {
el13gs 4:f9a899c6ac50 423 if (table[x+w][v+h]==1||table[x][v+h]==1||table[x][v]==1||table[x+w][v]==1) {
el13gs 4:f9a899c6ac50 424 loose();
el13gs 4:f9a899c6ac50 425 }
el13gs 4:f9a899c6ac50 426 if (table[x+w][v+h]==2||table[x][v+h]==2||table[x][v]==2||table[x+w][v]==2) {
el13gs 5:243718c3cd8b 427 coins=coins+5;
el13gs 5:243718c3cd8b 428 clearCoin(c);
el13gs 4:f9a899c6ac50 429 if(sounds) {
el13gs 4:f9a899c6ac50 430 buzzer.beep(2200,0.4);
el13gs 4:f9a899c6ac50 431 buzzer.beep(1000,0.2);
el13gs 7:edf0f1fcb16b 432 lcd.setBrightness(brightness);
el13gs 4:f9a899c6ac50 433 }
el13gs 5:243718c3cd8b 434 coinAppear=0;
el13gs 5:243718c3cd8b 435
el13gs 7:edf0f1fcb16b 436 if(coins==30) {
el13gs 6:289f237b8d90 437 round=2;
el13gs 6:289f237b8d90 438 gamePlays=0;
el13gs 6:289f237b8d90 439 clearCells(84,48);
el13gs 6:289f237b8d90 440 lcd.refresh();
el13gs 6:289f237b8d90 441 lcd.printString("ROUND 2",10,2);
el13gs 6:289f237b8d90 442 wait(1);
el13gs 6:289f237b8d90 443 clearCells(84,48);
el13gs 6:289f237b8d90 444 lcd.refresh();
el13gs 6:289f237b8d90 445 gamePlays=1;
el13gs 7:edf0f1fcb16b 446 gameReset();
el13gs 6:289f237b8d90 447 a=6;
el13gs 6:289f237b8d90 448 }
el13gs 6:289f237b8d90 449 if(coins==70) {
el13gs 6:289f237b8d90 450 round=3;
el13gs 6:289f237b8d90 451 gamePlays=0;
el13gs 6:289f237b8d90 452 clearCells(84,48);
el13gs 6:289f237b8d90 453 lcd.refresh();
el13gs 6:289f237b8d90 454 lcd.printString("ROUND 3",10,2);
el13gs 6:289f237b8d90 455 wait(1);
el13gs 6:289f237b8d90 456 clearCells(84,48);
el13gs 6:289f237b8d90 457 lcd.refresh();
el13gs 6:289f237b8d90 458 gamePlays=1;
el13gs 7:edf0f1fcb16b 459 gameReset();
el13gs 6:289f237b8d90 460 a=8;
el13gs 6:289f237b8d90 461 }
el13gs 6:289f237b8d90 462 if(coins==90) {
el13gs 7:edf0f1fcb16b 463 lcd.printString("YOU WIN!",8,3);
el13gs 6:289f237b8d90 464 wait(3);
el13gs 6:289f237b8d90 465 gamePlays=0;
el13gs 6:289f237b8d90 466 }
el13gs 4:f9a899c6ac50 467 }
el13gs 4:f9a899c6ac50 468 }
el13gs 4:f9a899c6ac50 469
el13gs 4:f9a899c6ac50 470
el13gs 4:f9a899c6ac50 471 void coinMoves()
el13gs 4:f9a899c6ac50 472 {
el13gs 6:289f237b8d90 473 if(table[xPos][c]==1) { //prevent coin from appearing above enemies
el13gs 6:289f237b8d90 474 coinAppear=0;
el13gs 6:289f237b8d90 475 }
el13gs 4:f9a899c6ac50 476 clearCoin(c);
el13gs 6:289f237b8d90 477 c=c+4;
el13gs 4:f9a899c6ac50 478 drawCoin(c);
el13gs 5:243718c3cd8b 479 if(c>80) {
el13gs 6:289f237b8d90 480 c=-(rand()%10);
el13gs 6:289f237b8d90 481 xPos=rand()%52+4;
el13gs 4:f9a899c6ac50 482 coinAppear=1;
el13gs 4:f9a899c6ac50 483 }
el13gs 4:f9a899c6ac50 484 }
el13gs 4:f9a899c6ac50 485
el13gs 4:f9a899c6ac50 486 void drawCoin(int c)
el13gs 4:f9a899c6ac50 487 {
el13gs 6:289f237b8d90 488 if (c>4&&c<48&&coinAppear==1) {
el13gs 6:289f237b8d90 489 lcd.drawCircle(xPos,c,4,0); //Draw Coin Circle Pixels
el13gs 6:289f237b8d90 490 setCircleCells(xPos,c,4);// Set Coin array's cells values to 2
el13gs 4:f9a899c6ac50 491
el13gs 6:289f237b8d90 492 // "c" character Print on coin
el13gs 4:f9a899c6ac50 493 lcd.setPixel(xPos,c-1);
el13gs 4:f9a899c6ac50 494 lcd.setPixel(xPos,c+2);
el13gs 4:f9a899c6ac50 495 lcd.setPixel(xPos+1,c-1);
el13gs 4:f9a899c6ac50 496 lcd.setPixel(xPos+1,c+2);
el13gs 4:f9a899c6ac50 497 lcd.setPixel(xPos-1,c);
el13gs 4:f9a899c6ac50 498 lcd.setPixel(xPos-1,c+1);
el13gs 5:243718c3cd8b 499
el13gs 4:f9a899c6ac50 500 lcd.refresh();
el13gs 4:f9a899c6ac50 501 }
el13gs 4:f9a899c6ac50 502 }
el13gs 4:f9a899c6ac50 503
el13gs 4:f9a899c6ac50 504 void clearCoin(int c)
el13gs 4:f9a899c6ac50 505 {
el13gs 6:289f237b8d90 506 if(c>4&&c<48&&coinAppear==1) {
el13gs 7:edf0f1fcb16b 507 lcd.clearCircle(xPos,c,4,1); //Clear the Coin
el13gs 6:289f237b8d90 508 clearCircleCells(xPos,c,4);// Set Coin array's cells values to 0
el13gs 6:289f237b8d90 509 lcd.refresh();
el13gs 6:289f237b8d90 510 }
el13gs 4:f9a899c6ac50 511 }
el13gs 4:f9a899c6ac50 512
el13gs 4:f9a899c6ac50 513
el13gs 4:f9a899c6ac50 514 void setCircleCells(int x0,int y0,int radius)
el13gs 4:f9a899c6ac50 515 {
el13gs 6:289f237b8d90 516 //function from N5110 Library
el13gs 4:f9a899c6ac50 517 int x = radius;
el13gs 4:f9a899c6ac50 518 int y = 0;
el13gs 4:f9a899c6ac50 519
el13gs 6:289f237b8d90 520 while(x >= y) {
el13gs 4:f9a899c6ac50 521
el13gs 6:289f237b8d90 522 setLineCells(x+x0,y+y0,-x+x0,y+y0,0); //set line's Cells values to 2
el13gs 6:289f237b8d90 523 setLineCells(y+x0,x+y0,-y+x0,x+y0,0);//set line's Cells values to 2
el13gs 6:289f237b8d90 524 setLineCells(y+x0,-x+y0,-y+x0,-x+y0,0);//set line's Cells values to 2
el13gs 6:289f237b8d90 525 setLineCells(x+x0,-y+y0,-x+x0,-y+y0,0);//set line's Cells values to 2
el13gs 4:f9a899c6ac50 526
el13gs 6:289f237b8d90 527 y++;
el13gs 4:f9a899c6ac50 528 }
el13gs 4:f9a899c6ac50 529 }
el13gs 4:f9a899c6ac50 530
el13gs 4:f9a899c6ac50 531 void clearCircleCells(int x0,int y0,int radius)
el13gs 4:f9a899c6ac50 532 {
el13gs 6:289f237b8d90 533 //function from N5110 Library
el13gs 4:f9a899c6ac50 534 int x = radius;
el13gs 4:f9a899c6ac50 535 int y = 0;
el13gs 4:f9a899c6ac50 536
el13gs 4:f9a899c6ac50 537 while(x >= y) {
el13gs 6:289f237b8d90 538 clearLineCells(x+x0,y+y0,-x+x0,y+y0,0);
el13gs 6:289f237b8d90 539 clearLineCells(y+x0,x+y0,-y+x0,x+y0,0);
el13gs 6:289f237b8d90 540 clearLineCells(y+x0,-x+y0,-y+x0,-x+y0,0);
el13gs 6:289f237b8d90 541 clearLineCells(x+x0,-y+y0,-x+x0,-y+y0,0);
el13gs 4:f9a899c6ac50 542 y++;
el13gs 4:f9a899c6ac50 543 }
el13gs 4:f9a899c6ac50 544 }
el13gs 4:f9a899c6ac50 545
el13gs 4:f9a899c6ac50 546 void clearCells(int x,int y)
el13gs 4:f9a899c6ac50 547 {
el13gs 4:f9a899c6ac50 548 for(int i=0; i<=x; i++) {
el13gs 4:f9a899c6ac50 549 for (int j=0; j<=y; j++) {
el13gs 4:f9a899c6ac50 550 lcd.clearPixel(i,j);
el13gs 4:f9a899c6ac50 551 table[i][j]=0;
el13gs 4:f9a899c6ac50 552 }
el13gs 4:f9a899c6ac50 553 }
el13gs 5:243718c3cd8b 554 lcd.refresh();
el13gs 4:f9a899c6ac50 555 }
el13gs 4:f9a899c6ac50 556
el13gs 4:f9a899c6ac50 557 void loose()
el13gs 4:f9a899c6ac50 558 {
el13gs 4:f9a899c6ac50 559 if (sounds) {
el13gs 5:243718c3cd8b 560 buzzer.beep(500,0.2);
el13gs 7:edf0f1fcb16b 561 lcd.setBrightness(brightness);
el13gs 4:f9a899c6ac50 562 }
el13gs 7:edf0f1fcb16b 563 timer.detach();
el13gs 4:f9a899c6ac50 564 lives=lives-1;
el13gs 7:edf0f1fcb16b 565 startButtonFlag=0;
el13gs 7:edf0f1fcb16b 566 resetButtonFlag=0;
el13gs 5:243718c3cd8b 567 if(lives==0) {
el13gs 7:edf0f1fcb16b 568
el13gs 5:243718c3cd8b 569 clearCells(84,48);
el13gs 5:243718c3cd8b 570 lcd.refresh();
el13gs 5:243718c3cd8b 571 lcd.clear();
el13gs 5:243718c3cd8b 572
el13gs 7:edf0f1fcb16b 573 wait(1);
el13gs 6:289f237b8d90 574 while(startButtonFlag==0&&resetButtonFlag==0) {
el13gs 6:289f237b8d90 575 lcd.printString("Game Over!!!",0,0);
el13gs 6:289f237b8d90 576 lcd.printString("Press START",0,2);
el13gs 6:289f237b8d90 577 lcd.printString("to try again",0,3);
el13gs 6:289f237b8d90 578 lcd.printString("or RESET",0,4);
el13gs 6:289f237b8d90 579 lcd.printString("to exit :)",0,5);
el13gs 6:289f237b8d90 580 }
el13gs 6:289f237b8d90 581 if(startButtonFlag) {
el13gs 6:289f237b8d90 582 a=4;
el13gs 6:289f237b8d90 583 gamePlays=1;
el13gs 6:289f237b8d90 584 lives=5;
el13gs 6:289f237b8d90 585 coins=0;
el13gs 6:289f237b8d90 586 round=1;
el13gs 6:289f237b8d90 587 clearCells(84,48);
el13gs 7:edf0f1fcb16b 588 gameReset();
el13gs 6:289f237b8d90 589 startButtonFlag=0;
el13gs 6:289f237b8d90 590 wait(1);
el13gs 6:289f237b8d90 591 timer.attach(&movePlayer,0.1);
el13gs 6:289f237b8d90 592 }
el13gs 6:289f237b8d90 593 if (resetButtonFlag) {
el13gs 6:289f237b8d90 594 gamePlays=0;
el13gs 6:289f237b8d90 595 resetButtonFlag=0;
el13gs 6:289f237b8d90 596 }
el13gs 5:243718c3cd8b 597 }
el13gs 4:f9a899c6ac50 598
el13gs 5:243718c3cd8b 599 else {
el13gs 5:243718c3cd8b 600 clearCells(60,48);
el13gs 5:243718c3cd8b 601 lcd.refresh();
el13gs 7:edf0f1fcb16b 602 gameReset();
el13gs 5:243718c3cd8b 603 wait(2);
el13gs 6:289f237b8d90 604 gamePlays=1;
el13gs 7:edf0f1fcb16b 605 timer.attach(&movePlayer,0.1);
el13gs 5:243718c3cd8b 606 }
el13gs 4:f9a899c6ac50 607 }
el13gs 4:f9a899c6ac50 608
el13gs 7:edf0f1fcb16b 609 void gameReset()
el13gs 6:289f237b8d90 610 {
el13gs 6:289f237b8d90 611 initTable();
el13gs 6:289f237b8d90 612 x=26;
el13gs 6:289f237b8d90 613 v=30;
el13gs 6:289f237b8d90 614 lcd.drawRect(x,v,w,h,0);
el13gs 6:289f237b8d90 615 lcd.refresh();
el13gs 6:289f237b8d90 616 j=-70;
el13gs 6:289f237b8d90 617 q=-10;
el13gs 6:289f237b8d90 618 p=-40;
el13gs 7:edf0f1fcb16b 619
el13gs 6:289f237b8d90 620 }
el13gs 6:289f237b8d90 621
el13gs 6:289f237b8d90 622
el13gs 6:289f237b8d90 623 void setLineCells(int x0,int y0,int x1,int y1,int type)
el13gs 6:289f237b8d90 624 {
el13gs 6:289f237b8d90 625 //function from N5110 Library
el13gs 6:289f237b8d90 626 int y_range = y1-y0; // calc range of y and x
el13gs 6:289f237b8d90 627 int x_range = x1-x0;
el13gs 6:289f237b8d90 628 int start,stop,step;
el13gs 6:289f237b8d90 629
el13gs 6:289f237b8d90 630 // if dotted line, set step to 2, else step is 1
el13gs 6:289f237b8d90 631 step = (type==2) ? 2:1;
el13gs 6:289f237b8d90 632
el13gs 6:289f237b8d90 633 // make sure we loop over the largest range to get the most pixels on the display
el13gs 6:289f237b8d90 634 // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels
el13gs 6:289f237b8d90 635 // or else we'll only end up with 1 pixel in the x column
el13gs 6:289f237b8d90 636 if ( abs(x_range) > abs(y_range) ) {
el13gs 6:289f237b8d90 637
el13gs 6:289f237b8d90 638 // ensure we loop from smallest to largest or else for-loop won't run as expected
el13gs 6:289f237b8d90 639 start = x1>x0 ? x0:x1;
el13gs 6:289f237b8d90 640 stop = x1>x0 ? x1:x0;
el13gs 6:289f237b8d90 641
el13gs 6:289f237b8d90 642 // loop between x pixels
el13gs 6:289f237b8d90 643 for (int x = start; x<= stop ; x+=step) {
el13gs 6:289f237b8d90 644 // do linear interpolation
el13gs 6:289f237b8d90 645 int y = y0 + (y1-y0)*(x-x0)/(x1-x0);
el13gs 6:289f237b8d90 646
el13gs 6:289f237b8d90 647 if (type == 0) // if 'white' line, turn off pixel
el13gs 6:289f237b8d90 648 table[x][y]=2;
el13gs 6:289f237b8d90 649 else
el13gs 6:289f237b8d90 650 table[x][y]=2; // else if 'black' or 'dotted' turn on pixel
el13gs 6:289f237b8d90 651
el13gs 6:289f237b8d90 652 }
el13gs 6:289f237b8d90 653 } else {
el13gs 6:289f237b8d90 654
el13gs 6:289f237b8d90 655 // ensure we loop from smallest to largest or else for-loop won't run as expected
el13gs 6:289f237b8d90 656 start = y1>y0 ? y0:y1;
el13gs 6:289f237b8d90 657 stop = y1>y0 ? y1:y0;
el13gs 6:289f237b8d90 658
el13gs 6:289f237b8d90 659 for (int y = start; y<= stop ; y+=step) {
el13gs 6:289f237b8d90 660 // do linear interpolation
el13gs 6:289f237b8d90 661 int x = x0 + (x1-x0)*(y-y0)/(y1-y0);
el13gs 6:289f237b8d90 662
el13gs 6:289f237b8d90 663 if (type == 0) // if 'white' line, turn off pixel
el13gs 6:289f237b8d90 664 table[x][y]=2;
el13gs 6:289f237b8d90 665 else
el13gs 6:289f237b8d90 666 table[x][y]=2; // else if 'black' or 'dotted' turn on pixel
el13gs 6:289f237b8d90 667
el13gs 6:289f237b8d90 668 }
el13gs 6:289f237b8d90 669 }
el13gs 6:289f237b8d90 670
el13gs 6:289f237b8d90 671 }
el13gs 6:289f237b8d90 672
el13gs 6:289f237b8d90 673 void clearLineCells(int x0,int y0,int x1,int y1,int type)
el13gs 6:289f237b8d90 674 {
el13gs 6:289f237b8d90 675 //function from N5110 Library
el13gs 6:289f237b8d90 676 int y_range = y1-y0; // calc range of y and x
el13gs 6:289f237b8d90 677 int x_range = x1-x0;
el13gs 6:289f237b8d90 678 int start,stop,step;
el13gs 6:289f237b8d90 679
el13gs 6:289f237b8d90 680 // if dotted line, set step to 2, else step is 1
el13gs 6:289f237b8d90 681 step = (type==2) ? 2:1;
el13gs 6:289f237b8d90 682
el13gs 6:289f237b8d90 683 // make sure we loop over the largest range to get the most pixels on the display
el13gs 6:289f237b8d90 684 // for instance, if drawing a vertical line (x_range = 0), we need to loop down the y pixels
el13gs 6:289f237b8d90 685 // or else we'll only end up with 1 pixel in the x column
el13gs 6:289f237b8d90 686 if ( abs(x_range) > abs(y_range) ) {
el13gs 6:289f237b8d90 687
el13gs 6:289f237b8d90 688 // ensure we loop from smallest to largest or else for-loop won't run as expected
el13gs 6:289f237b8d90 689 start = x1>x0 ? x0:x1;
el13gs 6:289f237b8d90 690 stop = x1>x0 ? x1:x0;
el13gs 6:289f237b8d90 691
el13gs 6:289f237b8d90 692 // loop between x pixels
el13gs 6:289f237b8d90 693 for (int x = start; x<= stop ; x+=step) {
el13gs 6:289f237b8d90 694 // do linear interpolation
el13gs 6:289f237b8d90 695 int y = y0 + (y1-y0)*(x-x0)/(x1-x0);
el13gs 6:289f237b8d90 696
el13gs 6:289f237b8d90 697 if (type == 0) // if 'white' line, turn off pixel
el13gs 6:289f237b8d90 698 table[x][y]=0;
el13gs 6:289f237b8d90 699 else
el13gs 6:289f237b8d90 700 table[x][y]=0; // else if 'black' or 'dotted' turn on pixel
el13gs 6:289f237b8d90 701
el13gs 6:289f237b8d90 702 }
el13gs 6:289f237b8d90 703 } else {
el13gs 6:289f237b8d90 704
el13gs 6:289f237b8d90 705 // ensure we loop from smallest to largest or else for-loop won't run as expected
el13gs 6:289f237b8d90 706 start = y1>y0 ? y0:y1;
el13gs 6:289f237b8d90 707 stop = y1>y0 ? y1:y0;
el13gs 6:289f237b8d90 708
el13gs 6:289f237b8d90 709 for (int y = start; y<= stop ; y+=step) {
el13gs 6:289f237b8d90 710 // do linear interpolation
el13gs 6:289f237b8d90 711 int x = x0 + (x1-x0)*(y-y0)/(y1-y0);
el13gs 6:289f237b8d90 712
el13gs 6:289f237b8d90 713 if (type == 0) // if 'white' line, turn off pixel
el13gs 6:289f237b8d90 714 table[x][y]=0;
el13gs 6:289f237b8d90 715 else
el13gs 6:289f237b8d90 716 table[x][y]=0; // else if 'black' or 'dotted' turn on pixel
el13gs 6:289f237b8d90 717
el13gs 6:289f237b8d90 718 }
el13gs 6:289f237b8d90 719 }
el13gs 6:289f237b8d90 720 }