Snake vs Block Game to be run upon K64F.

Dependencies:   mbed

Committer:
AhmedPlaymaker
Date:
Sat May 04 22:09:59 2019 +0000
Revision:
71:4bd2b27693f3
Parent:
70:7caab8069b9b
Child:
74:7b6568bc16d5
Further modulated the snake class, also need to fix a problem with the size of array.

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