Snake vs Block Game to be run upon K64F.

Dependencies:   mbed

Committer:
AhmedPlaymaker
Date:
Sat May 04 12:28:04 2019 +0000
Revision:
67:39b9ba6019b0
Parent:
65:2872ca289b49
Child:
68:b9cfd27987ac
Made the startscreen class much more organised

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AhmedPlaymaker 7:48ba87cd79b5 1 #include "SnakevsBlock.h"
AhmedPlaymaker 7:48ba87cd79b5 2
AhmedPlaymaker 7:48ba87cd79b5 3 SnakevsBlock::SnakevsBlock()
AhmedPlaymaker 7:48ba87cd79b5 4 {
AhmedPlaymaker 7:48ba87cd79b5 5
AhmedPlaymaker 7:48ba87cd79b5 6 }
AhmedPlaymaker 7:48ba87cd79b5 7
AhmedPlaymaker 7:48ba87cd79b5 8 SnakevsBlock::~SnakevsBlock()
AhmedPlaymaker 7:48ba87cd79b5 9 {
AhmedPlaymaker 7:48ba87cd79b5 10
AhmedPlaymaker 7:48ba87cd79b5 11 }
AhmedPlaymaker 7:48ba87cd79b5 12
AhmedPlaymaker 7:48ba87cd79b5 13 void SnakevsBlock::init()
AhmedPlaymaker 7:48ba87cd79b5 14 {
AhmedPlaymaker 67:39b9ba6019b0 15 SnakevsBlock::object_initialisations();
AhmedPlaymaker 41:4edac50f010d 16 //The level initialisation and all the other initial information passing will be done here
AhmedPlaymaker 19:05cc9f801468 17 level = 1;
AhmedPlaymaker 59:c65a2e933c47 18 _maxLength = 10; // this makes us go to the next level if if maxLength is achieved;
AhmedPlaymaker 41:4edac50f010d 19 garbage = 0; //this is to allow the user to change the position of reference for motion control by saving the absolute angle.
AhmedPlaymaker 64:540aa1602372 20 _dropbuff = 0; //this makes the food fall at diffrent times when a particular level starts.
AhmedPlaymaker 56:142e9fdb77a8 21 send_block_number = 0; //this is 0 when there is no collision, thus block number isn't remembered for next set (which would lead to empty blocks).
AhmedPlaymaker 59:c65a2e933c47 22 blockgap = 300; //this is the number of itterations the block will reccur after in the first level.
AhmedPlaymaker 62:ebf6ecf8a6d5 23 for(int i=0; i<=14; i++) {
AhmedPlaymaker 62:ebf6ecf8a6d5 24 b[i] = 1; //makes all the snake beads move by default.
AhmedPlaymaker 62:ebf6ecf8a6d5 25 }
AhmedPlaymaker 7:48ba87cd79b5 26 }
AhmedPlaymaker 7:48ba87cd79b5 27
AhmedPlaymaker 41:4edac50f010d 28 void SnakevsBlock::reset()
AhmedPlaymaker 41:4edac50f010d 29 {
AhmedPlaymaker 67:39b9ba6019b0 30 SnakevsBlock::object_initialisations();
AhmedPlaymaker 41:4edac50f010d 31 //This prepares the game for the next level by reseting certain variables.
AhmedPlaymaker 64:540aa1602372 32 _dropbuff = 0;
AhmedPlaymaker 67:39b9ba6019b0 33 if(blockgap >= 60) {
AhmedPlaymaker 62:ebf6ecf8a6d5 34 blockgap -= 10; //to make progressive levels harder by making the blocks drop more frequently.
AhmedPlaymaker 62:ebf6ecf8a6d5 35 }
AhmedPlaymaker 49:441c32f6603e 36 }
AhmedPlaymaker 49:441c32f6603e 37
AhmedPlaymaker 49:441c32f6603e 38 void SnakevsBlock::object_initialisations()
AhmedPlaymaker 49:441c32f6603e 39 {
AhmedPlaymaker 49:441c32f6603e 40 _l.init(); //length calc object initialisation.
AhmedPlaymaker 49:441c32f6603e 41 _s.init(); //snake object initialisation.
AhmedPlaymaker 49:441c32f6603e 42 _f.init(); //food 1 object initialisation.
AhmedPlaymaker 49:441c32f6603e 43 _ff.init(); //food 2 object initialisation.
AhmedPlaymaker 49:441c32f6603e 44 _fff.init(); //food 3 object initialisation.
AhmedPlaymaker 49:441c32f6603e 45 _b.init(); //block object initialisation.
AhmedPlaymaker 41:4edac50f010d 46 }
AhmedPlaymaker 7:48ba87cd79b5 47
AhmedPlaymaker 39:210ac915e0a0 48 void SnakevsBlock::read_input(Gamepad &pad, FXOS8700CQ &device, int g_mode)
AhmedPlaymaker 7:48ba87cd79b5 49 {
AhmedPlaymaker 63:205f0ca48473 50 SnakevsBlock::calculateTilt(pad, device);
AhmedPlaymaker 63:205f0ca48473 51
AhmedPlaymaker 56:142e9fdb77a8 52 switch (g_mode) {
AhmedPlaymaker 62:ebf6ecf8a6d5 53 case 1:
AhmedPlaymaker 62:ebf6ecf8a6d5 54 _d = pad.get_direction(); //Obtains Direction pushed towards on Joystick.
AhmedPlaymaker 62:ebf6ecf8a6d5 55 break;
AhmedPlaymaker 62:ebf6ecf8a6d5 56 case 2:
AhmedPlaymaker 63:205f0ca48473 57 if (_tiltAngle >= 6) {
AhmedPlaymaker 62:ebf6ecf8a6d5 58 _d = E;
AhmedPlaymaker 63:205f0ca48473 59 } else if (_tiltAngle <= -6) {
AhmedPlaymaker 62:ebf6ecf8a6d5 60 _d = W;
AhmedPlaymaker 62:ebf6ecf8a6d5 61 } else {
AhmedPlaymaker 62:ebf6ecf8a6d5 62 _d = CENTRE;
AhmedPlaymaker 62:ebf6ecf8a6d5 63 }
AhmedPlaymaker 62:ebf6ecf8a6d5 64 break;
AhmedPlaymaker 38:30e4e6191762 65 }
AhmedPlaymaker 63:205f0ca48473 66 SnakevsBlock::lightTheLEDS(pad); //This function ligths the LEDS dependent on the direction of travel.
AhmedPlaymaker 38:30e4e6191762 67 //printf("%d",gm);
AhmedPlaymaker 63:205f0ca48473 68 //printf("%f",_tiltAngle);
AhmedPlaymaker 63:205f0ca48473 69 //printf("%f",device.get_roll_angle());
AhmedPlaymaker 63:205f0ca48473 70 }
AhmedPlaymaker 63:205f0ca48473 71
AhmedPlaymaker 63:205f0ca48473 72 void SnakevsBlock::calculateTilt(Gamepad &pad, FXOS8700CQ &device) //this just reads the angle of tilt required for motion contol and also processes it if A is pressed.
AhmedPlaymaker 63:205f0ca48473 73 {
AhmedPlaymaker 63:205f0ca48473 74 device.get_values();
AhmedPlaymaker 63:205f0ca48473 75 _tiltAngle = -device.get_roll_angle();
AhmedPlaymaker 63:205f0ca48473 76 //if button A is pressed then reset that particular position to center
AhmedPlaymaker 63:205f0ca48473 77 if (pad.check_event(Gamepad::A_PRESSED) == true) {
AhmedPlaymaker 63:205f0ca48473 78 garbage = _tiltAngle;
AhmedPlaymaker 63:205f0ca48473 79 }
AhmedPlaymaker 63:205f0ca48473 80 _tiltAngle = -device.get_roll_angle() - garbage;
AhmedPlaymaker 63:205f0ca48473 81
AhmedPlaymaker 63:205f0ca48473 82 //device.get_values();
AhmedPlaymaker 63:205f0ca48473 83 //printf("%f",_tiltAngle);
AhmedPlaymaker 38:30e4e6191762 84 //printf("%f",device.get_roll_angle());
AhmedPlaymaker 7:48ba87cd79b5 85 }
AhmedPlaymaker 7:48ba87cd79b5 86
AhmedPlaymaker 63:205f0ca48473 87 void SnakevsBlock::lightTheLEDS(Gamepad &pad) //This function ligths the LEDS dependent on the direction of travel.
AhmedPlaymaker 63:205f0ca48473 88 {
AhmedPlaymaker 63:205f0ca48473 89 if (_d == E) {
AhmedPlaymaker 63:205f0ca48473 90 for(int led = 4; led <= 6; led++) {
AhmedPlaymaker 63:205f0ca48473 91 pad.led(led,1);
AhmedPlaymaker 63:205f0ca48473 92 }
AhmedPlaymaker 63:205f0ca48473 93 } else if (_d == W) {
AhmedPlaymaker 63:205f0ca48473 94 for(int led = 1; led <= 3; led++) {
AhmedPlaymaker 63:205f0ca48473 95 pad.led(led,1);
AhmedPlaymaker 63:205f0ca48473 96 }
AhmedPlaymaker 63:205f0ca48473 97 } else {
AhmedPlaymaker 63:205f0ca48473 98 for(int led = 1; led <= 6; led++) {
AhmedPlaymaker 63:205f0ca48473 99 pad.led(led,0);
AhmedPlaymaker 63:205f0ca48473 100 }
AhmedPlaymaker 63:205f0ca48473 101 }
AhmedPlaymaker 63:205f0ca48473 102 }
AhmedPlaymaker 63:205f0ca48473 103
AhmedPlaymaker 62:ebf6ecf8a6d5 104 void SnakevsBlock::draw(N5110 &lcd, Gamepad &pad)
AhmedPlaymaker 62:ebf6ecf8a6d5 105 {
AhmedPlaymaker 55:df0825049171 106 _length = _l._getLength(); //saves the snake length into a private variable.
AhmedPlaymaker 53:527cf297b088 107 _s.draw(lcd, _length, level); //Draws the Snake. //Make these snake buffs relative to the snake drops which in turn relate to the game speed
AhmedPlaymaker 64:540aa1602372 108 if(_dropbuff >= 0) {
AhmedPlaymaker 64:540aa1602372 109 _f.draw(lcd); //Draws the first food after a loop delay of 0.
AhmedPlaymaker 39:210ac915e0a0 110 }
AhmedPlaymaker 64:540aa1602372 111 if(_dropbuff >= 50) {
AhmedPlaymaker 64:540aa1602372 112 _ff.draw(lcd); //Draws the first food after a loop delay of 50.
AhmedPlaymaker 9:d1d79d4ee673 113 }
AhmedPlaymaker 64:540aa1602372 114 if(_dropbuff >= 80) {
AhmedPlaymaker 64:540aa1602372 115 _fff.draw(lcd); //Draws the first food after a loop delay of 80.
AhmedPlaymaker 39:210ac915e0a0 116 }
AhmedPlaymaker 64:540aa1602372 117 _dropbuff +=1;
AhmedPlaymaker 64:540aa1602372 118 if(_dropbuff >= 8) {
AhmedPlaymaker 48:d774bb162c61 119 _b.draw(lcd, _length);
AhmedPlaymaker 19:05cc9f801468 120 }
AhmedPlaymaker 7:48ba87cd79b5 121 //Code to print length on game screen.
AhmedPlaymaker 41:4edac50f010d 122 _l.print_length_on_screen(lcd);
AhmedPlaymaker 62:ebf6ecf8a6d5 123 }
AhmedPlaymaker 39:210ac915e0a0 124
AhmedPlaymaker 63:205f0ca48473 125 void SnakevsBlock::update(N5110 &lcd, Gamepad &pad) //Updates objects on screen.
AhmedPlaymaker 39:210ac915e0a0 126 {
AhmedPlaymaker 42:973bb6036f81 127 send_block_number = 0; //this is for the game to decide wether to remember the number on the block for the current itteration.
AhmedPlaymaker 62:ebf6ecf8a6d5 128 //we dont need to remember if it has already gone past the screen.
AhmedPlaymaker 63:205f0ca48473 129 SnakevsBlock::CheckSnakeFoodCollision(pad); //Function checks for when the snake collides with it's food.
AhmedPlaymaker 63:205f0ca48473 130 SnakevsBlock::CheckSnakeBlockCollision(pad); //Function checks for when the snake collides with any of the blocks.
AhmedPlaymaker 63:205f0ca48473 131 SnakevsBlock::CheckSnakeBlockSidesCollision(pad); //Function checks for when the snake collides with any of the blocks' sides.
AhmedPlaymaker 41:4edac50f010d 132 _s.update(_d, b); //_d is the direction of joystick and b controls the motion of a section of the snake relative to obstruction
AhmedPlaymaker 9:d1d79d4ee673 133 _f.update();
AhmedPlaymaker 9:d1d79d4ee673 134 _ff.update();
AhmedPlaymaker 62:ebf6ecf8a6d5 135 _fff.update();
AhmedPlaymaker 48:d774bb162c61 136 _b.update(blocknum, blockgap, srn, send_block_number);
AhmedPlaymaker 63:205f0ca48473 137
AhmedPlaymaker 63:205f0ca48473 138 }
AhmedPlaymaker 63:205f0ca48473 139
AhmedPlaymaker 63:205f0ca48473 140 int SnakevsBlock::CheckGameProgression(N5110 &lcd, Gamepad &pad, SDFileSystem &sd)
AhmedPlaymaker 63:205f0ca48473 141 {
AhmedPlaymaker 63:205f0ca48473 142 //Function handles level progression and level failure operations by using the class WinLoose.
AhmedPlaymaker 49:441c32f6603e 143 if(_length == 0) {
AhmedPlaymaker 49:441c32f6603e 144 _wl.GameOver(lcd,pad);
AhmedPlaymaker 49:441c32f6603e 145 }
AhmedPlaymaker 63:205f0ca48473 146 if((pad.check_event(Gamepad::BACK_PRESSED))||(_length == 0)) { //Waits for Back button to be pressed or the length to reach 0.
AhmedPlaymaker 25:e827f1a8fadc 147 back = 1;
AhmedPlaymaker 25:e827f1a8fadc 148 SnakevsBlock::init();
AhmedPlaymaker 62:ebf6ecf8a6d5 149 } else {
AhmedPlaymaker 25:e827f1a8fadc 150 back = 0;
AhmedPlaymaker 25:e827f1a8fadc 151 }
AhmedPlaymaker 52:c2faa96cf293 152 //printf("%d\n",_length);
AhmedPlaymaker 59:c65a2e933c47 153 if(_length >= _maxLength) {
AhmedPlaymaker 59:c65a2e933c47 154 _maxLength++;
AhmedPlaymaker 50:3cf9a94a264e 155 level = _wl.LevelComplete(lcd, pad, level);
AhmedPlaymaker 50:3cf9a94a264e 156 _Setstats.write(level, sd);
AhmedPlaymaker 63:205f0ca48473 157 //_statset.read(sd); //to read the currently stored value.
AhmedPlaymaker 63:205f0ca48473 158 SnakevsBlock::reset(); //reset prepares the game for the next level.
AhmedPlaymaker 50:3cf9a94a264e 159 }
AhmedPlaymaker 63:205f0ca48473 160 //_statset.read(sd); //to read the currently stored value.
AhmedPlaymaker 25:e827f1a8fadc 161 return back;
AhmedPlaymaker 7:48ba87cd79b5 162 }
AhmedPlaymaker 7:48ba87cd79b5 163
AhmedPlaymaker 7:48ba87cd79b5 164 void SnakevsBlock::get_pos()
AhmedPlaymaker 7:48ba87cd79b5 165 {
AhmedPlaymaker 7:48ba87cd79b5 166 //printf("player pos = %f %f \n", player_pos.x, player_pos.y); //top left of player sprite
AhmedPlaymaker 7:48ba87cd79b5 167 // 81.000000 0.000000 top right
AhmedPlaymaker 7:48ba87cd79b5 168 // 0.000000 0.000000 is top left
AhmedPlaymaker 7:48ba87cd79b5 169 // 81.000000 45.000000 bottom right
AhmedPlaymaker 62:ebf6ecf8a6d5 170 snakex = _s.get_pos().x; //this could be snake_pos[0].x or simply snake_pos[0] to represent both x&y but as it is used the most, it improves readability.
AhmedPlaymaker 43:233f93860d08 171 snakey = _s.get_pos().y; //this could be snake_pos[0].y or simply snake_pos[0] to represent both x&y but as it is used the most, it improves readability.
AhmedPlaymaker 7:48ba87cd79b5 172 //printf("snakexy in GAME = %d %d \n", snakex, snakey);
AhmedPlaymaker 41:4edac50f010d 173 //Obtains all required coordinates.
AhmedPlaymaker 41:4edac50f010d 174 food_pos[0] = _f.get_pos();
AhmedPlaymaker 41:4edac50f010d 175 food_pos[1] = _ff.get_pos();
AhmedPlaymaker 41:4edac50f010d 176 food_pos[2] = _fff.get_pos();
AhmedPlaymaker 41:4edac50f010d 177 //obtains origin cordinates of block.
AhmedPlaymaker 41:4edac50f010d 178 b_pos = _b.get_pos();
AhmedPlaymaker 41:4edac50f010d 179 //this saves the positions of each snake beed (the first to the last) in a single array. Element[0] is the top beed and soo on.
AhmedPlaymaker 41:4edac50f010d 180 snake_pos[0] = _s.get_pos(); //gets the position of the top beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 181 snake_pos[1] = _s.get_pos_before1(); //gets the position of the second beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 182 snake_pos[2] = _s.get_pos_before2(); //gets the position of the third beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 183 snake_pos[3] = _s.get_pos_before3(); //gets the position of the fourth beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 184 snake_pos[4] = _s.get_pos_before4(); //gets the position of the fifth beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 185 snake_pos[5] = _s.get_pos_before5(); //gets the position of the sixth beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 186 snake_pos[6] = _s.get_pos_before6(); //gets the position of the seventh beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 187 snake_pos[7] = _s.get_pos_before7(); //gets the position of the eight beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 188 snake_pos[8] = _s.get_pos_before8(); //gets the position of the ninth beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 189 snake_pos[9] = _s.get_pos_before9(); //gets the position of the last beed and saves in array.
AhmedPlaymaker 62:ebf6ecf8a6d5 190 }
AhmedPlaymaker 62:ebf6ecf8a6d5 191
AhmedPlaymaker 9:d1d79d4ee673 192
AhmedPlaymaker 62:ebf6ecf8a6d5 193 void SnakevsBlock::CheckSnakeFoodCollision(Gamepad &pad)
AhmedPlaymaker 62:ebf6ecf8a6d5 194 {
AhmedPlaymaker 32:3a3bdeffdf62 195 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 32:3a3bdeffdf62 196 //of the three food sprites, if so then the food location is reset and
AhmedPlaymaker 32:3a3bdeffdf62 197 //length of the snake is increased using the length variable.
AhmedPlaymaker 65:2872ca289b49 198
AhmedPlaymaker 65:2872ca289b49 199 SnakevsBlock::CheckSnakeFoodYCollision(pad);
AhmedPlaymaker 65:2872ca289b49 200
AhmedPlaymaker 29:c6358c39a70e 201 _f.set_pos(food_pos[0]);
AhmedPlaymaker 29:c6358c39a70e 202 _ff.set_pos(food_pos[1]);
AhmedPlaymaker 29:c6358c39a70e 203 _fff.set_pos(food_pos[2]);
AhmedPlaymaker 29:c6358c39a70e 204 }
AhmedPlaymaker 62:ebf6ecf8a6d5 205
AhmedPlaymaker 65:2872ca289b49 206 void SnakevsBlock::CheckSnakeFoodYCollision(Gamepad &pad)
AhmedPlaymaker 65:2872ca289b49 207 {
AhmedPlaymaker 65:2872ca289b49 208 for(int y=0; y<=2; y++) { //this loop automatically creates each coordinate of collision in the y postion that will be used in ImplementSnakeFoodCollision(pad, x, y).
AhmedPlaymaker 65:2872ca289b49 209 SnakevsBlock::CheckSnakeFoodXCollision(pad, y);
AhmedPlaymaker 65:2872ca289b49 210 }
AhmedPlaymaker 65:2872ca289b49 211
AhmedPlaymaker 65:2872ca289b49 212 }
AhmedPlaymaker 65:2872ca289b49 213
AhmedPlaymaker 65:2872ca289b49 214 void SnakevsBlock::CheckSnakeFoodXCollision(Gamepad &pad, int y)
AhmedPlaymaker 65:2872ca289b49 215 {
AhmedPlaymaker 65:2872ca289b49 216
AhmedPlaymaker 65:2872ca289b49 217 for(int x=0; x<=2; x++) { //this loop automatically creates each coordinate of collision in the x postion that will be used in ImplementSnakeFoodCollision(pad, x, y).
AhmedPlaymaker 65:2872ca289b49 218 SnakevsBlock::ImplementSnakeFoodCollision(pad, x, y);
AhmedPlaymaker 65:2872ca289b49 219 }
AhmedPlaymaker 65:2872ca289b49 220
AhmedPlaymaker 65:2872ca289b49 221 }
AhmedPlaymaker 65:2872ca289b49 222
AhmedPlaymaker 65:2872ca289b49 223 void SnakevsBlock::ImplementSnakeFoodCollision(Gamepad &pad, int x, int y)
AhmedPlaymaker 65:2872ca289b49 224 {
AhmedPlaymaker 65:2872ca289b49 225 for(int food_sr=0; food_sr<=2; food_sr++) { //this loop automatically detects which food we are interacting with.
AhmedPlaymaker 65:2872ca289b49 226 if (
AhmedPlaymaker 65:2872ca289b49 227 ((snakey + y == food_pos[food_sr].y) ||
AhmedPlaymaker 65:2872ca289b49 228 (snakey + y == food_pos[food_sr].y + 1) ||
AhmedPlaymaker 65:2872ca289b49 229 (snakey + y == food_pos[food_sr].y + 2)) &&
AhmedPlaymaker 65:2872ca289b49 230 ((snakex + x == food_pos[food_sr].x) ||
AhmedPlaymaker 65:2872ca289b49 231 (snakex + x == food_pos[food_sr].x + 1) ||
AhmedPlaymaker 65:2872ca289b49 232 (snakex + x == food_pos[food_sr].x + 2))
AhmedPlaymaker 65:2872ca289b49 233 ) {
AhmedPlaymaker 65:2872ca289b49 234 //printf("snake feast working \n");
AhmedPlaymaker 65:2872ca289b49 235 //audio feedback
AhmedPlaymaker 65:2872ca289b49 236 pad.tone(786.0,0.1);
AhmedPlaymaker 65:2872ca289b49 237 food_pos[food_sr].x = (rand() % 82); //this makes the food pop up at a random, unspecified location in the x axis.
AhmedPlaymaker 65:2872ca289b49 238 food_pos[food_sr].y = -3;
AhmedPlaymaker 65:2872ca289b49 239 _l.PlusLength();
AhmedPlaymaker 65:2872ca289b49 240 }
AhmedPlaymaker 65:2872ca289b49 241 }
AhmedPlaymaker 65:2872ca289b49 242
AhmedPlaymaker 65:2872ca289b49 243 }
AhmedPlaymaker 65:2872ca289b49 244
AhmedPlaymaker 62:ebf6ecf8a6d5 245 void SnakevsBlock::CheckSnakeBlockCollision(Gamepad &pad)
AhmedPlaymaker 62:ebf6ecf8a6d5 246 {
AhmedPlaymaker 41:4edac50f010d 247 //Obtains the numbers inside the block.
AhmedPlaymaker 39:210ac915e0a0 248 b_number = _b.get_number();
AhmedPlaymaker 39:210ac915e0a0 249 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 39:210ac915e0a0 250 //of the blocks which are a maximum of 5, if so then the snake length reduces and the block number reduces
AhmedPlaymaker 39:210ac915e0a0 251 //the block has to move slower and come down after every 2/3 iterations(dependent on the snake size.(think about this)
AhmedPlaymaker 39:210ac915e0a0 252 for(int block=0; block<=83; block+=1) { //this loop automatically detects for each section of block and each combination of collision
AhmedPlaymaker 54:20abd16c7d74 253 if (((snakey == b_pos.y + 11)||
AhmedPlaymaker 62:ebf6ecf8a6d5 254 (snakey == b_pos.y + 10)||
AhmedPlaymaker 62:ebf6ecf8a6d5 255 (snakey == b_pos.y + 9)||
AhmedPlaymaker 62:ebf6ecf8a6d5 256 (snakey == b_pos.y + 8))&&
AhmedPlaymaker 62:ebf6ecf8a6d5 257 (snakex + 1 == b_pos.x + block)) {
AhmedPlaymaker 43:233f93860d08 258 //the or for the block's y position is due to the fact the exact y co-ordinate might not be collided if the snake's length has increased in the same itteration.
AhmedPlaymaker 39:210ac915e0a0 259 //printf("snake collision working \n");
AhmedPlaymaker 39:210ac915e0a0 260 //audio feedback
AhmedPlaymaker 39:210ac915e0a0 261 srn = CheckBlock(block); //this tells us which of the 5 blocks we are colliding with
AhmedPlaymaker 63:205f0ca48473 262 blocknum = b_number[srn]; //this saves the number inside the colliding block into blocknum.
AhmedPlaymaker 65:2872ca289b49 263 ImplementSnakeBlockCollision(pad); //this implements the collision once the conditions are met.
AhmedPlaymaker 65:2872ca289b49 264 SnakevsBlock::_setVelocity(srn); //sets the block and foods free or frezes them depending on snake length.
AhmedPlaymaker 12:1e601b176437 265 }
AhmedPlaymaker 39:210ac915e0a0 266 }
AhmedPlaymaker 39:210ac915e0a0 267 }
AhmedPlaymaker 62:ebf6ecf8a6d5 268
AhmedPlaymaker 65:2872ca289b49 269 void SnakevsBlock::_setVelocity(int srn)
AhmedPlaymaker 62:ebf6ecf8a6d5 270 {
AhmedPlaymaker 65:2872ca289b49 271 if((_length>=10)&&(b_number[srn]>0)) { //this makes the block stop moving down if it's length is more than 10 and still collides.
AhmedPlaymaker 65:2872ca289b49 272 velocity = 0; //the block and food have to stop as if length of snake is 15 and it reaches 10 one by one, it stays at the same place, as max virtual length
AhmedPlaymaker 65:2872ca289b49 273 } else { //is 10.
AhmedPlaymaker 65:2872ca289b49 274 velocity = 1;
AhmedPlaymaker 65:2872ca289b49 275 }
AhmedPlaymaker 39:210ac915e0a0 276 _b.velocity.y = velocity;
AhmedPlaymaker 39:210ac915e0a0 277 _f.velocity.y = velocity;
AhmedPlaymaker 39:210ac915e0a0 278 _ff.velocity.y = velocity;
AhmedPlaymaker 39:210ac915e0a0 279 _fff.velocity.y = velocity;
AhmedPlaymaker 27:3b4775a0d0bb 280 }
AhmedPlaymaker 62:ebf6ecf8a6d5 281
AhmedPlaymaker 62:ebf6ecf8a6d5 282 int SnakevsBlock::CheckBlock(int block)
AhmedPlaymaker 62:ebf6ecf8a6d5 283 {
AhmedPlaymaker 29:c6358c39a70e 284 int srn;
AhmedPlaymaker 62:ebf6ecf8a6d5 285 if((block>=0)&&(block<=18)) {
AhmedPlaymaker 62:ebf6ecf8a6d5 286 srn = 0;
AhmedPlaymaker 62:ebf6ecf8a6d5 287 }
AhmedPlaymaker 62:ebf6ecf8a6d5 288 if((block>=19)&&(block<=34)) {
AhmedPlaymaker 62:ebf6ecf8a6d5 289 srn = 1;
AhmedPlaymaker 62:ebf6ecf8a6d5 290 }
AhmedPlaymaker 62:ebf6ecf8a6d5 291 if((block>=35)&&(block<=50)) {
AhmedPlaymaker 62:ebf6ecf8a6d5 292 srn = 2;
AhmedPlaymaker 62:ebf6ecf8a6d5 293 }
AhmedPlaymaker 62:ebf6ecf8a6d5 294 if((block>=51)&&(block<=66)) {
AhmedPlaymaker 62:ebf6ecf8a6d5 295 srn = 3;
AhmedPlaymaker 62:ebf6ecf8a6d5 296 }
AhmedPlaymaker 62:ebf6ecf8a6d5 297 if((block>=67)&&(block<=83)) {
AhmedPlaymaker 62:ebf6ecf8a6d5 298 srn = 4;
AhmedPlaymaker 62:ebf6ecf8a6d5 299 }
AhmedPlaymaker 29:c6358c39a70e 300 return srn;
AhmedPlaymaker 29:c6358c39a70e 301 }
AhmedPlaymaker 62:ebf6ecf8a6d5 302
AhmedPlaymaker 65:2872ca289b49 303 void SnakevsBlock::ImplementSnakeBlockCollision(Gamepad &pad)
AhmedPlaymaker 62:ebf6ecf8a6d5 304 {
AhmedPlaymaker 42:973bb6036f81 305 send_block_number = 1;
AhmedPlaymaker 44:cd10d07ea1e5 306 if(blocknum > 0) { // to make sure that snake doesn't decrease in _length if number on the block is less than 1;
AhmedPlaymaker 41:4edac50f010d 307 _l.MinusLength();
AhmedPlaymaker 63:205f0ca48473 308 pad.tone(432.0,0.1);
AhmedPlaymaker 29:c6358c39a70e 309 wait(0.04);
AhmedPlaymaker 12:1e601b176437 310 }
AhmedPlaymaker 44:cd10d07ea1e5 311 blocknum-=1;
AhmedPlaymaker 13:9785f2404045 312 }
AhmedPlaymaker 13:9785f2404045 313
AhmedPlaymaker 38:30e4e6191762 314 void SnakevsBlock::CheckSnakeBlockSidesCollision(Gamepad &pad)
AhmedPlaymaker 42:973bb6036f81 315 {
AhmedPlaymaker 42:973bb6036f81 316 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 42:973bb6036f81 317 //of the blocks' sides and then stop the snake moving in x axis
AhmedPlaymaker 63:205f0ca48473 318
AhmedPlaymaker 63:205f0ca48473 319 SnakevsBlock::MakeDefaultMotionFree(); //this makes the default motion of the snake freemoving before a collision is checked for, to forget the previous collision.
AhmedPlaymaker 63:205f0ca48473 320
AhmedPlaymaker 63:205f0ca48473 321 for(int i=0; i<=9; i++) { //i checks for all possible collisions with the snake respective to it's length.
AhmedPlaymaker 65:2872ca289b49 322 SnakevsBlock::CheckSnakeBlockSidesYCollision(i); //checks if the snake and the block are at the same position in y axis.
AhmedPlaymaker 63:205f0ca48473 323 }
AhmedPlaymaker 63:205f0ca48473 324
AhmedPlaymaker 63:205f0ca48473 325 }
AhmedPlaymaker 63:205f0ca48473 326
AhmedPlaymaker 63:205f0ca48473 327 void SnakevsBlock::MakeDefaultMotionFree() //this makes the default motion of the snake freemoving before a collision is checked for, to forget the previous collision.
AhmedPlaymaker 63:205f0ca48473 328 {
AhmedPlaymaker 42:973bb6036f81 329 for(int i=0; i<=9; i++) {
AhmedPlaymaker 42:973bb6036f81 330 b[i] = 1;
AhmedPlaymaker 42:973bb6036f81 331 }
AhmedPlaymaker 62:ebf6ecf8a6d5 332 }
AhmedPlaymaker 62:ebf6ecf8a6d5 333
AhmedPlaymaker 65:2872ca289b49 334 void SnakevsBlock::CheckSnakeBlockSidesYCollision(int i) //i is the index of the snake beed and checks for all possible collisions with the snake respective to it's length.
AhmedPlaymaker 62:ebf6ecf8a6d5 335 {
AhmedPlaymaker 62:ebf6ecf8a6d5 336 //This code checks if the snake and the block overlap in the Y axis.
AhmedPlaymaker 63:205f0ca48473 337 for(int b_y_combination=0; b_y_combination<=10; b_y_combination++) { //this carries out the next stage if the Y axis collision criterion is met.
AhmedPlaymaker 62:ebf6ecf8a6d5 338 if (
AhmedPlaymaker 62:ebf6ecf8a6d5 339 (snake_pos[i].y == b_pos.y + b_y_combination) ||
AhmedPlaymaker 62:ebf6ecf8a6d5 340 (snake_pos[i].y + 1 == b_pos.y + b_y_combination) ||
AhmedPlaymaker 62:ebf6ecf8a6d5 341 (snake_pos[i].y + 2 == b_pos.y + b_y_combination)) {
AhmedPlaymaker 62:ebf6ecf8a6d5 342
AhmedPlaymaker 65:2872ca289b49 343 SnakevsBlock::CheckSnakeBlockSidesXCollision(i); //checks if the snake and the block are at the same position in x axis.
AhmedPlaymaker 62:ebf6ecf8a6d5 344
AhmedPlaymaker 62:ebf6ecf8a6d5 345 }
AhmedPlaymaker 62:ebf6ecf8a6d5 346 }
AhmedPlaymaker 62:ebf6ecf8a6d5 347 }
AhmedPlaymaker 62:ebf6ecf8a6d5 348
AhmedPlaymaker 65:2872ca289b49 349 void SnakevsBlock::CheckSnakeBlockSidesXCollision(int i) //i is the index of the snake beed and checks for all possible collisions with the snake respective to it's length.
AhmedPlaymaker 62:ebf6ecf8a6d5 350 {
AhmedPlaymaker 63:205f0ca48473 351 for(int b_x_combination=2; b_x_combination<=82; b_x_combination+=16) { //this carries out the next stage if the X axis collision criterion is met.
AhmedPlaymaker 62:ebf6ecf8a6d5 352
AhmedPlaymaker 65:2872ca289b49 353 SnakevsBlock::CheckSnakeBlockSidesEastWestCollision(b_x_combination, i); //checks if the colliding wall is on east side or west side.
AhmedPlaymaker 62:ebf6ecf8a6d5 354 }
AhmedPlaymaker 62:ebf6ecf8a6d5 355 }
AhmedPlaymaker 62:ebf6ecf8a6d5 356
AhmedPlaymaker 65:2872ca289b49 357 void SnakevsBlock::CheckSnakeBlockSidesEastWestCollision(int b_x_combination, int i) //i checks for all possible collisions with the snake respective to it's length.
AhmedPlaymaker 62:ebf6ecf8a6d5 358 {
AhmedPlaymaker 64:540aa1602372 359 SnakevsBlock::makeVirtualLengthMaxTen(); //stops the length at 10 for collision purposes.
AhmedPlaymaker 62:ebf6ecf8a6d5 360
AhmedPlaymaker 62:ebf6ecf8a6d5 361 //For West side of walls
AhmedPlaymaker 62:ebf6ecf8a6d5 362 if(
AhmedPlaymaker 62:ebf6ecf8a6d5 363 ((snake_pos[i].x == b_pos.x + b_x_combination+2) || //W
AhmedPlaymaker 64:540aa1602372 364 (snake_pos[i].x + 1 == b_x_combination+2))&&(_d != E)&&(_virtualLength > i) //W
AhmedPlaymaker 62:ebf6ecf8a6d5 365 ) {
AhmedPlaymaker 65:2872ca289b49 366 SnakevsBlock::ImplementSnakeBlockSidesCollision(i);
AhmedPlaymaker 62:ebf6ecf8a6d5 367 }
AhmedPlaymaker 62:ebf6ecf8a6d5 368 //for East side of walls
AhmedPlaymaker 62:ebf6ecf8a6d5 369 else if (
AhmedPlaymaker 62:ebf6ecf8a6d5 370 ((snake_pos[i].x + 1 == b_x_combination) || //E
AhmedPlaymaker 64:540aa1602372 371 (snake_pos[i].x + 2 == b_x_combination))&&(_d != W)&&(_virtualLength > i) //E
AhmedPlaymaker 62:ebf6ecf8a6d5 372 ) {
AhmedPlaymaker 65:2872ca289b49 373 SnakevsBlock::ImplementSnakeBlockSidesCollision(i);
AhmedPlaymaker 62:ebf6ecf8a6d5 374 }
AhmedPlaymaker 62:ebf6ecf8a6d5 375 }
AhmedPlaymaker 62:ebf6ecf8a6d5 376
AhmedPlaymaker 64:540aa1602372 377 void SnakevsBlock::makeVirtualLengthMaxTen()
AhmedPlaymaker 64:540aa1602372 378 {
AhmedPlaymaker 64:540aa1602372 379 //this makes the virtual length -> 10 for the side collision implementation because if the length is fifteen and the last beed collides, it still is the 10th beed
AhmedPlaymaker 64:540aa1602372 380 //on screen.
AhmedPlaymaker 64:540aa1602372 381 _virtualLength = _length;
AhmedPlaymaker 64:540aa1602372 382 if(_length>=10) {
AhmedPlaymaker 64:540aa1602372 383 _virtualLength = 10; //to stop the snake length virtually at 10 when it goes past it.
AhmedPlaymaker 64:540aa1602372 384 }
AhmedPlaymaker 64:540aa1602372 385 }
AhmedPlaymaker 64:540aa1602372 386
AhmedPlaymaker 65:2872ca289b49 387 void SnakevsBlock::ImplementSnakeBlockSidesCollision(int i) //i is the index of the snake beed and checks for all possible collisions with the snake respective to it's length.
AhmedPlaymaker 62:ebf6ecf8a6d5 388 {
AhmedPlaymaker 62:ebf6ecf8a6d5 389 //code makes sure that the colliding part doesn't move in x axis.
AhmedPlaymaker 62:ebf6ecf8a6d5 390 for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) {
AhmedPlaymaker 64:540aa1602372 391 if(_virtualLength == snake_beed_num + i) {
AhmedPlaymaker 62:ebf6ecf8a6d5 392 b[snake_beed_num - 1] = 0;
AhmedPlaymaker 24:1c118b071430 393 }
AhmedPlaymaker 15:f4d069da093d 394 }
AhmedPlaymaker 22:ee698f66146f 395 }