A Demo Tap-Game for the 4D Systems GEN4-24PT touch display

Dependencies:   mbed uLCD_4D_Picaso

Committer:
csteinmetz
Date:
Wed Nov 02 20:58:36 2016 +0000
Revision:
0:2254d7e8172a
DEMO GAME

Who changed what in which revision?

UserRevisionLine numberNew contents of line
csteinmetz 0:2254d7e8172a 1 #include "mbed.h"
csteinmetz 0:2254d7e8172a 2 #include "uLCD_4D_Picaso.h"
csteinmetz 0:2254d7e8172a 3 #include <iostream>
csteinmetz 0:2254d7e8172a 4 #include <queue>
csteinmetz 0:2254d7e8172a 5 #include <math.h>
csteinmetz 0:2254d7e8172a 6
csteinmetz 0:2254d7e8172a 7 /**
csteinmetz 0:2254d7e8172a 8 * Demo program for uLCD_4D_Picaso resistance touchscreen
csteinmetz 0:2254d7e8172a 9 * Simple demo game-application on resistive touchscreen display displaying images and using printf.
csteinmetz 0:2254d7e8172a 10 * @version 1.0
csteinmetz 0:2254d7e8172a 11 * @author Christian Steinmetz, Sam Horwich
csteinmetz 0:2254d7e8172a 12 */
csteinmetz 0:2254d7e8172a 13 // three pins are: TX RX RESET
csteinmetz 0:2254d7e8172a 14
csteinmetz 0:2254d7e8172a 15 uLCD_4D_Picaso lcd(p9, p10, p11);
csteinmetz 0:2254d7e8172a 16 uint16_t handle; //for images (countdown 3,2,1)
csteinmetz 0:2254d7e8172a 17 double level=3.0; //current level indicator, level=((game_level+5)/2)
csteinmetz 0:2254d7e8172a 18 int menu=0; //menu==0 --> start menu
csteinmetz 0:2254d7e8172a 19 unsigned long xpos[]={0,40,120,200,40,120,200,40,120,200}; //centers of the nine circular buttons
csteinmetz 0:2254d7e8172a 20 unsigned long ypos[]={0,40,40,40,120,120,120,200,200,200};
csteinmetz 0:2254d7e8172a 21 Timer t; //used for timing later
csteinmetz 0:2254d7e8172a 22 Timer randt; //used as a random number generator
csteinmetz 0:2254d7e8172a 23 int err=0; //error indicator
csteinmetz 0:2254d7e8172a 24 bool redo=0; //true if same pattern shall be displayed after error
csteinmetz 0:2254d7e8172a 25 int games=0; //number of games started
csteinmetz 0:2254d7e8172a 26
csteinmetz 0:2254d7e8172a 27
csteinmetz 0:2254d7e8172a 28 //creates a random integer out of the current time (random as human input is varying)
csteinmetz 0:2254d7e8172a 29 int rnd()
csteinmetz 0:2254d7e8172a 30 {
csteinmetz 0:2254d7e8172a 31 return (int) randt.read_us();
csteinmetz 0:2254d7e8172a 32 }
csteinmetz 0:2254d7e8172a 33
csteinmetz 0:2254d7e8172a 34 //displays the image with name "image.gci" (created from graphics composer) at position (x,y)
csteinmetz 0:2254d7e8172a 35 void disp_im(int x, int y, char * name)
csteinmetz 0:2254d7e8172a 36 {
csteinmetz 0:2254d7e8172a 37 handle=lcd.file_Open(name,'r');
csteinmetz 0:2254d7e8172a 38 lcd.file_Image(x,y,handle);
csteinmetz 0:2254d7e8172a 39 }
csteinmetz 0:2254d7e8172a 40
csteinmetz 0:2254d7e8172a 41 //colors the button number 'pos' in color col
csteinmetz 0:2254d7e8172a 42 void col(int pos, Picaso::Color col)
csteinmetz 0:2254d7e8172a 43 {
csteinmetz 0:2254d7e8172a 44 int j=(pos-1)/3;
csteinmetz 0:2254d7e8172a 45 int i=pos-j*3-1;
csteinmetz 0:2254d7e8172a 46 lcd.gfx_CircleFilled(40+80*i,40+80*j,37, col);
csteinmetz 0:2254d7e8172a 47 }
csteinmetz 0:2254d7e8172a 48
csteinmetz 0:2254d7e8172a 49 //creates the setting of the beginning (white background, 9 black circular buttons)
csteinmetz 0:2254d7e8172a 50 void black()
csteinmetz 0:2254d7e8172a 51 {
csteinmetz 0:2254d7e8172a 52 lcd.gfx_RectangleFilled(0, 0, 240, 320, Picaso::WHITE);
csteinmetz 0:2254d7e8172a 53 for(int i=0;i<3;i++)
csteinmetz 0:2254d7e8172a 54 {
csteinmetz 0:2254d7e8172a 55 for(int j=0;j<3;j++)
csteinmetz 0:2254d7e8172a 56 {
csteinmetz 0:2254d7e8172a 57 lcd.gfx_CircleFilled(40+80*i,40+80*j,37, Picaso::BLACK);
csteinmetz 0:2254d7e8172a 58 }
csteinmetz 0:2254d7e8172a 59 }
csteinmetz 0:2254d7e8172a 60 }
csteinmetz 0:2254d7e8172a 61
csteinmetz 0:2254d7e8172a 62 int main() {
csteinmetz 0:2254d7e8172a 63 randt.start();//for random numbers!
csteinmetz 0:2254d7e8172a 64 wait(1);
csteinmetz 0:2254d7e8172a 65 // change the baudrate to improve or decrease the latency and plotting quality
csteinmetz 0:2254d7e8172a 66 lcd.setbaudWait(Picaso::BAUD_600000);
csteinmetz 0:2254d7e8172a 67
csteinmetz 0:2254d7e8172a 68 //initialize SD card in LCD
csteinmetz 0:2254d7e8172a 69 lcd.file_Mount();
csteinmetz 0:2254d7e8172a 70
csteinmetz 0:2254d7e8172a 71 //text color
csteinmetz 0:2254d7e8172a 72 lcd.txt_FGcolour(Picaso::BLUE);
csteinmetz 0:2254d7e8172a 73
csteinmetz 0:2254d7e8172a 74 //qu: Queue in which the current pattern is stored
csteinmetz 0:2254d7e8172a 75 //qu2: when qu is dequeued bc of human input, qu2 stores the information from qu which may later be needed in case of an error, ...
csteinmetz 0:2254d7e8172a 76 queue <int> qu;
csteinmetz 0:2254d7e8172a 77 queue <int> qu2;
csteinmetz 0:2254d7e8172a 78
csteinmetz 0:2254d7e8172a 79 lcd.touch_Set(0); //initialize touch screen
csteinmetz 0:2254d7e8172a 80 int status = 0; //stores information from touch screen: 0 if untouched, 1 if touched (2 if released, 3 if moved)
csteinmetz 0:2254d7e8172a 81 int oldst = 0; //stores old status (so that only changes in status result in events) [may not be needed here...]
csteinmetz 0:2254d7e8172a 82 unsigned long x = 0;//position of finger contact (updated when screen is touched)
csteinmetz 0:2254d7e8172a 83 unsigned long y = 0;
csteinmetz 0:2254d7e8172a 84 while(1) {
csteinmetz 0:2254d7e8172a 85 if(menu==0) //start menu
csteinmetz 0:2254d7e8172a 86 {
csteinmetz 0:2254d7e8172a 87 lcd.txt_BGcolour(Picaso::ORANGE);
csteinmetz 0:2254d7e8172a 88 lcd.txt_Height(4);
csteinmetz 0:2254d7e8172a 89 lcd.txt_Width(2);
csteinmetz 0:2254d7e8172a 90 lcd.txt_MoveCursor(1,2);
csteinmetz 0:2254d7e8172a 91 lcd.printf(" DEMO-GAME ");
csteinmetz 0:2254d7e8172a 92
csteinmetz 0:2254d7e8172a 93 lcd.txt_Height(3);
csteinmetz 0:2254d7e8172a 94 lcd.txt_Width(1);
csteinmetz 0:2254d7e8172a 95 lcd.txt_MoveCursor(5,9);
csteinmetz 0:2254d7e8172a 96 lcd.printf(" Start Game ");
csteinmetz 0:2254d7e8172a 97
csteinmetz 0:2254d7e8172a 98 lcd.txt_Height(3);
csteinmetz 0:2254d7e8172a 99 lcd.txt_MoveCursor(7,8);
csteinmetz 0:2254d7e8172a 100 lcd.printf(" Instructions ");
csteinmetz 0:2254d7e8172a 101 lcd.txt_Height(1);
csteinmetz 0:2254d7e8172a 102
csteinmetz 0:2254d7e8172a 103 oldst=status;
csteinmetz 0:2254d7e8172a 104 status = lcd.touch_Get(0); //get status from touch screen as explained above
csteinmetz 0:2254d7e8172a 105 if (status&&(oldst==0)) //change in status from 0 to 1
csteinmetz 0:2254d7e8172a 106 {
csteinmetz 0:2254d7e8172a 107 x = lcd.touch_Get(1);
csteinmetz 0:2254d7e8172a 108 y = lcd.touch_Get(2);
csteinmetz 0:2254d7e8172a 109 if(x>70&&x<170&&y>170&&y<230) //start game button-->reset everything
csteinmetz 0:2254d7e8172a 110 {
csteinmetz 0:2254d7e8172a 111 lcd.txt_BGcolour(Picaso::WHITE); //white backgound for texts
csteinmetz 0:2254d7e8172a 112 menu=1; //pattern show mode
csteinmetz 0:2254d7e8172a 113 redo=0; //in the beginning, new pattern shall be created
csteinmetz 0:2254d7e8172a 114 err=0; //no errors in the beginning
csteinmetz 0:2254d7e8172a 115 level=3.0; //beginner's level is 3 (=(game_level+5)/2
csteinmetz 0:2254d7e8172a 116 t.stop(); //reset timer if used before
csteinmetz 0:2254d7e8172a 117 t.reset();
csteinmetz 0:2254d7e8172a 118 lcd.gfx_Cls(); //clear
csteinmetz 0:2254d7e8172a 119 lcd.gfx_RectangleFilled(0, 0, 240, 320, Picaso::WHITE); //white background for screen
csteinmetz 0:2254d7e8172a 120 if(games<5)
csteinmetz 0:2254d7e8172a 121 {
csteinmetz 0:2254d7e8172a 122 disp_im(68,110,"three.gci"); //countdown
csteinmetz 0:2254d7e8172a 123 wait(1);
csteinmetz 0:2254d7e8172a 124 disp_im(68,110,"two.gci");
csteinmetz 0:2254d7e8172a 125 wait(1);
csteinmetz 0:2254d7e8172a 126 disp_im(68,110,"one.gci");
csteinmetz 0:2254d7e8172a 127 wait(1);
csteinmetz 0:2254d7e8172a 128 games++; //needs to be updated/needs to be updated now every time the images are displayed-->see comment below
csteinmetz 0:2254d7e8172a 129 }
csteinmetz 0:2254d7e8172a 130 //countdown without displaying images: memory space allows only to display ~16 of these images, so afterwards the screen would freeze
csteinmetz 0:2254d7e8172a 131 //if we still try to display them-->alternative without images is a text countdown...
csteinmetz 0:2254d7e8172a 132 else
csteinmetz 0:2254d7e8172a 133 {
csteinmetz 0:2254d7e8172a 134 lcd.txt_Height(5);
csteinmetz 0:2254d7e8172a 135 lcd.txt_MoveCursor(2,14);
csteinmetz 0:2254d7e8172a 136 lcd.txt_Width(3);
csteinmetz 0:2254d7e8172a 137 lcd.printf("3");
csteinmetz 0:2254d7e8172a 138 wait(1);
csteinmetz 0:2254d7e8172a 139 lcd.txt_Width(1);
csteinmetz 0:2254d7e8172a 140 lcd.txt_MoveCursor(2,14);
csteinmetz 0:2254d7e8172a 141 lcd.txt_Width(3);
csteinmetz 0:2254d7e8172a 142 lcd.printf("2");
csteinmetz 0:2254d7e8172a 143 wait(1);
csteinmetz 0:2254d7e8172a 144 lcd.txt_Width(1);
csteinmetz 0:2254d7e8172a 145 lcd.txt_MoveCursor(2,14);
csteinmetz 0:2254d7e8172a 146 lcd.txt_Width(3);
csteinmetz 0:2254d7e8172a 147 lcd.printf("1");
csteinmetz 0:2254d7e8172a 148 wait(1);
csteinmetz 0:2254d7e8172a 149 lcd.txt_Height(1);
csteinmetz 0:2254d7e8172a 150 lcd.txt_Width(1);
csteinmetz 0:2254d7e8172a 151 }
csteinmetz 0:2254d7e8172a 152 black(); //game setting (9 circular black buttons)
csteinmetz 0:2254d7e8172a 153 }
csteinmetz 0:2254d7e8172a 154 else if(x>65&&x<175&&y>255&&y<290) //show instructions as a text
csteinmetz 0:2254d7e8172a 155 {
csteinmetz 0:2254d7e8172a 156 menu=4; //go to instructions menu
csteinmetz 0:2254d7e8172a 157 lcd.gfx_Cls();
csteinmetz 0:2254d7e8172a 158 lcd.txt_MoveCursor(1,1);
csteinmetz 0:2254d7e8172a 159 lcd.printf("Tap the buttons in the shown\n\rorder. Do not tap the wrong \n\rbuttons, as you can only \n\rmake a maximum of 3 mistakes\n\rbefore losing.\n\r");
csteinmetz 0:2254d7e8172a 160 lcd.printf("\n\rThe longer you play, the \n\rharder the levels will be. \n\rThere are no time limits, so\n\rhave fun and try to remember\n\ran infinitely long \n\rcombination.\n\r");
csteinmetz 0:2254d7e8172a 161 lcd.printf("\n\rTap anywhere to get back to \n\rthe menu and get going!");
csteinmetz 0:2254d7e8172a 162 }
csteinmetz 0:2254d7e8172a 163 }
csteinmetz 0:2254d7e8172a 164 }
csteinmetz 0:2254d7e8172a 165 if(menu==1) //show pattern mode
csteinmetz 0:2254d7e8172a 166 {
csteinmetz 0:2254d7e8172a 167 lcd.txt_MoveCursor(22,13); //write level
csteinmetz 0:2254d7e8172a 168 lcd.txt_Height(1);
csteinmetz 0:2254d7e8172a 169 lcd.printf("Level");
csteinmetz 0:2254d7e8172a 170 lcd.txt_MoveCursor(24,15);
csteinmetz 0:2254d7e8172a 171 lcd.txt_Height(2);
csteinmetz 0:2254d7e8172a 172 lcd.printf("%i",((int)ceil(level*2-5)));
csteinmetz 0:2254d7e8172a 173
csteinmetz 0:2254d7e8172a 174 lcd.txt_Height(1); //write errors
csteinmetz 0:2254d7e8172a 175 lcd.txt_MoveCursor(22,3);
csteinmetz 0:2254d7e8172a 176 lcd.printf("Lives");
csteinmetz 0:2254d7e8172a 177 lcd.txt_MoveCursor(24,4);
csteinmetz 0:2254d7e8172a 178 lcd.txt_Height(2);
csteinmetz 0:2254d7e8172a 179 lcd.printf("%i/3",3-err);
csteinmetz 0:2254d7e8172a 180
csteinmetz 0:2254d7e8172a 181 lcd.txt_Height(1); //MENU-button
csteinmetz 0:2254d7e8172a 182 lcd.txt_MoveCursor(23,22);
csteinmetz 0:2254d7e8172a 183 lcd.txt_Height(3);
csteinmetz 0:2254d7e8172a 184 lcd.printf("M E N U");
csteinmetz 0:2254d7e8172a 185 lcd.txt_Height(2);
csteinmetz 0:2254d7e8172a 186
csteinmetz 0:2254d7e8172a 187 if(err==3) //in that case, you lost--> menu=3
csteinmetz 0:2254d7e8172a 188 {
csteinmetz 0:2254d7e8172a 189 lcd.gfx_RectangleFilled(0, 240, 240, 320, Picaso::WHITE);
csteinmetz 0:2254d7e8172a 190 lcd.txt_MoveCursor(11,10);
csteinmetz 0:2254d7e8172a 191 lcd.printf("GAME OVER");
csteinmetz 0:2254d7e8172a 192
csteinmetz 0:2254d7e8172a 193 lcd.txt_Height(1);
csteinmetz 0:2254d7e8172a 194 lcd.txt_MoveCursor(25,11);
csteinmetz 0:2254d7e8172a 195 lcd.printf("Level %2i",(int)ceil(level*2-5));
csteinmetz 0:2254d7e8172a 196
csteinmetz 0:2254d7e8172a 197 lcd.txt_Height(1);
csteinmetz 0:2254d7e8172a 198 lcd.txt_MoveCursor(23,22);
csteinmetz 0:2254d7e8172a 199 lcd.txt_Height(3);
csteinmetz 0:2254d7e8172a 200 lcd.printf("M E N U");
csteinmetz 0:2254d7e8172a 201 lcd.txt_Height(2);
csteinmetz 0:2254d7e8172a 202
csteinmetz 0:2254d7e8172a 203 lcd.txt_Height(1);
csteinmetz 0:2254d7e8172a 204 lcd.txt_MoveCursor(23,2);
csteinmetz 0:2254d7e8172a 205 lcd.txt_Height(3);
csteinmetz 0:2254d7e8172a 206 lcd.printf("N E W");
csteinmetz 0:2254d7e8172a 207 lcd.txt_Height(2);
csteinmetz 0:2254d7e8172a 208
csteinmetz 0:2254d7e8172a 209 menu=3;
csteinmetz 0:2254d7e8172a 210 }
csteinmetz 0:2254d7e8172a 211 else //show pattern
csteinmetz 0:2254d7e8172a 212 {
csteinmetz 0:2254d7e8172a 213 double wt=0.1*log(level/1.4); //speed of showed pattern decreases iwth length of pattern!--> makes rnd() more random!
csteinmetz 0:2254d7e8172a 214 wait(3*wt);
csteinmetz 0:2254d7e8172a 215 if(redo==0) //new pattern wanted
csteinmetz 0:2254d7e8172a 216 {
csteinmetz 0:2254d7e8172a 217 for(int i=0;i<level;i++) //creates a new pattern (integer numbers of buttons) of length ceil(level) and writes it in the queue qu
csteinmetz 0:2254d7e8172a 218 {
csteinmetz 0:2254d7e8172a 219 int pos=rnd()%9+1;
csteinmetz 0:2254d7e8172a 220 qu.push(pos);
csteinmetz 0:2254d7e8172a 221 col(pos,Picaso::ORANGE); //shows pattern: button blinking in orange
csteinmetz 0:2254d7e8172a 222 wait(wt*3);
csteinmetz 0:2254d7e8172a 223 col(pos,Picaso::BLACK); //back to black
csteinmetz 0:2254d7e8172a 224 wait(wt);
csteinmetz 0:2254d7e8172a 225 if(qu2.size()>0) //if qu2 exists, we want to clear it as it is not needed (redo==1!)
csteinmetz 0:2254d7e8172a 226 {
csteinmetz 0:2254d7e8172a 227 qu2.pop();
csteinmetz 0:2254d7e8172a 228 }
csteinmetz 0:2254d7e8172a 229 }
csteinmetz 0:2254d7e8172a 230 }
csteinmetz 0:2254d7e8172a 231 else //we want to show the old pattern again (there was an error...)
csteinmetz 0:2254d7e8172a 232 {
csteinmetz 0:2254d7e8172a 233 redo=0; //want to get a new pattern next time if no mistake is made!
csteinmetz 0:2254d7e8172a 234 for(int i=0;i<level;i++) //restore old pattern from qu2 in qu (afterwards, qu2 is not needed anymore-->cleared)
csteinmetz 0:2254d7e8172a 235 {
csteinmetz 0:2254d7e8172a 236 qu.push(qu2.front());
csteinmetz 0:2254d7e8172a 237 col(qu2.front(),Picaso::ORANGE); //buttons blink again
csteinmetz 0:2254d7e8172a 238 wait(wt*3);
csteinmetz 0:2254d7e8172a 239 col(qu2.front(),Picaso::BLACK);
csteinmetz 0:2254d7e8172a 240 wait(wt);
csteinmetz 0:2254d7e8172a 241 qu2.pop();
csteinmetz 0:2254d7e8172a 242 }
csteinmetz 0:2254d7e8172a 243 }
csteinmetz 0:2254d7e8172a 244 menu=2; //go to human input mode
csteinmetz 0:2254d7e8172a 245 }
csteinmetz 0:2254d7e8172a 246 }
csteinmetz 0:2254d7e8172a 247 if(menu==2) //now we try to retap the buttons in the right order
csteinmetz 0:2254d7e8172a 248 {
csteinmetz 0:2254d7e8172a 249 t.start(); //timer needed later
csteinmetz 0:2254d7e8172a 250 oldst=status;
csteinmetz 0:2254d7e8172a 251 status = lcd.touch_Get(0);
csteinmetz 0:2254d7e8172a 252 if (status&&(oldst==0))
csteinmetz 0:2254d7e8172a 253 {
csteinmetz 0:2254d7e8172a 254 x = lcd.touch_Get(1); //positions of finger contact
csteinmetz 0:2254d7e8172a 255 y = lcd.touch_Get(2);
csteinmetz 0:2254d7e8172a 256
csteinmetz 0:2254d7e8172a 257 if((unsigned long)((x-xpos[qu.front()])*(x-xpos[qu.front()])+(y-ypos[qu.front()])*(y-ypos[qu.front()]))<=1444) //checks if we are more or less inside the circle at the first position of qu
csteinmetz 0:2254d7e8172a 258 {
csteinmetz 0:2254d7e8172a 259 col(qu.front(),Picaso::GREEN); //green==good
csteinmetz 0:2254d7e8172a 260 t.reset();
csteinmetz 0:2254d7e8172a 261 //this loop is needed so that the green light is actually shown and it is not continuously trying to get green and black again at the same time
csteinmetz 0:2254d7e8172a 262 //only if button is released for at least 0.15s (so not due to a too light pressure on the screen for a few milliseconds),
csteinmetz 0:2254d7e8172a 263 //the button goes back to black
csteinmetz 0:2254d7e8172a 264 while(1)
csteinmetz 0:2254d7e8172a 265 {
csteinmetz 0:2254d7e8172a 266 oldst=status;
csteinmetz 0:2254d7e8172a 267 status = lcd.touch_Get(0);
csteinmetz 0:2254d7e8172a 268
csteinmetz 0:2254d7e8172a 269 if(status!=0){t.reset();}
csteinmetz 0:2254d7e8172a 270 if(status==0&&t.read()>0.15){break;}
csteinmetz 0:2254d7e8172a 271 }
csteinmetz 0:2254d7e8172a 272 col(qu.front(),Picaso::BLACK);
csteinmetz 0:2254d7e8172a 273 if(qu.size()==1) //after the last element , a longer green signal shows that the pattern is finished and correct
csteinmetz 0:2254d7e8172a 274 {
csteinmetz 0:2254d7e8172a 275 col(qu.front(),Picaso::BLACK);
csteinmetz 0:2254d7e8172a 276 wait(.2);
csteinmetz 0:2254d7e8172a 277 col(qu.front(),Picaso::GREEN);
csteinmetz 0:2254d7e8172a 278 wait(.1);
csteinmetz 0:2254d7e8172a 279 col(qu.front(),Picaso::BLACK);
csteinmetz 0:2254d7e8172a 280 wait(.1);
csteinmetz 0:2254d7e8172a 281 col(qu.front(),Picaso::GREEN);
csteinmetz 0:2254d7e8172a 282 wait(1);
csteinmetz 0:2254d7e8172a 283 col(qu.front(),Picaso::BLACK);
csteinmetz 0:2254d7e8172a 284 wait(0.8);
csteinmetz 0:2254d7e8172a 285 level+=0.5; //now, as we were correct, we can also increase our level and go back to the new show pattern-phase (menu==1)
csteinmetz 0:2254d7e8172a 286 menu=1;
csteinmetz 0:2254d7e8172a 287 }
csteinmetz 0:2254d7e8172a 288 qu2.push(qu.front()); //store qu in qu2 (as it may be needed above)
csteinmetz 0:2254d7e8172a 289 qu.pop(); //clear first element from qu
csteinmetz 0:2254d7e8172a 290 }
csteinmetz 0:2254d7e8172a 291 else if(y<240) //if we press the wrong button...
csteinmetz 0:2254d7e8172a 292 {
csteinmetz 0:2254d7e8172a 293 unsigned long dist=100000;
csteinmetz 0:2254d7e8172a 294 unsigned long min=0; //the following writes the button in 'min' that is closest to the finger contact
csteinmetz 0:2254d7e8172a 295 for(int i=1;i<10;i++)
csteinmetz 0:2254d7e8172a 296 {
csteinmetz 0:2254d7e8172a 297 if((x-xpos[i])*(x-xpos[i])+(y-ypos[i])*(y-ypos[i])<dist)
csteinmetz 0:2254d7e8172a 298 {
csteinmetz 0:2254d7e8172a 299 min=i;
csteinmetz 0:2254d7e8172a 300 dist=(x-xpos[i])*(x-xpos[i])+(y-ypos[i])*(y-ypos[i]);
csteinmetz 0:2254d7e8172a 301 }
csteinmetz 0:2254d7e8172a 302 }
csteinmetz 0:2254d7e8172a 303 if(min!=qu.front()) //if closest button is the right one, but we press outside of it, nothing happens. IF NOT: Error routine in following lines
csteinmetz 0:2254d7e8172a 304 {
csteinmetz 0:2254d7e8172a 305 col(min,Picaso::RED); //red==bad
csteinmetz 0:2254d7e8172a 306 wait(1.5);
csteinmetz 0:2254d7e8172a 307 col(min,Picaso::BLACK);
csteinmetz 0:2254d7e8172a 308 redo=1; //now we want to show the right pattern again next time (good that we have qu2...)
csteinmetz 0:2254d7e8172a 309 menu=1; //new show pattern-phase
csteinmetz 0:2254d7e8172a 310 err++; //error number updated
csteinmetz 0:2254d7e8172a 311 }
csteinmetz 0:2254d7e8172a 312 while(qu.size()>0) //shift remaining information from qu in qu2
csteinmetz 0:2254d7e8172a 313 {
csteinmetz 0:2254d7e8172a 314 qu2.push(qu.front());
csteinmetz 0:2254d7e8172a 315 qu.pop();
csteinmetz 0:2254d7e8172a 316 }
csteinmetz 0:2254d7e8172a 317 }
csteinmetz 0:2254d7e8172a 318 else if(x>170&&y>270) //MENU-button
csteinmetz 0:2254d7e8172a 319 {
csteinmetz 0:2254d7e8172a 320 menu=0; //back to start menu
csteinmetz 0:2254d7e8172a 321 lcd.gfx_Cls(); //reset lcd
csteinmetz 0:2254d7e8172a 322 while(qu.size()>0) //clear queues
csteinmetz 0:2254d7e8172a 323 {
csteinmetz 0:2254d7e8172a 324 qu.pop();
csteinmetz 0:2254d7e8172a 325 }
csteinmetz 0:2254d7e8172a 326 while(qu2.size()>0)
csteinmetz 0:2254d7e8172a 327 {
csteinmetz 0:2254d7e8172a 328 qu2.pop();
csteinmetz 0:2254d7e8172a 329 }
csteinmetz 0:2254d7e8172a 330 }
csteinmetz 0:2254d7e8172a 331 }
csteinmetz 0:2254d7e8172a 332 }
csteinmetz 0:2254d7e8172a 333 if(menu==3) //GAME OVER...
csteinmetz 0:2254d7e8172a 334 {
csteinmetz 0:2254d7e8172a 335 oldst=status;
csteinmetz 0:2254d7e8172a 336 status = lcd.touch_Get(0);
csteinmetz 0:2254d7e8172a 337 if (status&&(oldst==0))
csteinmetz 0:2254d7e8172a 338 {
csteinmetz 0:2254d7e8172a 339 x = lcd.touch_Get(1);
csteinmetz 0:2254d7e8172a 340 y = lcd.touch_Get(2);
csteinmetz 0:2254d7e8172a 341 if(x>170&&y>270) //MENU-button as above
csteinmetz 0:2254d7e8172a 342 {
csteinmetz 0:2254d7e8172a 343 menu=0;
csteinmetz 0:2254d7e8172a 344 lcd.gfx_Cls();
csteinmetz 0:2254d7e8172a 345 while(qu.size()>0)
csteinmetz 0:2254d7e8172a 346 {
csteinmetz 0:2254d7e8172a 347 qu.pop();
csteinmetz 0:2254d7e8172a 348 }
csteinmetz 0:2254d7e8172a 349 while(qu2.size()>0)
csteinmetz 0:2254d7e8172a 350 {
csteinmetz 0:2254d7e8172a 351 qu2.pop();
csteinmetz 0:2254d7e8172a 352 }
csteinmetz 0:2254d7e8172a 353 }
csteinmetz 0:2254d7e8172a 354 else if(x<70&&y>270) //NEW game-button
csteinmetz 0:2254d7e8172a 355 {
csteinmetz 0:2254d7e8172a 356 while(qu.size()>0) //clear queues
csteinmetz 0:2254d7e8172a 357 {
csteinmetz 0:2254d7e8172a 358 qu.pop();
csteinmetz 0:2254d7e8172a 359 }
csteinmetz 0:2254d7e8172a 360 while(qu2.size()>0)
csteinmetz 0:2254d7e8172a 361 {
csteinmetz 0:2254d7e8172a 362 qu2.pop();
csteinmetz 0:2254d7e8172a 363 }
csteinmetz 0:2254d7e8172a 364 menu=1; //back to show-mode
csteinmetz 0:2254d7e8172a 365 redo=0; //new pattern required
csteinmetz 0:2254d7e8172a 366 err=0; //no errors in the beginning
csteinmetz 0:2254d7e8172a 367 level=3.0; //first level is that (you should know by now)
csteinmetz 0:2254d7e8172a 368 t.stop(); //reset timer (as the other timer is used for random numbers, we don't reset it, an overflow would not matter at all!)
csteinmetz 0:2254d7e8172a 369 t.reset();
csteinmetz 0:2254d7e8172a 370 lcd.gfx_Cls(); //reset lcd
csteinmetz 0:2254d7e8172a 371 lcd.gfx_RectangleFilled(0, 0, 240, 320, Picaso::WHITE); //countdown:
csteinmetz 0:2254d7e8172a 372 if(games<5)
csteinmetz 0:2254d7e8172a 373 {
csteinmetz 0:2254d7e8172a 374 disp_im(68,110,"three.gci"); //countdown
csteinmetz 0:2254d7e8172a 375 wait(1);
csteinmetz 0:2254d7e8172a 376 disp_im(68,110,"two.gci");
csteinmetz 0:2254d7e8172a 377 wait(1);
csteinmetz 0:2254d7e8172a 378 disp_im(68,110,"one.gci");
csteinmetz 0:2254d7e8172a 379 wait(1);
csteinmetz 0:2254d7e8172a 380 games++; //needs to be updated now every time the images are displayed-->see comment below
csteinmetz 0:2254d7e8172a 381 }
csteinmetz 0:2254d7e8172a 382 //countdown without displaying images: memory space allows only to display ~16 of these images, so afterwards the screen would freeze
csteinmetz 0:2254d7e8172a 383 //if we still try to display them-->alternative without images is a text countdown...
csteinmetz 0:2254d7e8172a 384 else
csteinmetz 0:2254d7e8172a 385 {
csteinmetz 0:2254d7e8172a 386 lcd.txt_Height(5);
csteinmetz 0:2254d7e8172a 387 lcd.txt_MoveCursor(2,14);
csteinmetz 0:2254d7e8172a 388 lcd.txt_Width(3);
csteinmetz 0:2254d7e8172a 389 lcd.printf("3");
csteinmetz 0:2254d7e8172a 390 wait(1);
csteinmetz 0:2254d7e8172a 391 lcd.txt_Width(1);
csteinmetz 0:2254d7e8172a 392 lcd.txt_MoveCursor(2,14);
csteinmetz 0:2254d7e8172a 393 lcd.txt_Width(3);
csteinmetz 0:2254d7e8172a 394 lcd.printf("2");
csteinmetz 0:2254d7e8172a 395 wait(1);
csteinmetz 0:2254d7e8172a 396 lcd.txt_Width(1);
csteinmetz 0:2254d7e8172a 397 lcd.txt_MoveCursor(2,14);
csteinmetz 0:2254d7e8172a 398 lcd.txt_Width(3);
csteinmetz 0:2254d7e8172a 399 lcd.printf("1");
csteinmetz 0:2254d7e8172a 400 wait(1);
csteinmetz 0:2254d7e8172a 401 lcd.txt_Height(1);
csteinmetz 0:2254d7e8172a 402 lcd.txt_Width(1);
csteinmetz 0:2254d7e8172a 403 }
csteinmetz 0:2254d7e8172a 404 black(); //first screen of game
csteinmetz 0:2254d7e8172a 405 }
csteinmetz 0:2254d7e8172a 406 }
csteinmetz 0:2254d7e8172a 407 }
csteinmetz 0:2254d7e8172a 408 if(menu==4)
csteinmetz 0:2254d7e8172a 409 {
csteinmetz 0:2254d7e8172a 410 oldst=status;
csteinmetz 0:2254d7e8172a 411 status = lcd.touch_Get(0);
csteinmetz 0:2254d7e8172a 412 if (status&&(oldst==0)) //tap ANYWHERE to get back to the menu screen
csteinmetz 0:2254d7e8172a 413 {
csteinmetz 0:2254d7e8172a 414 menu=0;
csteinmetz 0:2254d7e8172a 415 lcd.gfx_Cls();
csteinmetz 0:2254d7e8172a 416 }
csteinmetz 0:2254d7e8172a 417 }
csteinmetz 0:2254d7e8172a 418 }
csteinmetz 0:2254d7e8172a 419 }