Zeyu Feng 201377605

Dependencies:   mbed

On Minerva

Committer:
el19zf
Date:
Mon May 11 14:43:16 2020 +0000
Revision:
12:009895f6b6e4
Parent:
11:494cc44777fe
Child:
13:eb60628db8bf
add a test file and optimzed code

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 // includes
eencae 0:b7f1f47bb26a 14 #include "mbed.h"
eencae 0:b7f1f47bb26a 15 #include "Gamepad.h"
eencae 0:b7f1f47bb26a 16 #include "N5110.h"
el19zf 2:67b51ee7fc34 17 #include "People.h"
el19zf 3:b8fbaefc496c 18 #include "PeopleEngine.h"
el19zf 4:b12a49f0b730 19 #include "shot.h"
el19zf 8:8287d2ef965d 20 #include "Collision.h"
el19zf 11:494cc44777fe 21 #include "Interface.h"
el19zf 12:009895f6b6e4 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 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 6:dce38fe4e092 40
el19zf 6:dce38fe4e092 41 // functions
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 8:8287d2ef965d 45 void control_check();
el19zf 11:494cc44777fe 46 void update();
el19zf 7:c49f3d3b672f 47 void shot_update();
el19zf 10:02ab3324be6c 48 void init_timeout();
el19zf 11:494cc44777fe 49 void main_game(float,int);
el19zf 11:494cc44777fe 50 void init_value();
el19zf 12:009895f6b6e4 51 void simp_game();
eencae 0:b7f1f47bb26a 52
eencae 0:b7f1f47bb26a 53 int main()
eencae 0:b7f1f47bb26a 54 {
el19zf 12:009895f6b6e4 55 int failures = run_all_tests();
el19zf 3:b8fbaefc496c 56 //initial
el19zf 6:dce38fe4e092 57 init();
el19zf 11:494cc44777fe 58
el19zf 11:494cc44777fe 59 interface.Welcome(lcd,pad);
el19zf 7:c49f3d3b672f 60
el19zf 11:494cc44777fe 61 //a infinite loop
el19zf 6:dce38fe4e092 62 while(1) {
el19zf 11:494cc44777fe 63 init();
el19zf 11:494cc44777fe 64 init_value();
el19zf 11:494cc44777fe 65 int option_flag= interface.menu(lcd,pad,option_flag);
el19zf 11:494cc44777fe 66 switch(option_flag){
el19zf 11:494cc44777fe 67 case 0:
el19zf 11:494cc44777fe 68 main_game(0.7,25);
el19zf 11:494cc44777fe 69 break;
el19zf 11:494cc44777fe 70 case 1:
el19zf 11:494cc44777fe 71 main_game(4,40);
el19zf 12:009895f6b6e4 72 simp_game();
el19zf 11:494cc44777fe 73 break;
el19zf 11:494cc44777fe 74 case 2:
el19zf 11:494cc44777fe 75 interface.exit(lcd,pad);
el19zf 11:494cc44777fe 76 break;
el19zf 11:494cc44777fe 77 }
el19zf 11:494cc44777fe 78 }
el19zf 11:494cc44777fe 79 }
el19zf 11:494cc44777fe 80
el19zf 11:494cc44777fe 81 void main_game(float increment,int max){
el19zf 11:494cc44777fe 82
el19zf 11:494cc44777fe 83 ticker.attach(&flip,2);//set a ticker
el19zf 11:494cc44777fe 84 timeout.attach(&time_out,3);//set a timeout
el19zf 11:494cc44777fe 85
el19zf 11:494cc44777fe 86 while((collision.get_health() > 0)&&(!collision.get_des()))
el19zf 11:494cc44777fe 87 { // increase shots with a ticker
el19zf 11:494cc44777fe 88 shot.gen_shot(timer_flag,increment,max);
el19zf 6:dce38fe4e092 89 lcd.clear();
el19zf 8:8287d2ef965d 90 // shot update
el19zf 6:dce38fe4e092 91 shot_update();
el19zf 8:8287d2ef965d 92
el19zf 11:494cc44777fe 93 // set a count down and update lcd
el19zf 11:494cc44777fe 94 update();
el19zf 11:494cc44777fe 95
el19zf 11:494cc44777fe 96 pad.leds_on();
el19zf 11:494cc44777fe 97 paused_flag = interface.check_pause(lcd,pad,paused_flag);
el19zf 10:02ab3324be6c 98
el19zf 6:dce38fe4e092 99 lcd.refresh();
el19zf 6:dce38fe4e092 100 //printf("shot refresh\n");
el19zf 6:dce38fe4e092 101 //printf("size = %d\n",shot._size);
el19zf 9:62d6559f0d50 102 wait_ms(1000/6);//fps = 6
el19zf 6:dce38fe4e092 103 }
el19zf 12:009895f6b6e4 104 //printf("END GAME\n");
el19zf 6:dce38fe4e092 105 }
el19zf 6:dce38fe4e092 106
el19zf 6:dce38fe4e092 107 void init()
el19zf 6:dce38fe4e092 108 {
el19zf 2:67b51ee7fc34 109 lcd.init();
el19zf 2:67b51ee7fc34 110 lcd.setContrast(0.5);
el19zf 3:b8fbaefc496c 111 engine.init();
el19zf 2:67b51ee7fc34 112 pad.init();
el19zf 7:c49f3d3b672f 113 shot.init();
el19zf 8:8287d2ef965d 114 collision.init();
el19zf 2:67b51ee7fc34 115 lcd.refresh();
eencae 0:b7f1f47bb26a 116 }
eencae 0:b7f1f47bb26a 117
el19zf 8:8287d2ef965d 118 void control_check()
el19zf 6:dce38fe4e092 119 {
el19zf 6:dce38fe4e092 120 engine.read_input(pad);
el19zf 6:dce38fe4e092 121 engine.update();
el19zf 8:8287d2ef965d 122 collision.set_pos(engine.get_pos());
el19zf 11:494cc44777fe 123 // if people is shotted, health -1 and reset the game
el19zf 8:8287d2ef965d 124 if(collision.check(lcd)) {
el19zf 10:02ab3324be6c 125 if(!collision.get_health()){
el19zf 11:494cc44777fe 126 interface.game_over(lcd,pad);
el19zf 11:494cc44777fe 127 lcd.clear();
el19zf 10:02ab3324be6c 128 } else{
el19zf 12:009895f6b6e4 129 init_timeout();
el19zf 10:02ab3324be6c 130 lcd.clear();
el19zf 10:02ab3324be6c 131 }
el19zf 8:8287d2ef965d 132 }
el19zf 9:62d6559f0d50 133 }
el19zf 9:62d6559f0d50 134
el19zf 11:494cc44777fe 135 void update()
el19zf 9:62d6559f0d50 136 {
el19zf 10:02ab3324be6c 137 if(timeout_flag)
el19zf 10:02ab3324be6c 138 control_check();
el19zf 10:02ab3324be6c 139 //control people and check collision
el19zf 9:62d6559f0d50 140 engine.draw(lcd);
el19zf 8:8287d2ef965d 141 collision.draw(lcd);
el19zf 11:494cc44777fe 142 if(collision.check_des(lcd)){
el19zf 11:494cc44777fe 143 interface.victory(lcd,pad);
el19zf 11:494cc44777fe 144 lcd.clear();
el19zf 11:494cc44777fe 145 }
el19zf 10:02ab3324be6c 146 if(!timeout_flag)
el19zf 11:494cc44777fe 147 count_flag = interface.count_down(lcd,count_flag);
el19zf 6:dce38fe4e092 148 }
el19zf 8:8287d2ef965d 149
el19zf 6:dce38fe4e092 150 void shot_update()
el19zf 6:dce38fe4e092 151 {
el19zf 7:c49f3d3b672f 152 shot.update();
el19zf 10:02ab3324be6c 153 // delete invalid shots
el19zf 7:c49f3d3b672f 154 shot.delete_shot();
el19zf 10:02ab3324be6c 155 //generate shot to keep constant number of shots
el19zf 10:02ab3324be6c 156 shot.init_shot();
el19zf 7:c49f3d3b672f 157 shot.draw(lcd);
el19zf 6:dce38fe4e092 158 }
el19zf 9:62d6559f0d50 159
el19zf 11:494cc44777fe 160
el19zf 11:494cc44777fe 161 void init_timeout()
el19zf 12:009895f6b6e4 162 {
el19zf 12:009895f6b6e4 163 lcd.clear();
el19zf 12:009895f6b6e4 164 lcd.drawRect(1,1,(collision.get_health()+1)*2,3,FILL_BLACK);
el19zf 12:009895f6b6e4 165 lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT);
el19zf 12:009895f6b6e4 166 lcd.refresh();
el19zf 12:009895f6b6e4 167 wait(0.5);
el19zf 12:009895f6b6e4 168 lcd.clear();
el19zf 12:009895f6b6e4 169 lcd.drawRect(1,1,collision.get_health()*2,3,FILL_BLACK);
el19zf 12:009895f6b6e4 170 lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT);
el19zf 12:009895f6b6e4 171 lcd.refresh();
el19zf 12:009895f6b6e4 172 wait(0.5);
el19zf 12:009895f6b6e4 173 engine.init();
el19zf 12:009895f6b6e4 174 shot.init();
el19zf 12:009895f6b6e4 175 //initialise time out
el19zf 11:494cc44777fe 176 timeout.attach(&time_out,3);
el19zf 11:494cc44777fe 177 timeout_flag = 0;
el19zf 11:494cc44777fe 178 count_flag = 18;
el19zf 10:02ab3324be6c 179 }
el19zf 10:02ab3324be6c 180
el19zf 11:494cc44777fe 181 void init_value()
el19zf 11:494cc44777fe 182 {
el19zf 11:494cc44777fe 183 timer_flag = 0;
el19zf 10:02ab3324be6c 184 timeout_flag = 0;
el19zf 11:494cc44777fe 185 count_flag = 18;
el19zf 11:494cc44777fe 186 paused_flag = 0;
el19zf 11:494cc44777fe 187 option_flag = 0;
el19zf 12:009895f6b6e4 188 }
el19zf 12:009895f6b6e4 189
el19zf 12:009895f6b6e4 190 void simp_game()
el19zf 12:009895f6b6e4 191 {
el19zf 12:009895f6b6e4 192 if(!interface.get_victory_flag()){
el19zf 12:009895f6b6e4 193 interface.simple_game(lcd,pad);
el19zf 12:009895f6b6e4 194 if(interface.get_sim_flag()){
el19zf 12:009895f6b6e4 195 init();
el19zf 12:009895f6b6e4 196 main_game(2.5,30);
el19zf 12:009895f6b6e4 197 }
el19zf 12:009895f6b6e4 198 }
el19zf 12:009895f6b6e4 199 interface.init();
el19zf 12:009895f6b6e4 200 }