
A Demo Tap-Game for the 4D Systems GEN4-24PT touch display
Dependencies: mbed uLCD_4D_Picaso
main.cpp@0:2254d7e8172a, 2016-11-02 (annotated)
- Committer:
- csteinmetz
- Date:
- Wed Nov 02 20:58:36 2016 +0000
- Revision:
- 0:2254d7e8172a
DEMO GAME
Who changed what in which revision?
User | Revision | Line number | New 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 | } |