Zeyu Feng 201377605

Dependencies:   mbed

On Minerva

Committer:
el19zf
Date:
Fri May 22 16:07:02 2020 +0000
Revision:
22:cded0cd8e1c9
Parent:
20:a36ab1560e73
Final Submission. I have read and agreed with Statement of Academic Integrity.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el19zf 11:494cc44777fe 1 #include "Interface.h"
el19zf 11:494cc44777fe 2
el19zf 17:ba4d9cd1e347 3 State fsm_5[5] = {
el19zf 20:a36ab1560e73 4 {0,{4,1}},
el19zf 17:ba4d9cd1e347 5 {1,{0,2}},
el19zf 17:ba4d9cd1e347 6 {2,{1,3}},
el19zf 17:ba4d9cd1e347 7 {3,{2,4}},
el19zf 17:ba4d9cd1e347 8 {4,{3,0}}
el19zf 11:494cc44777fe 9 };
el19zf 19:5083339b55e8 10 // point to option
el19zf 11:494cc44777fe 11 const int pointer[3][2] = {
el19zf 11:494cc44777fe 12 {1,0},
el19zf 11:494cc44777fe 13 {1,1},
el19zf 11:494cc44777fe 14 {1,0}
el19zf 11:494cc44777fe 15 };
el19zf 11:494cc44777fe 16
el19zf 11:494cc44777fe 17 Interface::Interface()
el19zf 11:494cc44777fe 18 {
el19zf 11:494cc44777fe 19
el19zf 11:494cc44777fe 20 }
el19zf 11:494cc44777fe 21
el19zf 11:494cc44777fe 22 Interface::~Interface()
el19zf 11:494cc44777fe 23 {
el19zf 11:494cc44777fe 24
el19zf 11:494cc44777fe 25 }
el19zf 11:494cc44777fe 26
el19zf 11:494cc44777fe 27 void Interface::init()
el19zf 11:494cc44777fe 28 {
el19zf 19:5083339b55e8 29 _menu_flag = 0;
el19zf 19:5083339b55e8 30 _defined_rate_flag = 0;
el19zf 19:5083339b55e8 31 _defined_max_flag = 0;
el19zf 12:009895f6b6e4 32 _gameover_flag = 0;
el19zf 19:5083339b55e8 33 _count_down = 18;
el19zf 12:009895f6b6e4 34 _victory_flag = 0;
el19zf 19:5083339b55e8 35 _sim_flag = 0;//simple game flag
el19zf 11:494cc44777fe 36 }
el19zf 11:494cc44777fe 37
el19zf 11:494cc44777fe 38
el19zf 11:494cc44777fe 39 void Interface::Welcome(N5110 &lcd,Gamepad &pad)
el19zf 11:494cc44777fe 40 {
el19zf 22:cded0cd8e1c9 41 // initialise record
el19zf 22:cded0cd8e1c9 42 _record.x = 0;
el19zf 22:cded0cd8e1c9 43 _record.y = 0;
el19zf 19:5083339b55e8 44 // start game after pressing the start botton
el19zf 11:494cc44777fe 45 while (!pad.start_pressed())
el19zf 11:494cc44777fe 46 {
el19zf 13:eb60628db8bf 47 lcd.clear();
el19zf 13:eb60628db8bf 48 lcd.printString(" Welcome! ",0,1);
el19zf 13:eb60628db8bf 49 lcd.printString(" Game by ",0,2);
el19zf 13:eb60628db8bf 50 lcd.printString(" Z. FENG ",0,3);
el19zf 17:ba4d9cd1e347 51 lcd.setContrast( pad.read_pot1());// control the contrast of screen
el19zf 19:5083339b55e8 52 lcd.drawRect(0,44,int(pad.read_pot1()*WIDTH),2,FILL_BLACK);// shows the contrast of gamepad by a black rectangle
el19zf 13:eb60628db8bf 53 //printf("WIDTH of contrast = %d, contrast = %f\n",(int)pad.read_pot1()*WIDTH,pad.read_pot1());
el19zf 13:eb60628db8bf 54 lcd.refresh();
el19zf 11:494cc44777fe 55 pad.leds_on();
el19zf 11:494cc44777fe 56 wait(0.1);
el19zf 11:494cc44777fe 57 pad.leds_off();
el19zf 11:494cc44777fe 58 wait(0.1);
el19zf 11:494cc44777fe 59 }
el19zf 16:cf2bfada3adf 60 _sound.menu_sound(pad);
el19zf 11:494cc44777fe 61 }
el19zf 11:494cc44777fe 62
el19zf 19:5083339b55e8 63 void Interface::menu(N5110 &lcd,Gamepad &pad)
el19zf 11:494cc44777fe 64 {
el19zf 11:494cc44777fe 65 while (!pad.A_pressed())
el19zf 11:494cc44777fe 66 {
el19zf 11:494cc44777fe 67 lcd.clear();
el19zf 16:cf2bfada3adf 68 lcd.printString(" MENU",0,0);
el19zf 18:93d050e7705d 69 lcd.printString(" Start",0,1);
el19zf 18:93d050e7705d 70 lcd.printString(" Start(Hell)",0,2);
el19zf 18:93d050e7705d 71 lcd.printString(" user-defined",0,3);
el19zf 18:93d050e7705d 72 lcd.printString(" Instruction",0,4);
el19zf 22:cded0cd8e1c9 73 lcd.printString(" Record",0,5);
el19zf 11:494cc44777fe 74 _d = pad.get_direction();
el19zf 19:5083339b55e8 75 // in order to easily control Joystick, pointer move upward in a large angle
el19zf 12:009895f6b6e4 76 if(_d == N||_d ==NE||_d==NW){
el19zf 19:5083339b55e8 77 _menu_flag = fsm_5[_menu_flag].next_state[0];
el19zf 12:009895f6b6e4 78 } else if(_d == S||_d==SE||_d==SW){
el19zf 19:5083339b55e8 79 _menu_flag = fsm_5[_menu_flag].next_state[1];
el19zf 11:494cc44777fe 80 }
el19zf 19:5083339b55e8 81 lcd.drawSprite(0,8*_menu_flag+10,3,2,(int*)pointer);
el19zf 17:ba4d9cd1e347 82 lcd.refresh();
el19zf 17:ba4d9cd1e347 83 pad.leds_on();
el19zf 19:5083339b55e8 84 wait(0.3);
el19zf 17:ba4d9cd1e347 85 //printf("A_pressed\n");
el19zf 14:42b8a91e463c 86 }
el19zf 19:5083339b55e8 87 _sound.begin_sound(pad);
el19zf 11:494cc44777fe 88 }
el19zf 11:494cc44777fe 89
el19zf 19:5083339b55e8 90 void Interface::undefined_rate(N5110 &lcd,Gamepad &pad)
el19zf 17:ba4d9cd1e347 91 {
el19zf 17:ba4d9cd1e347 92 pad.tone(10,0.05);
el19zf 17:ba4d9cd1e347 93 pad.set_bpm(0);
el19zf 17:ba4d9cd1e347 94 pad.reset_buttons();
el19zf 17:ba4d9cd1e347 95 while (!pad.A_pressed())
el19zf 17:ba4d9cd1e347 96 {
el19zf 17:ba4d9cd1e347 97 lcd.clear();
el19zf 18:93d050e7705d 98 lcd.printString(" shots/frames",0,0);
el19zf 17:ba4d9cd1e347 99 lcd.printString(" 0.3",0,1);
el19zf 17:ba4d9cd1e347 100 lcd.printString(" 0.4",0,2);
el19zf 17:ba4d9cd1e347 101 lcd.printString(" 0.5",0,3);
el19zf 17:ba4d9cd1e347 102 lcd.printString(" 0.6",0,4);
el19zf 17:ba4d9cd1e347 103 lcd.printString(" 0.7",0,5);
el19zf 17:ba4d9cd1e347 104 _d = pad.get_direction();
el19zf 17:ba4d9cd1e347 105 if(_d == N||_d ==NE||_d==NW){
el19zf 19:5083339b55e8 106 _defined_rate_flag = fsm_5[_defined_rate_flag].next_state[0];
el19zf 17:ba4d9cd1e347 107 } else if(_d == S||_d==SE||_d==SW){
el19zf 19:5083339b55e8 108 _defined_rate_flag = fsm_5[_defined_rate_flag].next_state[1];
el19zf 17:ba4d9cd1e347 109 }
el19zf 19:5083339b55e8 110 lcd.drawSprite(20,8*_defined_rate_flag+10,3,2,(int*)pointer);
el19zf 17:ba4d9cd1e347 111 lcd.refresh();
el19zf 17:ba4d9cd1e347 112 pad.leds_on();
el19zf 19:5083339b55e8 113 wait(0.3);
el19zf 17:ba4d9cd1e347 114 }
el19zf 17:ba4d9cd1e347 115 }
el19zf 17:ba4d9cd1e347 116
el19zf 17:ba4d9cd1e347 117
el19zf 19:5083339b55e8 118 void Interface::undefined_max(N5110 &lcd,Gamepad &pad)
el19zf 17:ba4d9cd1e347 119 {
el19zf 17:ba4d9cd1e347 120 pad.reset_buttons();
el19zf 17:ba4d9cd1e347 121 while (!pad.A_pressed())
el19zf 17:ba4d9cd1e347 122 {
el19zf 17:ba4d9cd1e347 123 lcd.clear();
el19zf 18:93d050e7705d 124 lcd.printString(" Max.shots",0,0);
el19zf 17:ba4d9cd1e347 125 lcd.printString(" 15",0,1);
el19zf 17:ba4d9cd1e347 126 lcd.printString(" 20",0,2);
el19zf 17:ba4d9cd1e347 127 lcd.printString(" 25",0,3);
el19zf 17:ba4d9cd1e347 128 lcd.printString(" 30",0,4);
el19zf 17:ba4d9cd1e347 129 lcd.printString(" 35",0,5);
el19zf 17:ba4d9cd1e347 130 _d = pad.get_direction();
el19zf 17:ba4d9cd1e347 131 if(_d == N||_d ==NE||_d==NW){
el19zf 19:5083339b55e8 132 _defined_max_flag = fsm_5[_defined_max_flag].next_state[0];
el19zf 17:ba4d9cd1e347 133 } else if(_d == S||_d==SE||_d==SW){
el19zf 19:5083339b55e8 134 _defined_max_flag = fsm_5[_defined_max_flag].next_state[1];
el19zf 17:ba4d9cd1e347 135 }
el19zf 19:5083339b55e8 136 lcd.drawSprite(20,8*_defined_max_flag+10,3,2,(int*)pointer);
el19zf 17:ba4d9cd1e347 137 lcd.refresh();
el19zf 17:ba4d9cd1e347 138 pad.leds_on();
el19zf 19:5083339b55e8 139 wait(0.3);
el19zf 17:ba4d9cd1e347 140 }
el19zf 17:ba4d9cd1e347 141 _sound.begin_sound(pad);
el19zf 17:ba4d9cd1e347 142 }
el19zf 17:ba4d9cd1e347 143
el19zf 17:ba4d9cd1e347 144
el19zf 11:494cc44777fe 145 void Interface::game_over(N5110 &lcd,Gamepad &pad)
el19zf 11:494cc44777fe 146 {
el19zf 16:cf2bfada3adf 147 _sound.over_sound(pad);
el19zf 11:494cc44777fe 148 lcd.clear();
el19zf 13:eb60628db8bf 149 pad.init();
el19zf 11:494cc44777fe 150 while(!pad.B_pressed()){
el19zf 11:494cc44777fe 151 lcd.printString(" Game over ",0,1);
el19zf 11:494cc44777fe 152 lcd.printString(" Press B to ",0,2);
el19zf 11:494cc44777fe 153 lcd.printString(" try again? ",0,3);
el19zf 11:494cc44777fe 154 lcd.refresh();
el19zf 11:494cc44777fe 155 wait(0.1);
el19zf 11:494cc44777fe 156 //printf("Not press B\n");
el19zf 11:494cc44777fe 157 }
el19zf 12:009895f6b6e4 158 _gameover_flag = 1;
el19zf 11:494cc44777fe 159 }
el19zf 11:494cc44777fe 160
el19zf 19:5083339b55e8 161 int Interface::check_pause(N5110 &lcd,Gamepad &pad,int paused_flag, float increment, int max)
el19zf 11:494cc44777fe 162 {
el19zf 16:cf2bfada3adf 163 if(pad.start_pressed()){
el19zf 11:494cc44777fe 164 paused_flag = 1;
el19zf 16:cf2bfada3adf 165 sprintf(_buffer1," %.1f shots/s",increment*6);
el19zf 16:cf2bfada3adf 166 sprintf(_buffer2," with Max.%d ",max);
el19zf 16:cf2bfada3adf 167 }
el19zf 11:494cc44777fe 168 //printf("start press\n");
el19zf 11:494cc44777fe 169 while(paused_flag == 1){
el19zf 16:cf2bfada3adf 170 lcd.clear();
el19zf 11:494cc44777fe 171 _timer.stop();
el19zf 16:cf2bfada3adf 172 lcd.printString("Paused",23,0);
el19zf 16:cf2bfada3adf 173 lcd.printString(_buffer1,0,2);
el19zf 16:cf2bfada3adf 174 lcd.printString(_buffer2,0,3);
el19zf 11:494cc44777fe 175 lcd.refresh();
el19zf 11:494cc44777fe 176 if(pad.start_pressed())
el19zf 11:494cc44777fe 177 paused_flag = 0;
el19zf 11:494cc44777fe 178 }
el19zf 11:494cc44777fe 179 _timer.start();
el19zf 11:494cc44777fe 180 return paused_flag;
el19zf 11:494cc44777fe 181 }
el19zf 11:494cc44777fe 182
el19zf 19:5083339b55e8 183 void Interface::count_down(N5110 &lcd)
el19zf 11:494cc44777fe 184 {
el19zf 11:494cc44777fe 185 char buffer[6];
el19zf 19:5083339b55e8 186 sprintf(buffer,"%d",int(_count_down/6));
el19zf 11:494cc44777fe 187 lcd.printString(buffer,40,2);
el19zf 19:5083339b55e8 188 //printf("count: %d\n",_count_flag);
el19zf 19:5083339b55e8 189 _count_down--;
el19zf 11:494cc44777fe 190 }
el19zf 11:494cc44777fe 191
el19zf 22:cded0cd8e1c9 192 void Interface::update_record(float increment,int max)
el19zf 22:cded0cd8e1c9 193 {
el19zf 22:cded0cd8e1c9 194 if(increment > _record.x||(int(increment)==int(_record.x)&& max > _record.y)){
el19zf 22:cded0cd8e1c9 195 _record.x = increment;
el19zf 22:cded0cd8e1c9 196 _record.y = max;
el19zf 22:cded0cd8e1c9 197 }
el19zf 22:cded0cd8e1c9 198 }
el19zf 22:cded0cd8e1c9 199
el19zf 22:cded0cd8e1c9 200 void Interface::record(N5110 &lcd,Gamepad &pad)
el19zf 11:494cc44777fe 201 {
el19zf 11:494cc44777fe 202 lcd.clear();
el19zf 13:eb60628db8bf 203 pad.init();
el19zf 14:42b8a91e463c 204 pad.tone(10,0.05);
el19zf 14:42b8a91e463c 205 pad.set_bpm(0);
el19zf 22:cded0cd8e1c9 206 sprintf(_buffer1," %.1f shots/s",_record.x*6);
el19zf 22:cded0cd8e1c9 207 sprintf(_buffer2," with Max.%.0f ",_record.y);
el19zf 11:494cc44777fe 208 while(!pad.B_pressed()){
el19zf 22:cded0cd8e1c9 209 lcd.printString("Record",23,0);
el19zf 22:cded0cd8e1c9 210 lcd.printString(_buffer1,0,1);
el19zf 22:cded0cd8e1c9 211 lcd.printString(_buffer2,0,2);
el19zf 22:cded0cd8e1c9 212 lcd.printString(" Press B back ",0,4);
el19zf 22:cded0cd8e1c9 213 lcd.printString(" to menu ",0,5);
el19zf 11:494cc44777fe 214 lcd.refresh();
el19zf 11:494cc44777fe 215 wait(0.1);
el19zf 11:494cc44777fe 216 }
el19zf 11:494cc44777fe 217 }
el19zf 11:494cc44777fe 218
el19zf 11:494cc44777fe 219 void Interface::victory(N5110 &lcd,Gamepad &pad)
el19zf 11:494cc44777fe 220 {
el19zf 16:cf2bfada3adf 221 _sound.vict_sound(pad);
el19zf 11:494cc44777fe 222 lcd.clear();
el19zf 13:eb60628db8bf 223 pad.init();
el19zf 11:494cc44777fe 224 while(!pad.B_pressed()){
el19zf 11:494cc44777fe 225 lcd.printString(" Victory! ",0,1);
el19zf 11:494cc44777fe 226 lcd.printString(" Press B back ",0,2);
el19zf 11:494cc44777fe 227 lcd.printString(" to menu ",0,3);
el19zf 11:494cc44777fe 228 lcd.refresh();
el19zf 11:494cc44777fe 229 wait(0.1);
el19zf 11:494cc44777fe 230 }
el19zf 12:009895f6b6e4 231 _victory_flag = 1;
el19zf 12:009895f6b6e4 232 }
el19zf 12:009895f6b6e4 233
el19zf 12:009895f6b6e4 234 void Interface::simple_game(N5110 &lcd,Gamepad &pad)
el19zf 12:009895f6b6e4 235 {
el19zf 12:009895f6b6e4 236 lcd.clear();
el19zf 12:009895f6b6e4 237 pad.init();
el19zf 12:009895f6b6e4 238 while(!pad.A_pressed()){
el19zf 12:009895f6b6e4 239 lcd.printString(" DO YOU WANT ",0,1);
el19zf 12:009895f6b6e4 240 lcd.printString(" MAKE IT EASY? ",0,2);
el19zf 12:009895f6b6e4 241 lcd.printString(" PRESS A to",0,3);
el19zf 12:009895f6b6e4 242 lcd.printString(" try again! ",0,4);
el19zf 12:009895f6b6e4 243 lcd.refresh();
el19zf 12:009895f6b6e4 244 wait(0.1);
el19zf 12:009895f6b6e4 245 }
el19zf 12:009895f6b6e4 246 _sim_flag = 1;
el19zf 16:cf2bfada3adf 247 _sound.count_sound(pad);
el19zf 12:009895f6b6e4 248 }
el19zf 12:009895f6b6e4 249
el19zf 19:5083339b55e8 250 void Interface::set_count_down(int count_down)
el19zf 19:5083339b55e8 251 {
el19zf 19:5083339b55e8 252 _count_down = count_down;
el19zf 19:5083339b55e8 253 }
el19zf 19:5083339b55e8 254
el19zf 19:5083339b55e8 255 int Interface::get_menu_flag()
el19zf 19:5083339b55e8 256 {
el19zf 19:5083339b55e8 257 return _menu_flag;
el19zf 19:5083339b55e8 258 }
el19zf 19:5083339b55e8 259
el19zf 19:5083339b55e8 260 int Interface::get_rate_flag()
el19zf 19:5083339b55e8 261 {
el19zf 19:5083339b55e8 262 return _defined_rate_flag;
el19zf 19:5083339b55e8 263 }
el19zf 19:5083339b55e8 264
el19zf 19:5083339b55e8 265 int Interface::get_max_flag()
el19zf 19:5083339b55e8 266 {
el19zf 19:5083339b55e8 267 return _defined_max_flag;
el19zf 19:5083339b55e8 268 }
el19zf 19:5083339b55e8 269
el19zf 12:009895f6b6e4 270 int Interface::get_sim_flag()
el19zf 12:009895f6b6e4 271 {
el19zf 12:009895f6b6e4 272 //printf("Get simple_flag %d\n",_sim_flag);
el19zf 12:009895f6b6e4 273 return _sim_flag;
el19zf 12:009895f6b6e4 274 }
el19zf 12:009895f6b6e4 275
el19zf 12:009895f6b6e4 276 int Interface::get_gameover_flag()
el19zf 12:009895f6b6e4 277 {
el19zf 12:009895f6b6e4 278 return _gameover_flag;
el19zf 12:009895f6b6e4 279 }
el19zf 12:009895f6b6e4 280
el19zf 12:009895f6b6e4 281 int Interface::get_victory_flag()
el19zf 12:009895f6b6e4 282 {
el19zf 12:009895f6b6e4 283 return _victory_flag;
el19zf 19:5083339b55e8 284 }