Ahmed Adamjee
/
SnakeVSBlock
Snake vs Block Game to be run upon K64F.
Diff: GameEngine/SnakevsBlock/SnakevsBlock.cpp
- Revision:
- 62:ebf6ecf8a6d5
- Parent:
- 61:f3c402bc2ad0
- Child:
- 63:205f0ca48473
diff -r f3c402bc2ad0 -r ebf6ecf8a6d5 GameEngine/SnakevsBlock/SnakevsBlock.cpp --- a/GameEngine/SnakevsBlock/SnakevsBlock.cpp Tue Apr 30 08:32:30 2019 +0000 +++ b/GameEngine/SnakevsBlock/SnakevsBlock.cpp Tue Apr 30 14:53:38 2019 +0000 @@ -19,7 +19,9 @@ foodbuff = 0; //this makes the food fall at diffrent times when a particular level starts. 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). blockgap = 300; //this is the number of itterations the block will reccur after in the first level. - for(int i=0; i<=14; i++) {b[i] = 1;} //makes all the snake beads move by default. + for(int i=0; i<=14; i++) { + b[i] = 1; //makes all the snake beads move by default. + } SnakevsBlock::object_initialisations(); } @@ -27,7 +29,9 @@ { //This prepares the game for the next level by reseting certain variables. foodbuff = 0; - if(blockgap >= 50) {blockgap -= 10;} //to make progressive levels harder by making the blocks drop more frequently. + if(blockgap >= 50) { + blockgap -= 10; //to make progressive levels harder by making the blocks drop more frequently. + } /* //to clear all the memory buffer of the game object positions from the previous level. for(int i = 0; i <=2 ; i++) { @@ -60,32 +64,37 @@ } device.get_values(); switch (g_mode) { - case 1: - _d = pad.get_direction(); //Obtains Direction pushed towards on Joystick. - _mag = pad.get_mag(); //Obtains Magnitude of Joystick. REMOVE THIS LATER. - break; - case 2: - angle = -device.get_roll_angle() - garbage; - if (angle >= 6) { - _d = E; - for(int led = 4; led <= 6; led++) { pad.led(led,1); } - } - else if (angle <= -6) { - _d = W; - for(int led = 1; led <= 3; led++) { pad.led(led,1); } - } - else { - _d = CENTRE; - for(int led = 1; led <= 6; led++) { pad.led(led,0); } - } - break; + case 1: + _d = pad.get_direction(); //Obtains Direction pushed towards on Joystick. + _mag = pad.get_mag(); //Obtains Magnitude of Joystick. REMOVE THIS LATER. + break; + case 2: + angle = -device.get_roll_angle() - garbage; + if (angle >= 6) { + _d = E; + for(int led = 4; led <= 6; led++) { + pad.led(led,1); + } + } else if (angle <= -6) { + _d = W; + for(int led = 1; led <= 3; led++) { + pad.led(led,1); + } + } else { + _d = CENTRE; + for(int led = 1; led <= 6; led++) { + pad.led(led,0); + } + } + break; } //printf("%d",gm); //printf("%f",angle); //printf("%f",device.get_roll_angle()); } -void SnakevsBlock::draw(N5110 &lcd, Gamepad &pad) { +void SnakevsBlock::draw(N5110 &lcd, Gamepad &pad) +{ _length = _l._getLength(); //saves the snake length into a private variable. _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 if(foodbuff >= 0) { @@ -103,29 +112,28 @@ } //Code to print length on game screen. _l.print_length_on_screen(lcd); -} +} int SnakevsBlock::update(N5110 &lcd, Gamepad &pad, SDFileSystem &sd) //Updates objects on screen. { send_block_number = 0; //this is for the game to decide wether to remember the number on the block for the current itteration. - //we dont need to remember if it has already gone past the screen. + //we dont need to remember if it has already gone past the screen. CheckSnakeFoodCollision(pad); //Function checks for when the snake collides with it's food. CheckSnakeBlockCollision(pad); //Function checks for when the snake collides with any of the blocks. CheckSnakeBlockSidesCollision(pad); //Function checks for when the snake collides with any of the blocks' sides. _s.update(_d, b); //_d is the direction of joystick and b controls the motion of a section of the snake relative to obstruction _f.update(); _ff.update(); - _fff.update(); + _fff.update(); _b.update(blocknum, blockgap, srn, send_block_number); //_statset.read(sd); //to read the currently stored value. if(_length == 0) { _wl.GameOver(lcd,pad); } - if((pad.check_event(Gamepad::BACK_PRESSED))||(_length == 0)){ //Waits for Back button to be pressed. + if((pad.check_event(Gamepad::BACK_PRESSED))||(_length == 0)) { //Waits for Back button to be pressed. back = 1; SnakevsBlock::init(); - } - else { + } else { back = 0; } //printf("%d\n",_length); @@ -144,7 +152,7 @@ // 81.000000 0.000000 top right // 0.000000 0.000000 is top left // 81.000000 45.000000 bottom right - 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. + 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. 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. //printf("snakexy in GAME = %d %d \n", snakex, snakey); //Obtains all required coordinates. @@ -164,10 +172,11 @@ snake_pos[7] = _s.get_pos_before7(); //gets the position of the eight beed and saves in array. snake_pos[8] = _s.get_pos_before8(); //gets the position of the ninth beed and saves in array. snake_pos[9] = _s.get_pos_before9(); //gets the position of the last beed and saves in array. -} - +} + -void SnakevsBlock::CheckSnakeFoodCollision(Gamepad &pad) { +void SnakevsBlock::CheckSnakeFoodCollision(Gamepad &pad) +{ //If statements check if the snake sprite has collided with any //of the three food sprites, if so then the food location is reset and //length of the snake is increased using the length variable. @@ -176,11 +185,11 @@ for(int food_sr=0; food_sr<=2; food_sr++) { //this loop automatically detects which food we are interacting with. if ( ((snakey + y == food_pos[food_sr].y) || - (snakey + y == food_pos[food_sr].y + 1) || - (snakey + y == food_pos[food_sr].y + 2)) && + (snakey + y == food_pos[food_sr].y + 1) || + (snakey + y == food_pos[food_sr].y + 2)) && ((snakex + x == food_pos[food_sr].x) || - (snakex + x == food_pos[food_sr].x + 1) || - (snakex + x == food_pos[food_sr].x + 2)) + (snakex + x == food_pos[food_sr].x + 1) || + (snakex + x == food_pos[food_sr].x + 2)) ) { //printf("snake feast working \n"); //audio feedback @@ -196,8 +205,9 @@ _ff.set_pos(food_pos[1]); _fff.set_pos(food_pos[2]); } - -void SnakevsBlock::CheckSnakeBlockCollision(Gamepad &pad) { + +void SnakevsBlock::CheckSnakeBlockCollision(Gamepad &pad) +{ //Obtains the numbers inside the block. b_number = _b.get_number(); //If statements check if the snake sprite has collided with any @@ -205,20 +215,21 @@ //the block has to move slower and come down after every 2/3 iterations(dependent on the snake size.(think about this) for(int block=0; block<=83; block+=1) { //this loop automatically detects for each section of block and each combination of collision if (((snakey == b_pos.y + 11)|| - (snakey == b_pos.y + 10)|| - (snakey == b_pos.y + 9)|| - (snakey == b_pos.y + 8))&& - (snakex + 1 == b_pos.x + block)) { + (snakey == b_pos.y + 10)|| + (snakey == b_pos.y + 9)|| + (snakey == b_pos.y + 8))&& + (snakex + 1 == b_pos.x + block)) { //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. //printf("snake collision working \n"); //audio feedback - if(blocknum > 0) {b_pos.y = 0;} //change this to speed y = 0 when length = 10. + if(blocknum > 0) { + b_pos.y = 0; //change this to speed y = 0 when length = 10. + } srn = CheckBlock(block); //this tells us which of the 5 blocks we are colliding with blocknum = b_number[srn]; 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. velocity = 0; - } - else { + } else { velocity = 1; } ImplementCollision(pad); @@ -226,25 +237,38 @@ } } } - -void SnakevsBlock::_set_velocity() { + +void SnakevsBlock::_set_velocity() +{ _b.velocity.y = velocity; _f.velocity.y = velocity; _ff.velocity.y = velocity; _fff.velocity.y = velocity; } - -int SnakevsBlock::CheckBlock(int block) { + +int SnakevsBlock::CheckBlock(int block) +{ int srn; - if((block>=0)&&(block<=18)) {srn = 0;} - if((block>=19)&&(block<=34)) {srn = 1;} - if((block>=35)&&(block<=50)) {srn = 2;} - if((block>=51)&&(block<=66)) {srn = 3;} - if((block>=67)&&(block<=83)) {srn = 4;} + if((block>=0)&&(block<=18)) { + srn = 0; + } + if((block>=19)&&(block<=34)) { + srn = 1; + } + if((block>=35)&&(block<=50)) { + srn = 2; + } + if((block>=51)&&(block<=66)) { + srn = 3; + } + if((block>=67)&&(block<=83)) { + srn = 4; + } return srn; } - -void SnakevsBlock::ImplementCollision(Gamepad &pad) { + +void SnakevsBlock::ImplementCollision(Gamepad &pad) +{ send_block_number = 1; if(blocknum > 0) { // to make sure that snake doesn't decrease in _length if number on the block is less than 1; _l.MinusLength(); @@ -258,45 +282,68 @@ { //If statements check if the snake sprite has collided with any //of the blocks' sides and then stop the snake moving in x axis - int length = _length; - if(_length>=10) {length = 10;} //to stop the snake length virtually at 10 when it goes past it. - for(int i=0; i<=9; i++) { b[i] = 1; } for(int i=0; i<=9; i++) { //i checks for all possible collisions with the snake respective to it's length. - for(int b_y_combination=0; b_y_combination<=10; b_y_combination++) { - if ( - (snake_pos[i].y == b_pos.y + b_y_combination) || - (snake_pos[i].y + 1 == b_pos.y + b_y_combination) || - (snake_pos[i].y + 2 == b_pos.y + b_y_combination)) { - for(int b_x_combination=2; b_x_combination<=82; b_x_combination+=16) { - //For West side of walls - if( - ((snake_pos[i].x == b_pos.x + b_x_combination+2) || //W - (snake_pos[i].x + 1 == b_x_combination+2))&&(_d != E)&&(length > i) //W - ) { - //code makes sure that the colliding part doesn't move in x axis. - for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) { - if(length == snake_beed_num + i) { - b[snake_beed_num - 1] = 0; - } - } - } - //for East side of walls - else if ( - ((snake_pos[i].x + 1 == b_x_combination) || //E - (snake_pos[i].x + 2 == b_x_combination))&&(_d != W)&&(length > i) //E - ) { - //code makes sure that the colliding part doesn't move in x axis. - for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) { - if(length == snake_beed_num + i) { - b[snake_beed_num - 1] = 0; - } - } - } - } - } + SnakevsBlock::check_Collision_Y_axis(i); //checks if the snake and the block are at the same position in y axis. + } +} + +void SnakevsBlock::check_Collision_Y_axis(int i) //i is the index of the snake beed and checks for all possible collisions with the snake respective to it's length. +{ + //This code checks if the snake and the block overlap in the Y axis. + for(int b_y_combination=0; b_y_combination<=10; b_y_combination++) { + if ( + (snake_pos[i].y == b_pos.y + b_y_combination) || + (snake_pos[i].y + 1 == b_pos.y + b_y_combination) || + (snake_pos[i].y + 2 == b_pos.y + b_y_combination)) { + + SnakevsBlock::check_Collision_X_axis(i); //checks if the snake and the block are at the same position in x axis. + + } + } +} + +void SnakevsBlock::check_Collision_X_axis(int i) //i is the index of the snake beed and checks for all possible collisions with the snake respective to it's length. +{ + for(int b_x_combination=2; b_x_combination<=82; b_x_combination+=16) { + + SnakevsBlock::checkCollision_EastorWest(b_x_combination, i); //checks if the colliding wall is on east side or west side. + } +} + +void SnakevsBlock::checkCollision_EastorWest(int b_x_combination, int i) //i checks for all possible collisions with the snake respective to it's length. +{ + //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 + //on screen. + int length = _length; + if(_length>=10) { + length = 10; //to stop the snake length virtually at 10 when it goes past it. + } + +//For West side of walls + if( + ((snake_pos[i].x == b_pos.x + b_x_combination+2) || //W + (snake_pos[i].x + 1 == b_x_combination+2))&&(_d != E)&&(length > i) //W + ) { + SnakevsBlock::StopX_AxisMotion(length, i); + } + //for East side of walls + else if ( + ((snake_pos[i].x + 1 == b_x_combination) || //E + (snake_pos[i].x + 2 == b_x_combination))&&(_d != W)&&(length > i) //E + ) { + SnakevsBlock::StopX_AxisMotion(length, i); + } +} + +void SnakevsBlock::StopX_AxisMotion(int length, int i) //i is the index of the snake beed and checks for all possible collisions with the snake respective to it's length. +{ + //code makes sure that the colliding part doesn't move in x axis. + for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) { + if(length == snake_beed_num + i) { + b[snake_beed_num - 1] = 0; } } } \ No newline at end of file