Zeyu Feng 201377605

Dependencies:   mbed

On Minerva

Committer:
el19zf
Date:
Mon May 18 15:30:54 2020 +0000
Revision:
17:ba4d9cd1e347
Parent:
16:cf2bfada3adf
Child:
18:93d050e7705d
add the user-defined in menu

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el19zf 7:c49f3d3b672f 1 /*
eencae 0:b7f1f47bb26a 2 ELEC2645 Embedded Systems Project
eencae 0:b7f1f47bb26a 3 School of Electronic & Electrical Engineering
eencae 0:b7f1f47bb26a 4 University of Leeds
eencae 0:b7f1f47bb26a 5 2019/20
eencae 0:b7f1f47bb26a 6
el19zf 1:b133934e0d45 7 Name:Zeyu Feng
el19zf 1:b133934e0d45 8 Username:el19zf
el19zf 1:b133934e0d45 9 Student ID Number:201377605
el19zf 1:b133934e0d45 10 Date:11/3/2020
eencae 0:b7f1f47bb26a 11 */
eencae 0:b7f1f47bb26a 12
eencae 0:b7f1f47bb26a 13 #include "mbed.h"
eencae 0:b7f1f47bb26a 14 #include "Gamepad.h"
eencae 0:b7f1f47bb26a 15 #include "N5110.h"
el19zf 2:67b51ee7fc34 16 #include "People.h"
el19zf 3:b8fbaefc496c 17 #include "PeopleEngine.h"
el19zf 4:b12a49f0b730 18 #include "shot.h"
el19zf 8:8287d2ef965d 19 #include "Collision.h"
el19zf 11:494cc44777fe 20 #include "Interface.h"
el19zf 15:3571beaaeed8 21 #include "tests.h"
el19zf 6:dce38fe4e092 22
eencae 0:b7f1f47bb26a 23 // objects
eencae 0:b7f1f47bb26a 24 Gamepad pad;
eencae 0:b7f1f47bb26a 25 N5110 lcd;
el19zf 3:b8fbaefc496c 26 PeopleEngine engine;
el19zf 4:b12a49f0b730 27 shot shot;
el19zf 8:8287d2ef965d 28 Collision collision;
el19zf 11:494cc44777fe 29 Interface interface;
el19zf 16:cf2bfada3adf 30 Sound sound;
el19zf 4:b12a49f0b730 31
el19zf 6:dce38fe4e092 32 //flag and triggers
el19zf 9:62d6559f0d50 33 Ticker ticker;//gradually increase number of shots
el19zf 9:62d6559f0d50 34 Timeout timeout;
el19zf 6:dce38fe4e092 35 volatile int timer_flag = 0;
el19zf 9:62d6559f0d50 36 volatile int timeout_flag = 0;
el19zf 11:494cc44777fe 37 volatile int count_flag = 18;
el19zf 11:494cc44777fe 38 volatile int paused_flag = 0;
el19zf 11:494cc44777fe 39 volatile int option_flag = 0;
el19zf 17:ba4d9cd1e347 40 volatile int defined_rate_flag = 0;
el19zf 17:ba4d9cd1e347 41 volatile int defined_max_flag = 0;
el19zf 6:dce38fe4e092 42
el19zf 13:eb60628db8bf 43 // prototypes
el19zf 11:494cc44777fe 44 void flip(){ timer_flag = 1; }
el19zf 11:494cc44777fe 45 void time_out(){ timeout_flag = 1; }
el19zf 6:dce38fe4e092 46 void init();
el19zf 13:eb60628db8bf 47 void init_value();
el19zf 8:8287d2ef965d 48 void control_check();
el19zf 16:cf2bfada3adf 49 void update(float, int);
el19zf 10:02ab3324be6c 50 void init_timeout();
el19zf 11:494cc44777fe 51 void main_game(float,int);
el19zf 12:009895f6b6e4 52 void simp_game();
el19zf 17:ba4d9cd1e347 53 void undefined();
eencae 0:b7f1f47bb26a 54
eencae 0:b7f1f47bb26a 55 int main()
eencae 0:b7f1f47bb26a 56 {
el19zf 13:eb60628db8bf 57 #ifdef WITH_TESTING
el19zf 12:009895f6b6e4 58 int failures = run_all_tests();
el19zf 13:eb60628db8bf 59 #endif
el19zf 3:b8fbaefc496c 60 //initial
el19zf 6:dce38fe4e092 61 init();
el19zf 11:494cc44777fe 62
el19zf 11:494cc44777fe 63 interface.Welcome(lcd,pad);
el19zf 13:eb60628db8bf 64
el19zf 11:494cc44777fe 65 //a infinite loop
el19zf 6:dce38fe4e092 66 while(1) {
el19zf 11:494cc44777fe 67 init();
el19zf 11:494cc44777fe 68 init_value();
el19zf 17:ba4d9cd1e347 69 option_flag= interface.menu(lcd,pad,option_flag);
el19zf 11:494cc44777fe 70 switch(option_flag){
el19zf 11:494cc44777fe 71 case 0:
el19zf 17:ba4d9cd1e347 72 main_game(0.15,13);
el19zf 11:494cc44777fe 73 break;
el19zf 11:494cc44777fe 74 case 1:
el19zf 17:ba4d9cd1e347 75 main_game(1,30);
el19zf 12:009895f6b6e4 76 simp_game();
el19zf 11:494cc44777fe 77 break;
el19zf 11:494cc44777fe 78 case 2:
el19zf 17:ba4d9cd1e347 79 undefined();
el19zf 17:ba4d9cd1e347 80 break;
el19zf 17:ba4d9cd1e347 81 case 3:
el19zf 11:494cc44777fe 82 interface.exit(lcd,pad);
el19zf 11:494cc44777fe 83 break;
el19zf 17:ba4d9cd1e347 84 }
el19zf 11:494cc44777fe 85 }
el19zf 11:494cc44777fe 86 }
el19zf 11:494cc44777fe 87
el19zf 11:494cc44777fe 88 void main_game(float increment,int max){
el19zf 11:494cc44777fe 89
el19zf 11:494cc44777fe 90 ticker.attach(&flip,2);//set a ticker
el19zf 11:494cc44777fe 91 timeout.attach(&time_out,3);//set a timeout
el19zf 11:494cc44777fe 92
el19zf 11:494cc44777fe 93 while((collision.get_health() > 0)&&(!collision.get_des()))
el19zf 13:eb60628db8bf 94 {
el19zf 6:dce38fe4e092 95 lcd.clear();
el19zf 13:eb60628db8bf 96 // increase shots with a ticker
el19zf 13:eb60628db8bf 97 shot.gen_shot(timer_flag,increment,max);
el19zf 8:8287d2ef965d 98 // shot update
el19zf 15:3571beaaeed8 99 shot.draw(lcd);
el19zf 8:8287d2ef965d 100
el19zf 11:494cc44777fe 101 // set a count down and update lcd
el19zf 16:cf2bfada3adf 102 update(increment, max);
el19zf 11:494cc44777fe 103
el19zf 11:494cc44777fe 104 pad.leds_on();
el19zf 10:02ab3324be6c 105
el19zf 6:dce38fe4e092 106 lcd.refresh();
el19zf 6:dce38fe4e092 107 //printf("shot refresh\n");
el19zf 6:dce38fe4e092 108 //printf("size = %d\n",shot._size);
el19zf 9:62d6559f0d50 109 wait_ms(1000/6);//fps = 6
el19zf 6:dce38fe4e092 110 }
el19zf 12:009895f6b6e4 111 //printf("END GAME\n");
el19zf 6:dce38fe4e092 112 }
el19zf 6:dce38fe4e092 113
el19zf 6:dce38fe4e092 114 void init()
el19zf 6:dce38fe4e092 115 {
el19zf 2:67b51ee7fc34 116 lcd.init();
el19zf 3:b8fbaefc496c 117 engine.init();
el19zf 2:67b51ee7fc34 118 pad.init();
el19zf 7:c49f3d3b672f 119 shot.init();
el19zf 8:8287d2ef965d 120 collision.init();
el19zf 2:67b51ee7fc34 121 lcd.refresh();
el19zf 13:eb60628db8bf 122 interface.init();
el19zf 10:02ab3324be6c 123 }
el19zf 10:02ab3324be6c 124
el19zf 11:494cc44777fe 125 void init_value()
el19zf 11:494cc44777fe 126 {
el19zf 11:494cc44777fe 127 timer_flag = 0;
el19zf 10:02ab3324be6c 128 timeout_flag = 0;
el19zf 11:494cc44777fe 129 count_flag = 18;
el19zf 11:494cc44777fe 130 paused_flag = 0;
el19zf 11:494cc44777fe 131 option_flag = 0;
el19zf 17:ba4d9cd1e347 132 defined_rate_flag = 0;
el19zf 17:ba4d9cd1e347 133 defined_max_flag = 0;
el19zf 12:009895f6b6e4 134 }
el19zf 12:009895f6b6e4 135
el19zf 13:eb60628db8bf 136 void control_check()
el19zf 13:eb60628db8bf 137 {
el19zf 13:eb60628db8bf 138 engine.read_input(pad);
el19zf 13:eb60628db8bf 139 engine.update();
el19zf 13:eb60628db8bf 140 collision.set_pos(engine.get_pos());
el19zf 13:eb60628db8bf 141 // if people is shotted, health -1 and reset the game
el19zf 13:eb60628db8bf 142 if(collision.check(lcd)) {
el19zf 14:42b8a91e463c 143 pad.play_melody(2,sound_data_col,sound_dur_col,120,0);
el19zf 13:eb60628db8bf 144 if(!collision.get_health()){
el19zf 13:eb60628db8bf 145 interface.game_over(lcd,pad);
el19zf 13:eb60628db8bf 146 } else{
el19zf 13:eb60628db8bf 147 init_timeout();
el19zf 13:eb60628db8bf 148 }
el19zf 13:eb60628db8bf 149 lcd.clear();
el19zf 13:eb60628db8bf 150 }
el19zf 13:eb60628db8bf 151 }
el19zf 13:eb60628db8bf 152
el19zf 16:cf2bfada3adf 153 void update(float increment, int max)
el19zf 13:eb60628db8bf 154 {
el19zf 13:eb60628db8bf 155 if(timeout_flag){
el19zf 13:eb60628db8bf 156 control_check();
el19zf 16:cf2bfada3adf 157 paused_flag = interface.check_pause(lcd,pad,paused_flag,increment,max);
el19zf 13:eb60628db8bf 158 }else{
el19zf 13:eb60628db8bf 159 //if timeout_flag count down number and Joystick have been banned
el19zf 13:eb60628db8bf 160 count_flag = interface.count_down(lcd,count_flag);
el19zf 16:cf2bfada3adf 161 pad.reset_buttons();
el19zf 13:eb60628db8bf 162 }
el19zf 13:eb60628db8bf 163 //control people and check collision
el19zf 13:eb60628db8bf 164 if(!collision.get_check_col()){
el19zf 13:eb60628db8bf 165 engine.draw(lcd,timeout_flag);
el19zf 13:eb60628db8bf 166 collision.draw(lcd);
el19zf 13:eb60628db8bf 167 }else{
el19zf 13:eb60628db8bf 168 collision.set_check_col();
el19zf 13:eb60628db8bf 169 }
el19zf 13:eb60628db8bf 170 //printf("timeout_flag = %d\n",timeout_flag);
el19zf 13:eb60628db8bf 171 //check destination
el19zf 13:eb60628db8bf 172 if(collision.check_des(lcd)){
el19zf 13:eb60628db8bf 173 interface.victory(lcd,pad);
el19zf 13:eb60628db8bf 174 lcd.clear();
el19zf 13:eb60628db8bf 175 }
el19zf 13:eb60628db8bf 176 }
el19zf 13:eb60628db8bf 177
el19zf 13:eb60628db8bf 178 //reset timeout after collision (health > 0)
el19zf 13:eb60628db8bf 179 void init_timeout()
el19zf 13:eb60628db8bf 180 {
el19zf 13:eb60628db8bf 181 collision.draw_collision(lcd);
el19zf 13:eb60628db8bf 182 engine.init();
el19zf 13:eb60628db8bf 183 shot.init();
el19zf 16:cf2bfada3adf 184 //initialise time out,flag and bottons
el19zf 13:eb60628db8bf 185 timeout.attach(&time_out,3);
el19zf 13:eb60628db8bf 186 timeout_flag = 0;
el19zf 13:eb60628db8bf 187 count_flag = 18;
el19zf 16:cf2bfada3adf 188 //count down, each duration 0.5s and 60 beats per minute(1s)
el19zf 16:cf2bfada3adf 189 sound.count_sound(pad);
el19zf 16:cf2bfada3adf 190 pad.reset_buttons();
el19zf 13:eb60628db8bf 191 }
el19zf 13:eb60628db8bf 192
el19zf 12:009895f6b6e4 193 void simp_game()
el19zf 12:009895f6b6e4 194 {
el19zf 12:009895f6b6e4 195 if(!interface.get_victory_flag()){
el19zf 13:eb60628db8bf 196
el19zf 12:009895f6b6e4 197 interface.simple_game(lcd,pad);
el19zf 12:009895f6b6e4 198 if(interface.get_sim_flag()){
el19zf 12:009895f6b6e4 199 init();
el19zf 15:3571beaaeed8 200 init_value();
el19zf 17:ba4d9cd1e347 201 main_game(0.5,23);
el19zf 12:009895f6b6e4 202 }
el19zf 12:009895f6b6e4 203 }
el19zf 12:009895f6b6e4 204 interface.init();
el19zf 17:ba4d9cd1e347 205 }
el19zf 17:ba4d9cd1e347 206
el19zf 17:ba4d9cd1e347 207 void undefined()
el19zf 17:ba4d9cd1e347 208 {
el19zf 17:ba4d9cd1e347 209 defined_rate_flag = interface.undefined_rate(lcd,pad,defined_rate_flag);
el19zf 17:ba4d9cd1e347 210 defined_max_flag = interface.undefined_max(lcd,pad,defined_max_flag);
el19zf 17:ba4d9cd1e347 211 // 0 1 2 3 4 flag
el19zf 17:ba4d9cd1e347 212 // 0.3 0.4 0.5 0.6 0.7 shots/frame
el19zf 17:ba4d9cd1e347 213 // 15 20 25 30 35 Maximum shots
el19zf 17:ba4d9cd1e347 214 main_game(0.1*(defined_rate_flag + 3),5*(defined_max_flag + 3));
el19zf 17:ba4d9cd1e347 215 }
el19zf 17:ba4d9cd1e347 216