Ahmed Adamjee
/
SnakeVSBlock
Snake vs Block Game to be run upon K64F.
GameEngine/SnakevsBlock/SnakevsBlock.cpp@59:c65a2e933c47, 2019-04-29 (annotated)
- Committer:
- AhmedPlaymaker
- Date:
- Mon Apr 29 12:09:31 2019 +0000
- Revision:
- 59:c65a2e933c47
- Parent:
- 58:affb42c56cf8
- Child:
- 60:d3a9e0e4a0de
Changed Winning criteria and level progression in general, also fixed an error with motion control in menu and joystick misbehavior problem, next is tutorials.
Who changed what in which revision?
User | Revision | Line number | New 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 | 41:4edac50f010d | 15 | //The level initialisation and all the other initial information passing will be done here |
AhmedPlaymaker | 19:05cc9f801468 | 16 | level = 1; |
AhmedPlaymaker | 59:c65a2e933c47 | 17 | _maxLength = 10; // this makes us go to the next level if if maxLength is achieved; |
AhmedPlaymaker | 41:4edac50f010d | 18 | garbage = 0; //this is to allow the user to change the position of reference for motion control by saving the absolute angle. |
AhmedPlaymaker | 41:4edac50f010d | 19 | foodbuff = 0; //this makes the food fall at diffrent times when a particular level starts. |
AhmedPlaymaker | 56:142e9fdb77a8 | 20 | 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 | 21 | blockgap = 300; //this is the number of itterations the block will reccur after in the first level. |
AhmedPlaymaker | 49:441c32f6603e | 22 | for(int i=0; i<=14; i++) {b[i] = 1;} //makes all the snake beads move by default. |
AhmedPlaymaker | 49:441c32f6603e | 23 | SnakevsBlock::object_initialisations(); |
AhmedPlaymaker | 7:48ba87cd79b5 | 24 | } |
AhmedPlaymaker | 7:48ba87cd79b5 | 25 | |
AhmedPlaymaker | 41:4edac50f010d | 26 | void SnakevsBlock::reset() |
AhmedPlaymaker | 41:4edac50f010d | 27 | { |
AhmedPlaymaker | 41:4edac50f010d | 28 | //This prepares the game for the next level by reseting certain variables. |
AhmedPlaymaker | 41:4edac50f010d | 29 | foodbuff = 0; |
AhmedPlaymaker | 59:c65a2e933c47 | 30 | if(blockgap >= 50) {blockgap -= 10;} //to make progressive levels harder by making the blocks drop more frequently. |
AhmedPlaymaker | 49:441c32f6603e | 31 | SnakevsBlock::object_initialisations(); |
AhmedPlaymaker | 49:441c32f6603e | 32 | } |
AhmedPlaymaker | 49:441c32f6603e | 33 | |
AhmedPlaymaker | 49:441c32f6603e | 34 | void SnakevsBlock::object_initialisations() |
AhmedPlaymaker | 49:441c32f6603e | 35 | { |
AhmedPlaymaker | 49:441c32f6603e | 36 | _l.init(); //length calc object initialisation. |
AhmedPlaymaker | 49:441c32f6603e | 37 | _s.init(); //snake object initialisation. |
AhmedPlaymaker | 49:441c32f6603e | 38 | _f.init(); //food 1 object initialisation. |
AhmedPlaymaker | 49:441c32f6603e | 39 | _ff.init(); //food 2 object initialisation. |
AhmedPlaymaker | 49:441c32f6603e | 40 | _fff.init(); //food 3 object initialisation. |
AhmedPlaymaker | 49:441c32f6603e | 41 | _b.init(); //block object initialisation. |
AhmedPlaymaker | 41:4edac50f010d | 42 | } |
AhmedPlaymaker | 7:48ba87cd79b5 | 43 | |
AhmedPlaymaker | 39:210ac915e0a0 | 44 | void SnakevsBlock::read_input(Gamepad &pad, FXOS8700CQ &device, int g_mode) |
AhmedPlaymaker | 7:48ba87cd79b5 | 45 | { |
AhmedPlaymaker | 38:30e4e6191762 | 46 | device.get_values(); |
AhmedPlaymaker | 38:30e4e6191762 | 47 | angle = -device.get_roll_angle(); |
AhmedPlaymaker | 38:30e4e6191762 | 48 | //if button A is pressed then reset that particular position to center |
AhmedPlaymaker | 38:30e4e6191762 | 49 | if (pad.check_event(Gamepad::A_PRESSED) == true) { |
AhmedPlaymaker | 38:30e4e6191762 | 50 | garbage = angle; |
AhmedPlaymaker | 38:30e4e6191762 | 51 | } |
AhmedPlaymaker | 38:30e4e6191762 | 52 | device.get_values(); |
AhmedPlaymaker | 56:142e9fdb77a8 | 53 | switch (g_mode) { |
AhmedPlaymaker | 56:142e9fdb77a8 | 54 | case 1: |
AhmedPlaymaker | 38:30e4e6191762 | 55 | _d = pad.get_direction(); //Obtains Direction pushed towards on Joystick. |
AhmedPlaymaker | 38:30e4e6191762 | 56 | _mag = pad.get_mag(); //Obtains Magnitude of Joystick. |
AhmedPlaymaker | 56:142e9fdb77a8 | 57 | break; |
AhmedPlaymaker | 56:142e9fdb77a8 | 58 | case 2: |
AhmedPlaymaker | 56:142e9fdb77a8 | 59 | angle = -device.get_roll_angle() - garbage; |
AhmedPlaymaker | 56:142e9fdb77a8 | 60 | if (angle >= 6) { |
AhmedPlaymaker | 38:30e4e6191762 | 61 | _d = E; |
AhmedPlaymaker | 58:affb42c56cf8 | 62 | for(int led = 4; led <= 6; led++) { pad.led(led,1); } |
AhmedPlaymaker | 38:30e4e6191762 | 63 | } |
AhmedPlaymaker | 56:142e9fdb77a8 | 64 | else if (angle <= -6) { |
AhmedPlaymaker | 38:30e4e6191762 | 65 | _d = W; |
AhmedPlaymaker | 58:affb42c56cf8 | 66 | for(int led = 1; led <= 3; led++) { pad.led(led,1); } |
AhmedPlaymaker | 38:30e4e6191762 | 67 | } |
AhmedPlaymaker | 38:30e4e6191762 | 68 | else { |
AhmedPlaymaker | 38:30e4e6191762 | 69 | _d = CENTRE; |
AhmedPlaymaker | 58:affb42c56cf8 | 70 | for(int led = 1; led <= 6; led++) { pad.led(led,0); } |
AhmedPlaymaker | 38:30e4e6191762 | 71 | } |
AhmedPlaymaker | 56:142e9fdb77a8 | 72 | break; |
AhmedPlaymaker | 38:30e4e6191762 | 73 | } |
AhmedPlaymaker | 38:30e4e6191762 | 74 | //printf("%d",gm); |
AhmedPlaymaker | 38:30e4e6191762 | 75 | //printf("%f",angle); |
AhmedPlaymaker | 38:30e4e6191762 | 76 | //printf("%f",device.get_roll_angle()); |
AhmedPlaymaker | 7:48ba87cd79b5 | 77 | } |
AhmedPlaymaker | 7:48ba87cd79b5 | 78 | |
AhmedPlaymaker | 49:441c32f6603e | 79 | void SnakevsBlock::draw(N5110 &lcd, Gamepad &pad) { |
AhmedPlaymaker | 55:df0825049171 | 80 | _length = _l._getLength(); //saves the snake length into a private variable. |
AhmedPlaymaker | 53:527cf297b088 | 81 | _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 | 41:4edac50f010d | 82 | if(foodbuff >= 0) { |
AhmedPlaymaker | 56:142e9fdb77a8 | 83 | _f.draw(lcd); //Draws the first food. |
AhmedPlaymaker | 39:210ac915e0a0 | 84 | } |
AhmedPlaymaker | 41:4edac50f010d | 85 | if(foodbuff >= 50) { |
AhmedPlaymaker | 56:142e9fdb77a8 | 86 | _ff.draw(lcd); //Draws the second food. |
AhmedPlaymaker | 9:d1d79d4ee673 | 87 | } |
AhmedPlaymaker | 41:4edac50f010d | 88 | if(foodbuff >= 80) { |
AhmedPlaymaker | 56:142e9fdb77a8 | 89 | _fff.draw(lcd); //Draws the third food. |
AhmedPlaymaker | 39:210ac915e0a0 | 90 | } |
AhmedPlaymaker | 39:210ac915e0a0 | 91 | foodbuff +=1; |
AhmedPlaymaker | 41:4edac50f010d | 92 | if(foodbuff >= 8) { |
AhmedPlaymaker | 48:d774bb162c61 | 93 | _b.draw(lcd, _length); |
AhmedPlaymaker | 19:05cc9f801468 | 94 | } |
AhmedPlaymaker | 7:48ba87cd79b5 | 95 | //Code to print length on game screen. |
AhmedPlaymaker | 41:4edac50f010d | 96 | _l.print_length_on_screen(lcd); |
AhmedPlaymaker | 41:4edac50f010d | 97 | } |
AhmedPlaymaker | 39:210ac915e0a0 | 98 | |
AhmedPlaymaker | 49:441c32f6603e | 99 | int SnakevsBlock::update(N5110 &lcd, Gamepad &pad, SDFileSystem &sd) //Updates objects on screen. |
AhmedPlaymaker | 39:210ac915e0a0 | 100 | { |
AhmedPlaymaker | 42:973bb6036f81 | 101 | send_block_number = 0; //this is for the game to decide wether to remember the number on the block for the current itteration. |
AhmedPlaymaker | 42:973bb6036f81 | 102 | //we dont need to remember if it has already gone past the screen. |
AhmedPlaymaker | 43:233f93860d08 | 103 | CheckSnakeFoodCollision(pad); //Function checks for when the snake collides with it's food. |
AhmedPlaymaker | 18:b391caa5754c | 104 | CheckSnakeBlockCollision(pad); //Function checks for when the snake collides with any of the blocks. |
AhmedPlaymaker | 38:30e4e6191762 | 105 | CheckSnakeBlockSidesCollision(pad); //Function checks for when the snake collides with any of the blocks' sides. |
AhmedPlaymaker | 41:4edac50f010d | 106 | _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 | 107 | _f.update(); |
AhmedPlaymaker | 9:d1d79d4ee673 | 108 | _ff.update(); |
AhmedPlaymaker | 9:d1d79d4ee673 | 109 | _fff.update(); |
AhmedPlaymaker | 48:d774bb162c61 | 110 | _b.update(blocknum, blockgap, srn, send_block_number); |
AhmedPlaymaker | 49:441c32f6603e | 111 | //_statset.read(sd); //to read the currently stored value. |
AhmedPlaymaker | 49:441c32f6603e | 112 | if(_length == 0) { |
AhmedPlaymaker | 49:441c32f6603e | 113 | _wl.GameOver(lcd,pad); |
AhmedPlaymaker | 49:441c32f6603e | 114 | } |
AhmedPlaymaker | 49:441c32f6603e | 115 | if((pad.check_event(Gamepad::BACK_PRESSED))||(_length == 0)){ //Waits for Back button to be pressed. |
AhmedPlaymaker | 25:e827f1a8fadc | 116 | back = 1; |
AhmedPlaymaker | 25:e827f1a8fadc | 117 | SnakevsBlock::init(); |
AhmedPlaymaker | 25:e827f1a8fadc | 118 | } |
AhmedPlaymaker | 25:e827f1a8fadc | 119 | else { |
AhmedPlaymaker | 25:e827f1a8fadc | 120 | back = 0; |
AhmedPlaymaker | 25:e827f1a8fadc | 121 | } |
AhmedPlaymaker | 52:c2faa96cf293 | 122 | //printf("%d\n",_length); |
AhmedPlaymaker | 59:c65a2e933c47 | 123 | if(_length >= _maxLength) { |
AhmedPlaymaker | 59:c65a2e933c47 | 124 | _maxLength++; |
AhmedPlaymaker | 50:3cf9a94a264e | 125 | level = _wl.LevelComplete(lcd, pad, level); |
AhmedPlaymaker | 50:3cf9a94a264e | 126 | _Setstats.write(level, sd); |
AhmedPlaymaker | 50:3cf9a94a264e | 127 | SnakevsBlock::reset(); |
AhmedPlaymaker | 50:3cf9a94a264e | 128 | } |
AhmedPlaymaker | 25:e827f1a8fadc | 129 | return back; |
AhmedPlaymaker | 7:48ba87cd79b5 | 130 | } |
AhmedPlaymaker | 7:48ba87cd79b5 | 131 | |
AhmedPlaymaker | 7:48ba87cd79b5 | 132 | void SnakevsBlock::get_pos() |
AhmedPlaymaker | 7:48ba87cd79b5 | 133 | { |
AhmedPlaymaker | 7:48ba87cd79b5 | 134 | //printf("player pos = %f %f \n", player_pos.x, player_pos.y); //top left of player sprite |
AhmedPlaymaker | 7:48ba87cd79b5 | 135 | // 81.000000 0.000000 top right |
AhmedPlaymaker | 7:48ba87cd79b5 | 136 | // 0.000000 0.000000 is top left |
AhmedPlaymaker | 7:48ba87cd79b5 | 137 | // 81.000000 45.000000 bottom right |
AhmedPlaymaker | 43:233f93860d08 | 138 | 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 | 139 | 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 | 140 | //printf("snakexy in GAME = %d %d \n", snakex, snakey); |
AhmedPlaymaker | 41:4edac50f010d | 141 | //Obtains all required coordinates. |
AhmedPlaymaker | 41:4edac50f010d | 142 | food_pos[0] = _f.get_pos(); |
AhmedPlaymaker | 41:4edac50f010d | 143 | food_pos[1] = _ff.get_pos(); |
AhmedPlaymaker | 41:4edac50f010d | 144 | food_pos[2] = _fff.get_pos(); |
AhmedPlaymaker | 41:4edac50f010d | 145 | //obtains origin cordinates of block. |
AhmedPlaymaker | 41:4edac50f010d | 146 | b_pos = _b.get_pos(); |
AhmedPlaymaker | 41:4edac50f010d | 147 | //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 | 148 | snake_pos[0] = _s.get_pos(); //gets the position of the top beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 149 | snake_pos[1] = _s.get_pos_before1(); //gets the position of the second beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 150 | snake_pos[2] = _s.get_pos_before2(); //gets the position of the third beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 151 | snake_pos[3] = _s.get_pos_before3(); //gets the position of the fourth beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 152 | snake_pos[4] = _s.get_pos_before4(); //gets the position of the fifth beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 153 | snake_pos[5] = _s.get_pos_before5(); //gets the position of the sixth beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 154 | snake_pos[6] = _s.get_pos_before6(); //gets the position of the seventh beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 155 | snake_pos[7] = _s.get_pos_before7(); //gets the position of the eight beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 156 | snake_pos[8] = _s.get_pos_before8(); //gets the position of the ninth beed and saves in array. |
AhmedPlaymaker | 41:4edac50f010d | 157 | snake_pos[9] = _s.get_pos_before9(); //gets the position of the last beed and saves in array. |
AhmedPlaymaker | 7:48ba87cd79b5 | 158 | } |
AhmedPlaymaker | 7:48ba87cd79b5 | 159 | |
AhmedPlaymaker | 9:d1d79d4ee673 | 160 | |
AhmedPlaymaker | 27:3b4775a0d0bb | 161 | void SnakevsBlock::CheckSnakeFoodCollision(Gamepad &pad) { |
AhmedPlaymaker | 32:3a3bdeffdf62 | 162 | //If statements check if the snake sprite has collided with any |
AhmedPlaymaker | 32:3a3bdeffdf62 | 163 | //of the three food sprites, if so then the food location is reset and |
AhmedPlaymaker | 32:3a3bdeffdf62 | 164 | //length of the snake is increased using the length variable. |
AhmedPlaymaker | 29:c6358c39a70e | 165 | for(int y=0; y<=2; y++) { //this loop automatically detects each combination of collision in the y postion |
AhmedPlaymaker | 29:c6358c39a70e | 166 | for(int x=0; x<=2; x++) { //this loop automatically detects each combination of collision in the x postion |
AhmedPlaymaker | 29:c6358c39a70e | 167 | for(int food_sr=0; food_sr<=2; food_sr++) { //this loop automatically detects which food we are interacting with. |
AhmedPlaymaker | 29:c6358c39a70e | 168 | if ( |
AhmedPlaymaker | 41:4edac50f010d | 169 | ((snakey + y == food_pos[food_sr].y) || |
AhmedPlaymaker | 41:4edac50f010d | 170 | (snakey + y == food_pos[food_sr].y + 1) || |
AhmedPlaymaker | 41:4edac50f010d | 171 | (snakey + y == food_pos[food_sr].y + 2)) && |
AhmedPlaymaker | 41:4edac50f010d | 172 | ((snakex + x == food_pos[food_sr].x) || |
AhmedPlaymaker | 41:4edac50f010d | 173 | (snakex + x == food_pos[food_sr].x + 1) || |
AhmedPlaymaker | 41:4edac50f010d | 174 | (snakex + x == food_pos[food_sr].x + 2)) |
AhmedPlaymaker | 29:c6358c39a70e | 175 | ) { |
AhmedPlaymaker | 29:c6358c39a70e | 176 | //printf("snake feast working \n"); |
AhmedPlaymaker | 29:c6358c39a70e | 177 | //audio feedback |
AhmedPlaymaker | 46:dc7dccae9f9e | 178 | pad.tone(786.0,0.1); |
AhmedPlaymaker | 38:30e4e6191762 | 179 | food_pos[food_sr].x = (rand() % 82); //this makes the food pop up at a random, unspecified location in the x axis. |
AhmedPlaymaker | 38:30e4e6191762 | 180 | food_pos[food_sr].y = -3; |
AhmedPlaymaker | 41:4edac50f010d | 181 | _l.PlusLength(); |
AhmedPlaymaker | 29:c6358c39a70e | 182 | } |
AhmedPlaymaker | 25:e827f1a8fadc | 183 | } |
AhmedPlaymaker | 25:e827f1a8fadc | 184 | } |
AhmedPlaymaker | 9:d1d79d4ee673 | 185 | } |
AhmedPlaymaker | 29:c6358c39a70e | 186 | _f.set_pos(food_pos[0]); |
AhmedPlaymaker | 29:c6358c39a70e | 187 | _ff.set_pos(food_pos[1]); |
AhmedPlaymaker | 29:c6358c39a70e | 188 | _fff.set_pos(food_pos[2]); |
AhmedPlaymaker | 29:c6358c39a70e | 189 | } |
AhmedPlaymaker | 12:1e601b176437 | 190 | |
AhmedPlaymaker | 39:210ac915e0a0 | 191 | void SnakevsBlock::CheckSnakeBlockCollision(Gamepad &pad) { |
AhmedPlaymaker | 41:4edac50f010d | 192 | //Obtains the numbers inside the block. |
AhmedPlaymaker | 39:210ac915e0a0 | 193 | b_number = _b.get_number(); |
AhmedPlaymaker | 39:210ac915e0a0 | 194 | //If statements check if the snake sprite has collided with any |
AhmedPlaymaker | 39:210ac915e0a0 | 195 | //of the blocks which are a maximum of 5, if so then the snake length reduces and the block number reduces |
AhmedPlaymaker | 39:210ac915e0a0 | 196 | //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 | 197 | 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 | 198 | if (((snakey == b_pos.y + 11)|| |
AhmedPlaymaker | 54:20abd16c7d74 | 199 | (snakey == b_pos.y + 10)|| |
AhmedPlaymaker | 54:20abd16c7d74 | 200 | (snakey == b_pos.y + 9)|| |
AhmedPlaymaker | 54:20abd16c7d74 | 201 | (snakey == b_pos.y + 8))&& |
AhmedPlaymaker | 54:20abd16c7d74 | 202 | (snakex + 1 == b_pos.x + block)) { |
AhmedPlaymaker | 43:233f93860d08 | 203 | //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 | 204 | //printf("snake collision working \n"); |
AhmedPlaymaker | 39:210ac915e0a0 | 205 | //audio feedback |
AhmedPlaymaker | 39:210ac915e0a0 | 206 | if(blocknum > 0) {b_pos.y = 0;} //change this to speed y = 0 when length = 10. |
AhmedPlaymaker | 39:210ac915e0a0 | 207 | srn = CheckBlock(block); //this tells us which of the 5 blocks we are colliding with |
AhmedPlaymaker | 39:210ac915e0a0 | 208 | blocknum = b_number[srn]; |
AhmedPlaymaker | 41:4edac50f010d | 209 | 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 | 39:210ac915e0a0 | 210 | velocity = 0; |
AhmedPlaymaker | 33:249cf423fb18 | 211 | } |
AhmedPlaymaker | 39:210ac915e0a0 | 212 | else { |
AhmedPlaymaker | 39:210ac915e0a0 | 213 | velocity = 1; |
AhmedPlaymaker | 39:210ac915e0a0 | 214 | } |
AhmedPlaymaker | 47:b448ffd073e7 | 215 | ImplementCollision(pad); |
AhmedPlaymaker | 39:210ac915e0a0 | 216 | SnakevsBlock::_set_velocity(); |
AhmedPlaymaker | 12:1e601b176437 | 217 | } |
AhmedPlaymaker | 39:210ac915e0a0 | 218 | } |
AhmedPlaymaker | 39:210ac915e0a0 | 219 | } |
AhmedPlaymaker | 39:210ac915e0a0 | 220 | |
AhmedPlaymaker | 39:210ac915e0a0 | 221 | void SnakevsBlock::_set_velocity() { |
AhmedPlaymaker | 39:210ac915e0a0 | 222 | _b.velocity.y = velocity; |
AhmedPlaymaker | 39:210ac915e0a0 | 223 | _f.velocity.y = velocity; |
AhmedPlaymaker | 39:210ac915e0a0 | 224 | _ff.velocity.y = velocity; |
AhmedPlaymaker | 39:210ac915e0a0 | 225 | _fff.velocity.y = velocity; |
AhmedPlaymaker | 27:3b4775a0d0bb | 226 | } |
AhmedPlaymaker | 29:c6358c39a70e | 227 | |
AhmedPlaymaker | 29:c6358c39a70e | 228 | int SnakevsBlock::CheckBlock(int block) { |
AhmedPlaymaker | 29:c6358c39a70e | 229 | int srn; |
AhmedPlaymaker | 29:c6358c39a70e | 230 | if((block>=0)&&(block<=18)) {srn = 0;} |
AhmedPlaymaker | 29:c6358c39a70e | 231 | if((block>=19)&&(block<=34)) {srn = 1;} |
AhmedPlaymaker | 29:c6358c39a70e | 232 | if((block>=35)&&(block<=50)) {srn = 2;} |
AhmedPlaymaker | 29:c6358c39a70e | 233 | if((block>=51)&&(block<=66)) {srn = 3;} |
AhmedPlaymaker | 29:c6358c39a70e | 234 | if((block>=67)&&(block<=83)) {srn = 4;} |
AhmedPlaymaker | 29:c6358c39a70e | 235 | return srn; |
AhmedPlaymaker | 29:c6358c39a70e | 236 | } |
AhmedPlaymaker | 27:3b4775a0d0bb | 237 | |
AhmedPlaymaker | 27:3b4775a0d0bb | 238 | void SnakevsBlock::ImplementCollision(Gamepad &pad) { |
AhmedPlaymaker | 42:973bb6036f81 | 239 | send_block_number = 1; |
AhmedPlaymaker | 44:cd10d07ea1e5 | 240 | 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 | 241 | _l.MinusLength(); |
AhmedPlaymaker | 27:3b4775a0d0bb | 242 | pad.tone(1000.0,0.1); |
AhmedPlaymaker | 29:c6358c39a70e | 243 | wait(0.04); |
AhmedPlaymaker | 12:1e601b176437 | 244 | } |
AhmedPlaymaker | 44:cd10d07ea1e5 | 245 | blocknum-=1; |
AhmedPlaymaker | 13:9785f2404045 | 246 | } |
AhmedPlaymaker | 13:9785f2404045 | 247 | |
AhmedPlaymaker | 38:30e4e6191762 | 248 | void SnakevsBlock::CheckSnakeBlockSidesCollision(Gamepad &pad) |
AhmedPlaymaker | 42:973bb6036f81 | 249 | { |
AhmedPlaymaker | 42:973bb6036f81 | 250 | //If statements check if the snake sprite has collided with any |
AhmedPlaymaker | 42:973bb6036f81 | 251 | //of the blocks' sides and then stop the snake moving in x axis |
AhmedPlaymaker | 50:3cf9a94a264e | 252 | int length = _length; |
AhmedPlaymaker | 50:3cf9a94a264e | 253 | if(_length>=10) {length = 10;} //to stop the snake length virtually at 10 when it goes past it. |
AhmedPlaymaker | 37:ee47699915b8 | 254 | |
AhmedPlaymaker | 42:973bb6036f81 | 255 | for(int i=0; i<=9; i++) { |
AhmedPlaymaker | 42:973bb6036f81 | 256 | b[i] = 1; |
AhmedPlaymaker | 42:973bb6036f81 | 257 | } |
AhmedPlaymaker | 37:ee47699915b8 | 258 | for(int i=0; i<=9; i++) { //i checks for all possible collisions with the snake respective to it's length. |
AhmedPlaymaker | 36:dfdd619874ae | 259 | for(int b_y_combination=0; b_y_combination<=10; b_y_combination++) { |
AhmedPlaymaker | 26:3495f7b0ede7 | 260 | if ( |
AhmedPlaymaker | 36:dfdd619874ae | 261 | (snake_pos[i].y == b_pos.y + b_y_combination) || |
AhmedPlaymaker | 36:dfdd619874ae | 262 | (snake_pos[i].y + 1 == b_pos.y + b_y_combination) || |
AhmedPlaymaker | 36:dfdd619874ae | 263 | (snake_pos[i].y + 2 == b_pos.y + b_y_combination)) { |
AhmedPlaymaker | 36:dfdd619874ae | 264 | for(int b_x_combination=2; b_x_combination<=82; b_x_combination+=16) { |
AhmedPlaymaker | 36:dfdd619874ae | 265 | //For West side of walls |
AhmedPlaymaker | 36:dfdd619874ae | 266 | if( |
AhmedPlaymaker | 36:dfdd619874ae | 267 | ((snake_pos[i].x == b_pos.x + b_x_combination+2) || //W |
AhmedPlaymaker | 50:3cf9a94a264e | 268 | (snake_pos[i].x + 1 == b_x_combination+2))&&(_d != E)&&(length > i) //W |
AhmedPlaymaker | 36:dfdd619874ae | 269 | ) { |
AhmedPlaymaker | 36:dfdd619874ae | 270 | //code makes sure that the colliding part doesn't move in x axis. |
AhmedPlaymaker | 37:ee47699915b8 | 271 | for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) { |
AhmedPlaymaker | 50:3cf9a94a264e | 272 | if(length == snake_beed_num + i) { |
AhmedPlaymaker | 36:dfdd619874ae | 273 | b[snake_beed_num - 1] = 0; |
AhmedPlaymaker | 36:dfdd619874ae | 274 | } |
AhmedPlaymaker | 26:3495f7b0ede7 | 275 | } |
AhmedPlaymaker | 25:e827f1a8fadc | 276 | } |
AhmedPlaymaker | 36:dfdd619874ae | 277 | //for East side of walls |
AhmedPlaymaker | 36:dfdd619874ae | 278 | else if ( |
AhmedPlaymaker | 36:dfdd619874ae | 279 | ((snake_pos[i].x + 1 == b_x_combination) || //E |
AhmedPlaymaker | 50:3cf9a94a264e | 280 | (snake_pos[i].x + 2 == b_x_combination))&&(_d != W)&&(length > i) //E |
AhmedPlaymaker | 36:dfdd619874ae | 281 | ) { |
AhmedPlaymaker | 36:dfdd619874ae | 282 | //code makes sure that the colliding part doesn't move in x axis. |
AhmedPlaymaker | 37:ee47699915b8 | 283 | for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) { |
AhmedPlaymaker | 50:3cf9a94a264e | 284 | if(length == snake_beed_num + i) { |
AhmedPlaymaker | 36:dfdd619874ae | 285 | b[snake_beed_num - 1] = 0; |
AhmedPlaymaker | 36:dfdd619874ae | 286 | } |
AhmedPlaymaker | 32:3a3bdeffdf62 | 287 | } |
AhmedPlaymaker | 32:3a3bdeffdf62 | 288 | } |
AhmedPlaymaker | 26:3495f7b0ede7 | 289 | } |
AhmedPlaymaker | 25:e827f1a8fadc | 290 | } |
AhmedPlaymaker | 24:1c118b071430 | 291 | } |
AhmedPlaymaker | 15:f4d069da093d | 292 | } |
AhmedPlaymaker | 22:ee698f66146f | 293 | } |