Snake vs Block Game to be run upon K64F.

Dependencies:   mbed

Committer:
AhmedPlaymaker
Date:
Sun May 05 16:02:24 2019 +0000
Revision:
77:5c6bd659c32d
Parent:
76:7fa91122907f
Child:
79:35cb65c52d25
now the default motion of the snake is called directly from update, and this doesn't make it dependent on other functions

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