ELEC2645 (2018/19) / Mbed 2 deprecated el17aio

Dependencies:   mbed

Committer:
ikenna1
Date:
Sat Apr 20 03:52:22 2019 +0000
Revision:
31:c7bd3ed16840
Parent:
30:711d722f3cef
Child:
32:098fbc1222cd
Added more complex shooter movement

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ikenna1 3:f9cd1a38d5c6 1 #include "RosenEngine.h"
ikenna1 23:0301effce801 2 DigitalIn A(PTB9);
ikenna1 3:f9cd1a38d5c6 3
ikenna1 2:66a4e5d7a7cd 4 // Constructor
ikenna1 2:66a4e5d7a7cd 5 RosenEngine::RosenEngine()
ikenna1 2:66a4e5d7a7cd 6 {
ikenna1 2:66a4e5d7a7cd 7
ikenna1 2:66a4e5d7a7cd 8 }
ikenna1 2:66a4e5d7a7cd 9 // Destructor
ikenna1 2:66a4e5d7a7cd 10 RosenEngine::~RosenEngine()
ikenna1 2:66a4e5d7a7cd 11 {
ikenna1 2:66a4e5d7a7cd 12
ikenna1 2:66a4e5d7a7cd 13 }
ikenna1 3:f9cd1a38d5c6 14
ikenna1 4:740e14ebbc97 15
ikenna1 9:241a1a7d8527 16 void RosenEngine::init(int ship_width,int ship_height,int ship_speed,int ship_xpos,int ship_ypos)
ikenna1 2:66a4e5d7a7cd 17 {
ikenna1 4:740e14ebbc97 18 // initialise the game parameters
ikenna1 9:241a1a7d8527 19 _ship.init(ship_width,ship_height,ship_speed,ship_xpos,ship_ypos);
ikenna1 15:009ccc07bb57 20 // place seeker above the ship
ikenna1 31:c7bd3ed16840 21 _enemy.init(48,0,3);
ikenna1 9:241a1a7d8527 22 _menu.init(16);
ikenna1 21:628fb703188f 23 _health.init(_shipno);
ikenna1 13:e114d362186d 24
ikenna1 3:f9cd1a38d5c6 25 }
ikenna1 27:f99249e727fd 26 void RosenEngine::reset()
ikenna1 27:f99249e727fd 27 {
ikenna1 27:f99249e727fd 28 _health.init(_shipno);
ikenna1 27:f99249e727fd 29 }
ikenna1 4:740e14ebbc97 30
ikenna1 5:bb6edc5b5be3 31 void RosenEngine::read_input(Gamepad &pad)
ikenna1 4:740e14ebbc97 32 {
ikenna1 4:740e14ebbc97 33 Vector2D mapped_coord = pad.get_coord();
ikenna1 8:87a845b8575e 34 _xjoystick = mapped_coord.x;
ikenna1 8:87a845b8575e 35 _yjoystick = mapped_coord.y;
ikenna1 9:241a1a7d8527 36 _d = pad.get_direction();
ikenna1 14:88ca5b1a111a 37 // printf("_xjoystick ,_yjoystick = %f , %f\n",_xjoystick, _yjoystick);
ikenna1 4:740e14ebbc97 38 }
ikenna1 4:740e14ebbc97 39
ikenna1 14:88ca5b1a111a 40 void RosenEngine::draw(N5110 &lcd, Gamepad &pad)
ikenna1 7:ed5870cfb3e0 41 {
ikenna1 31:c7bd3ed16840 42 lcd.drawRect(0,0,78,48,FILL_TRANSPARENT);
ikenna1 27:f99249e727fd 43 _health.draw_health(lcd,_shipno);
ikenna1 18:2cc6898de6b2 44 _health.draw_shields(lcd);
ikenna1 15:009ccc07bb57 45 _enemy.draw_seeker(lcd);
ikenna1 31:c7bd3ed16840 46 _enemy.draw_shooter(lcd,3);
ikenna1 21:628fb703188f 47 if(_shipno == 0) {
ikenna1 14:88ca5b1a111a 48 _ship.set_dimensions(9,6);
ikenna1 26:a53d41adf40b 49 _ship.draw_ship(lcd,_shipno);
ikenna1 23:0301effce801 50 _weapons.draw(lcd,pad,_shipno);
ikenna1 13:e114d362186d 51 }
ikenna1 21:628fb703188f 52 if(_shipno == 1) {
ikenna1 14:88ca5b1a111a 53 _ship.set_dimensions(7,10);
ikenna1 26:a53d41adf40b 54 _ship.draw_ship(lcd,_shipno);
ikenna1 26:a53d41adf40b 55 _weapons.draw(lcd,pad,_shipno);
ikenna1 26:a53d41adf40b 56 }
ikenna1 26:a53d41adf40b 57 if(_shipno == 2) {
ikenna1 26:a53d41adf40b 58 _ship.set_dimensions(7,10);
ikenna1 26:a53d41adf40b 59 _ship.draw_ship(lcd,_shipno);
ikenna1 23:0301effce801 60 _weapons.draw(lcd,pad,_shipno);
ikenna1 13:e114d362186d 61 }
ikenna1 11:73cd744ffa80 62 }
ikenna1 7:ed5870cfb3e0 63
ikenna1 7:ed5870cfb3e0 64 void RosenEngine::update(Gamepad &pad)
ikenna1 7:ed5870cfb3e0 65 {
ikenna1 15:009ccc07bb57 66 _enemy.update_seeker(ship_xpos, ship_ypos);
ikenna1 30:711d722f3cef 67 _enemy.update_shooter(ship_xpos, ship_ypos);
ikenna1 21:628fb703188f 68 if(_shipno == 0) {
ikenna1 14:88ca5b1a111a 69 _ship.update_ship(_xjoystick,_yjoystick);
ikenna1 14:88ca5b1a111a 70 _weapons.update();
ikenna1 14:88ca5b1a111a 71 }
ikenna1 23:0301effce801 72 if(_shipno == 1 && A == false) {
ikenna1 14:88ca5b1a111a 73 _ship.update_ship(_xjoystick,_yjoystick);
ikenna1 14:88ca5b1a111a 74 _weapons.update();
ikenna1 14:88ca5b1a111a 75 }
ikenna1 27:f99249e727fd 76 if(_shipno == 2) {
ikenna1 27:f99249e727fd 77 _ship.update_ship(_xjoystick,_yjoystick);
ikenna1 27:f99249e727fd 78 _weapons.update();
ikenna1 27:f99249e727fd 79 }
ikenna1 14:88ca5b1a111a 80 // _menu.update(_d);
ikenna1 20:5b4b3bf5795c 81
ikenna1 28:6319e928f0aa 82 if(enemy_ship_collision() == true) {
ikenna1 28:6319e928f0aa 83 _health.update(1,pad);
ikenna1 26:a53d41adf40b 84 _enemy.reset_seeker();
ikenna1 28:6319e928f0aa 85 pad.tone(500,0.05);
ikenna1 28:6319e928f0aa 86 wait(0.05);
ikenna1 28:6319e928f0aa 87 }
ikenna1 28:6319e928f0aa 88 if(enemy_projectile_collision() == true) {
ikenna1 26:a53d41adf40b 89 _enemy.reset_seeker();
ikenna1 28:6319e928f0aa 90 pad.tone(1000,0.05);
ikenna1 28:6319e928f0aa 91 wait(0.05);
ikenna1 28:6319e928f0aa 92 pad.tone(1500,0.05);
ikenna1 28:6319e928f0aa 93 wait(0.05);
ikenna1 28:6319e928f0aa 94 }
ikenna1 28:6319e928f0aa 95 // printf("collision check complete");
ikenna1 28:6319e928f0aa 96
ikenna1 28:6319e928f0aa 97 // warning sound
ikenna1 28:6319e928f0aa 98 Vector2D hp = _health.get_hp();
ikenna1 28:6319e928f0aa 99 int health = hp.x;
ikenna1 29:4c7b16b5b6df 100 if(_shipno == 0 || _shipno == 1) {
ikenna1 28:6319e928f0aa 101 if(health <= 2 ) {
ikenna1 29:4c7b16b5b6df 102 pad.tone(1300,0.05);
ikenna1 29:4c7b16b5b6df 103 wait(0.05);
ikenna1 26:a53d41adf40b 104 }
ikenna1 28:6319e928f0aa 105 }
ikenna1 29:4c7b16b5b6df 106 else if(_shipno == 2) {
ikenna1 28:6319e928f0aa 107 if(health <= 1 ) {
ikenna1 29:4c7b16b5b6df 108 pad.tone(1300,0.05);
ikenna1 29:4c7b16b5b6df 109 wait(0.05);
ikenna1 28:6319e928f0aa 110 }
ikenna1 28:6319e928f0aa 111 }
ikenna1 29:4c7b16b5b6df 112 printf("health = %d||shipno = %d",health,_shipno);
ikenna1 7:ed5870cfb3e0 113 }
ikenna1 9:241a1a7d8527 114 void RosenEngine::get_pos()
ikenna1 9:241a1a7d8527 115 {
ikenna1 9:241a1a7d8527 116 Vector2D ship_pos = _ship.get_pos();
ikenna1 9:241a1a7d8527 117 ship_xpos = ship_pos.x;
ikenna1 9:241a1a7d8527 118 ship_ypos = ship_pos.y;
ikenna1 9:241a1a7d8527 119 _weapons.init(ship_xpos, ship_ypos, ship_width);
ikenna1 13:e114d362186d 120 _ycursor = _menu.get_ycursor();
ikenna1 25:faba9eb44514 121
ikenna1 25:faba9eb44514 122 if(_shipno == 0) {
ikenna1 25:faba9eb44514 123 ship_width = 9;
ikenna1 25:faba9eb44514 124 ship_height = 6;
ikenna1 25:faba9eb44514 125 }
ikenna1 25:faba9eb44514 126 if(_shipno == 1) {
ikenna1 25:faba9eb44514 127 ship_width = 7;
ikenna1 25:faba9eb44514 128 ship_height = 10;
ikenna1 25:faba9eb44514 129 }
ikenna1 9:241a1a7d8527 130 }
ikenna1 9:241a1a7d8527 131 void RosenEngine::title(N5110 &lcd)
ikenna1 9:241a1a7d8527 132 {
ikenna1 30:711d722f3cef 133 _menu.title(lcd,_shipno);
ikenna1 10:c33d7593a275 134 _menu.update(_d);
ikenna1 10:c33d7593a275 135 }
ikenna1 13:e114d362186d 136 int RosenEngine::get_ycursor()
ikenna1 10:c33d7593a275 137 {
ikenna1 13:e114d362186d 138 _ycursor = _menu.get_ycursor();
ikenna1 10:c33d7593a275 139 return _ycursor;
ikenna1 12:47578eb9ea73 140 }
ikenna1 21:628fb703188f 141 int RosenEngine::get_shipno()
ikenna1 13:e114d362186d 142 {
ikenna1 21:628fb703188f 143 _shipno = _menu.get_xcursor();
ikenna1 21:628fb703188f 144 return _shipno;
ikenna1 13:e114d362186d 145 }
ikenna1 12:47578eb9ea73 146 void RosenEngine::ship_select(N5110 &lcd)
ikenna1 12:47578eb9ea73 147 {
ikenna1 12:47578eb9ea73 148 _menu.update(_d);
ikenna1 12:47578eb9ea73 149 _menu.disp_ships(lcd);
ikenna1 17:e65a9f981834 150 }
ikenna1 26:a53d41adf40b 151 bool RosenEngine::enemy_ship_collision()
ikenna1 18:2cc6898de6b2 152 {
ikenna1 25:faba9eb44514 153 // Vector2D ship_pos = _ship.get_pos();
ikenna1 19:3316dba9787e 154 Vector2D seeker_pos = _enemy.get_seekerpos();
ikenna1 25:faba9eb44514 155 int seeker_xpos = seeker_pos.x, seeker_ypos = seeker_pos.y;
ikenna1 25:faba9eb44514 156 int sxcol = 0;
ikenna1 25:faba9eb44514 157 int sycol = 0;
ikenna1 25:faba9eb44514 158 int ship_x[9],ship_y[6],seeker_x[9],seeker_y[6];
ikenna1 25:faba9eb44514 159 // printf("shipx = %d, shipy = %d\n",ship_xpos,ship_ypos);
ikenna1 19:3316dba9787e 160 // create an array of all x positions for the ship sprite i.e along its width (ship_x)
ikenna1 25:faba9eb44514 161 for(int cx = 0; cx<=9; cx=cx+1) {
ikenna1 25:faba9eb44514 162 ship_x[cx] = ship_xpos + cx;
ikenna1 25:faba9eb44514 163 seeker_x[cx] = seeker_xpos + cx;
ikenna1 25:faba9eb44514 164 // printf("ship_x = %d, seeker_x = %d\n", ship_x[cx], seeker_x[cx]);
ikenna1 19:3316dba9787e 165 }
ikenna1 19:3316dba9787e 166
ikenna1 19:3316dba9787e 167 // create an array of all y positions for the ship sprite i.e along its height (ship_y)
ikenna1 25:faba9eb44514 168 for(int cy = 0; cy<=6; cy=cy+1) {
ikenna1 25:faba9eb44514 169 ship_y[cy] = (ship_ypos ) + cy ;
ikenna1 25:faba9eb44514 170 seeker_y[cy] = seeker_ypos + cy;
ikenna1 25:faba9eb44514 171 // printf("ship_y = %d, seeker_y = %d\n", ship_y[cy], seeker_y[cy]);
ikenna1 19:3316dba9787e 172 }
ikenna1 19:3316dba9787e 173 // check all values of ship position against all values of seekers x position
ikenna1 20:5b4b3bf5795c 174 for(int nx = 0; nx<=9; nx=nx+1) {
ikenna1 20:5b4b3bf5795c 175 for(int mx = 0; mx<=9; mx=mx+1) {
ikenna1 19:3316dba9787e 176 if(ship_x[nx] == seeker_x[mx]) {
ikenna1 25:faba9eb44514 177 sxcol = 1;
ikenna1 19:3316dba9787e 178 }
ikenna1 19:3316dba9787e 179 }
ikenna1 19:3316dba9787e 180 }
ikenna1 20:5b4b3bf5795c 181 for(int ny = 0; ny<=6; ny=ny+1) {
ikenna1 20:5b4b3bf5795c 182 for(int my = 0; my<=6; my=my+1) {
ikenna1 19:3316dba9787e 183 if(ship_y[ny] == seeker_y[my]) {
ikenna1 25:faba9eb44514 184 sycol = 1;
ikenna1 19:3316dba9787e 185 }
ikenna1 19:3316dba9787e 186 }
ikenna1 19:3316dba9787e 187 }
ikenna1 20:5b4b3bf5795c 188
ikenna1 25:faba9eb44514 189 printf("sxcol = %d, sycol = %d\n", sxcol, sycol);
ikenna1 25:faba9eb44514 190 if(sxcol == 1 && sycol == 1) {
ikenna1 26:a53d41adf40b 191 return true;
ikenna1 26:a53d41adf40b 192 } else {
ikenna1 26:a53d41adf40b 193 return false;
ikenna1 18:2cc6898de6b2 194 }
ikenna1 23:0301effce801 195 }
ikenna1 26:a53d41adf40b 196 bool RosenEngine::enemy_projectile_collision()
ikenna1 23:0301effce801 197 {
ikenna1 25:faba9eb44514 198 Vector2D seeker_pos = _enemy.get_seekerpos();
ikenna1 25:faba9eb44514 199 int lazer_x[3],seeker_x[9],seeker_y[38];
ikenna1 25:faba9eb44514 200 int wxcol = 0;
ikenna1 25:faba9eb44514 201 int wycol = 0;
ikenna1 24:ab821bfeb383 202
ikenna1 24:ab821bfeb383 203 // get seekers x any y values and put into arrays
ikenna1 25:faba9eb44514 204 for(int cx = 0; cx<=9; cx=cx+1) {
ikenna1 25:faba9eb44514 205 seeker_x[cx] = seeker_pos.x + cx;
ikenna1 24:ab821bfeb383 206 }
ikenna1 25:faba9eb44514 207 for(int cy = 0; cy<=6; cy=cy+1) {
ikenna1 25:faba9eb44514 208 seeker_y[cy] = seeker_pos.y + cy;
ikenna1 24:ab821bfeb383 209 }
ikenna1 25:faba9eb44514 210
ikenna1 25:faba9eb44514 211 // kestrel artemis missle
ikenna1 24:ab821bfeb383 212 if(_shipno == 0) {
ikenna1 25:faba9eb44514 213 Vector2D missle_pos = _weapons.get_pos(_shipno);
ikenna1 24:ab821bfeb383 214
ikenna1 25:faba9eb44514 215 for(int cx = 0; cx<=9; cx=cx+1) {
ikenna1 25:faba9eb44514 216 seeker_x[cx] = seeker_pos.x + cx;
ikenna1 25:faba9eb44514 217 if(seeker_x[cx] == missle_pos.x) {
ikenna1 26:a53d41adf40b 218 printf("seeker_xpos = %f, missle_xpos = %f\n",seeker_pos.x,missle_pos.x);
ikenna1 25:faba9eb44514 219 wxcol = 1;
ikenna1 25:faba9eb44514 220 }
ikenna1 25:faba9eb44514 221 }
ikenna1 25:faba9eb44514 222 for(int cy = 0; cy<=7; cy=cy+1) {
ikenna1 25:faba9eb44514 223 seeker_y[cy] = seeker_pos.y + cy;
ikenna1 26:a53d41adf40b 224 if(seeker_y[cy] == missle_pos.y + 4) {
ikenna1 26:a53d41adf40b 225 printf("seeker_ypos = %f, missle_ypos = %f\n",seeker_pos.y,missle_pos.y);
ikenna1 25:faba9eb44514 226 wycol = 1;
ikenna1 25:faba9eb44514 227 }
ikenna1 25:faba9eb44514 228 }
ikenna1 25:faba9eb44514 229 if(wxcol == 1 && wycol == 1) {
ikenna1 27:f99249e727fd 230 _weapons.set_pos(ship_xpos,ship_ypos); // reset missle after contact
ikenna1 26:a53d41adf40b 231 return true;
ikenna1 25:faba9eb44514 232 }
ikenna1 24:ab821bfeb383 233 }
ikenna1 25:faba9eb44514 234
ikenna1 25:faba9eb44514 235
ikenna1 25:faba9eb44514 236 // imperion lazer
ikenna1 24:ab821bfeb383 237 if(_shipno == 1) {
ikenna1 25:faba9eb44514 238 for(int cx = 0; cx<=3; cx=cx+1) {
ikenna1 25:faba9eb44514 239 lazer_x[cx] = (ship_xpos + 2) + cx;
ikenna1 24:ab821bfeb383 240 }
ikenna1 24:ab821bfeb383 241 // ony register collision if seeker is above ship
ikenna1 25:faba9eb44514 242 if(seeker_pos.y + 6 < ship_ypos) {
ikenna1 24:ab821bfeb383 243 // check all values of ship position against all values of seekers x position
ikenna1 24:ab821bfeb383 244 for(int nx = 0; nx<=3; nx=nx+1) {
ikenna1 24:ab821bfeb383 245 for(int mx = 0; mx<=9; mx=mx+1) {
ikenna1 24:ab821bfeb383 246 if(lazer_x[nx] == seeker_x[mx]) {
ikenna1 25:faba9eb44514 247 wxcol = 1;
ikenna1 26:a53d41adf40b 248 printf("lazer_x = %d,seeker_x = %f\n");
ikenna1 24:ab821bfeb383 249 }
ikenna1 24:ab821bfeb383 250 }
ikenna1 24:ab821bfeb383 251 }
ikenna1 24:ab821bfeb383 252 }
ikenna1 25:faba9eb44514 253 if(wxcol == 1 && A == true) {
ikenna1 26:a53d41adf40b 254 return true;
ikenna1 28:6319e928f0aa 255 } else {
ikenna1 26:a53d41adf40b 256 return false;
ikenna1 24:ab821bfeb383 257 }
ikenna1 23:0301effce801 258 }
ikenna1 27:f99249e727fd 259 if(_shipno == 2) {
ikenna1 27:f99249e727fd 260 return false;
ikenna1 28:6319e928f0aa 261 }
ikenna1 29:4c7b16b5b6df 262 }
ikenna1 30:711d722f3cef 263 void RosenEngine::score(int points){
ikenna1 30:711d722f3cef 264 _score = _score + points;
ikenna1 18:2cc6898de6b2 265 }