Zeyu Feng 201377605

Dependencies:   mbed

On Minerva

Committer:
el19zf
Date:
Thu May 21 17:07:46 2020 +0000
Revision:
19:5083339b55e8
Parent:
18:93d050e7705d
Child:
20:a36ab1560e73
update code to be better implemented

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