Adam Baker 201166301

Dependencies:   mbed Gamepad N5110

Revision:
50:9fc8edf722a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Blockhead/Blockhead.cpp	Thu May 09 12:10:41 2019 +0000
@@ -0,0 +1,904 @@
+#include "Blockhead.h"
+
+
+
+
+// nothing doing in the constructor and destructor
+Blockhead::Blockhead()
+{
+
+}
+
+Blockhead::~Blockhead()
+{
+
+}
+
+
+//initialise all vairables
+void Blockhead::init()              
+{
+
+    _x = 35;                        //x cordinate of blockhead
+    _y = 5;                         //y cordinate of bloc
+    _jump = 0;                      //jump counter
+    _wjr = 0;                       //wall jump right counter
+    _wjl = 0;                       //wall jump left counter
+    _fall = 0;                      //fall counter
+    _sprintright = 0;               //right sprint counter
+    _sprintleft = 0;                //left sprint counter
+    _level = 1;                     //dont initialise every time so doesnt restart at beggining each time..
+    _runani = 0;                    //run counter
+    _walkani = 0;                   //wak animation counter
+    _death = 0;                     //death counter
+}
+
+
+//initialise all variables, except level
+void Blockhead::continue_init()         
+{
+
+
+    _x = 0;                             //x cordiante of blockhead
+    if (_level == 6 || _level == 7 || _level == 9) {   //start point differs depending on what level your on
+        _y = -3;                         //y cordiante either 5,
+    } else {
+        _y = 25;                        //or 25
+    }
+    _jump = 0;                          //jump counter
+    _wjr = 0;                           //wall jump right counter
+    _wjl = 0;                           //wall jump left counter
+    _fall = 0;                          //fall counter
+    _sprintright = 0;                   //sprint right counter
+    _sprintleft = 0;                    //sprint left counter
+    _runani = 0;                        //run counter
+    _walkani = 0;                       //walk animation counter
+    _death = 0;                         //death counter
+
+
+}
+
+
+//all mechanics controling blockhead (movement from user input, movement from platforms, and gameover)
+void Blockhead::blockhead(Pos pos, N5110 &lcd, Gamepad &pad)    
+{
+    movement(lcd, pad);                                         //contolls movement of blockhead depending on input
+    platform_check(pos);                                        //checks if blochead is on or by a moving platform,
+    on_platform(lcd);                                           //if so, moves blockhead acordingly
+    gameover(pos, lcd);                                         //intiates death sequence if spike hit or crushed by platform
+    
+    
+
+}
+
+
+//all the functions which take an input and controll movement of blockhead (in correct order)
+void Blockhead::movement(N5110 &lcd, Gamepad &pad)              
+{
+    button_press(lcd, pad);                                     //checks if A button is pressed at correct moment (on ground for example), and starts correct counter
+    _speed = get_speed(pad);                                    //gets speed value according to joystick position
+    jump(lcd);                                                  //performes a jump when jump counter is 1
+    wall_jump_left(lcd, _speed);                                //peformes a wall jumo when wjl counter is 1
+    wall_jump_right(lcd, _speed);                               //peformes a wall jump when wjr counter is 1
+    run_left(lcd, _speed);                                      //moves left if speed is less than 0, lower speed is quicker blockhead moves
+    run_right(lcd, _speed);                                     //moves righ if speed is more than 0, higher speed is quicker blockhead moves
+    cancel_sprint(lcd, _speed);                                 //cancels sprint if hits wall or joystick is 0
+    fall(lcd);                                                  //falls when no ground below
+    runner_state(lcd, pad, _speed);                             //displays different sprites depending on what state runner is in (animating him)
+}
+
+
+//when game over, returns 1
+int Blockhead::gameover_flag(Gamepad &pad)                     
+{
+    if (_death > 8 || fallen(pad) == 1) {                      //will return 1 when character falls of screen, or death sequence completes,
+        _gameover = 1;
+    } else {
+        _gameover = 0;
+    }
+    
+    //printf("_gameove = %d", _gameover);  //uncoment to print for testing
+
+    return _gameover;
+}
+
+//starts death sequence if crushed by moving platform or if hit spikes
+void Blockhead::gameover(Pos pos, N5110 &lcd)                 
+{
+    if ((crushed_by_ver(pos) + crushed_by_ver_2(pos) + spike_hit(lcd, pos))>0 && _death==0) {
+        _death = 1;
+    }
+    
+    //printf("_death = %d", _death);  //uncoment to print for testing
+}
+
+
+//change increment depending on what button is pressed and where the runner is
+void Blockhead::button_press(N5110 &lcd, Gamepad &pad)                                                  
+{
+
+    if (pad.check_event(Gamepad::A_PRESSED)) {
+        if (_ani.pixelsDown(_x,_y,lcd) || _d3 == 3 || _d4 == 3) {                                       //if standing, or if on vertical platform,
+            _jump = 1;                                                                                  //jump increment begins.
+            pad.tone(880, 0.1);
+        } else if (_ani.pixelsLeft(_x,_y,lcd) && _ani.pixelsDown(_x,_y,lcd)==false && _wjr == 0) {      //if in air and by wall to left, wall jump right = 1
+            _wjr++;
+            pad.tone(1046.502, 0.1);
+        } else if (_ani.pixelsRight(_x,_y,lcd) && _ani.pixelsDown(_x,_y,lcd) == false && _wjl == 0) {   //if in air, and by wall to right, wall jump left = 1
+            _wjl++;
+            pad.tone(1046.502, 0.1);
+        }
+    }
+}
+
+
+ //move n pixels up if no collision
+void Blockhead::move_up(N5110 &lcd, int n)                     
+{
+
+    for(int i = 0; i < n; i++) {
+        if (_ani.pixelsUp(_x,_y,lcd) == false) {
+            _y--;
+        }
+    }
+    
+    //printf("_y = %d", _y);  //uncoment to print for testing
+}
+
+
+//move n pixels down if no collision
+void Blockhead::move_down(N5110 &lcd, int n)                    
+{
+    for(int i = 0; i < n; i++) {
+        if (_ani.pixelsDown(_x,_y,lcd) == false) {
+            _y++;
+        }
+    }
+    
+    //printf("_y = %d", _y);  //uncoment to print for testing
+}
+
+
+//move n pixels right if no collision
+void Blockhead::move_right(N5110 &lcd, int n)                   
+{
+    for(int i = 0; i < n; i++) {
+        if (_ani.pixelsRight(_x,_y,lcd) == false) {
+            _x++;
+        }
+    }
+    
+    //printf("_x = %d", _x);  //uncoment to print for testing
+}
+
+
+//move n pixels left if no collision
+void Blockhead::move_left(N5110 &lcd, int n)                    
+{
+
+    for(int i = 0; i < n; i++) {
+        if (_ani.pixelsLeft(_x,_y,lcd) == false) {
+            _x--;
+        }
+    }
+    
+    //printf("_x = %d", _x);  //uncoment to print for testing
+
+}
+
+
+//peforms jump sequence when _jump is 1
+void Blockhead::jump(N5110 &lcd)
+{
+
+    if (_jump <= 4 && _ani.pixelsUp(_x,_y,lcd) == false) {              //if nothing above, and jump counter is below 4
+        if (_jump == 1) {                                               //four pixels per refresh for first two jump increments
+            _jump++;
+            move_up(lcd, 4);
+        } else if (_jump == 2) {                                        // two pixels per refresh for next jump incrmements
+            _jump++;
+            move_up(lcd, 2);
+        } else if (_jump > 2 && _jump <= 4) {                           // one pixel per refresh for final jump increments
+            move_up(lcd, 1);
+            _jump++;
+        }
+    } else {
+        _jump = 0;                                                      //jump counter reset to 0 once jump cycle finished or interupted
+    }
+    
+    //printf("_jump = %d, _x = %d, _y = d%", _jump, _x, _y);  //uncoment to print for testing
+
+}
+
+
+//peforms wall jump right sequence when _wjr = 1
+void Blockhead::wall_jump_right(N5110 &lcd, float speed)
+{
+    if (_wjr == 1 && _ani.pixelsUp(_x,_y,lcd) == false) {                       //if wjr counter == 1 and nothing above
+        _wjr++;
+        _wjl = 0;                                                               //set wjl counter to 0, so can jump from opposite wall
+        move_up(lcd, 4);                                                        //move four pixels up
+        if (speed < 0.5f) {                                                     //and two pixels right, unless joy stick is driving right anyway
+            move_right(lcd, 2);
+        }
+    } else if (_wjr == 2 && _ani.pixelsUp(_x,_y,lcd) == false) {
+        _wjr++;
+        move_up(lcd,2);                                                         //move two pixels up
+        if (speed < 0.5f) {                                                     //and a pixel right, unless joy stick is driving right anyway
+            move_right(lcd, 1);
+        }
+    } else if (_wjr > 2 && _wjr <= 4 && _ani.pixelsUp(_x,_y,lcd) == false) {
+        _wjr++;
+        move_up(lcd, 1);                                                        //move one pixel up
+        if (speed < 0.5f) {                                                     //and a pixel right, unless joy stick is driving right anyway
+            move_right(lcd, 1);
+        }
+    } else if (_ani.pixelsDown(_x,_y,lcd)) {
+        _wjr = 0;                                                               //only reset wall jump count when on ground, or when
+    } else if (_ani.pixelsUp(_x,_y,lcd)) {                                      //left wall jump activated, so you cant wall jump continuously up one wall.
+        _wjr = 0;                                                               //or when ceiling hit to avoid blockhead sticking
+    }
+    
+    //printf("_wjr = %d, _x = %d, _y = d%", _wjr, _x, _y);  //uncoment to print for testing
+
+
+}
+
+
+//peforms wall jump left sequence when _wjl = 1 
+void Blockhead::wall_jump_left(N5110 &lcd, float speed)
+{
+
+    if (_wjl == 1 && _ani.pixelsUp(_x,_y,lcd) == false) {           //if wjl counter == 1 and nothing above
+        _wjl++;
+        _wjr = 0;                                                               //set wjr counter to 0, so can jump from opposite wall
+        move_up(lcd, 4);                                                        //move four pixels up
+        if (speed > -0.5f) {                                                    //and two pixels left, unless joy stick is driving left anyway
+            move_left(lcd, 2);
+        }
+    } else if (_wjl == 2 && _ani.pixelsUp(_x,_y,lcd) == false) {
+        _wjl++;
+        move_up(lcd, 2);                                                        //move two pixels up
+        if (speed > -0.5f) {                                                    //and a pixel left, unless joy stick is driving left anyway
+            move_left(lcd, 1);
+        }
+    } else if (_wjl > 2 && _wjl <= 4 && _ani.pixelsUp(_x,_y,lcd) == false) {
+        _wjl++;
+        move_up(lcd, 1);                                                        // move one pixel up
+        if (speed > -0.5f) {                                                    //and a pixel left, unless joy stick is driving left anyway
+            move_left(lcd, 1);
+        }
+    } else if (_ani.pixelsDown(_x,_y,lcd)) {
+        _wjl = 0;                                                               //only reset wall jump count when on ground, or when
+    } else if (_ani.pixelsUp(_x,_y,lcd)) {                                      //right wall jump activated, so you cant wall jump continuously up one wall.
+        _wjl = 0;
+    }
+
+    //printf("_wjl = %d, _x = %d, _y = d%", _wjl, _x, _y);  //uncoment to print for testing
+
+}
+
+
+//peforms fall when NOT in a jump cycle, wall jump cycle, and no ground below.
+void Blockhead::fall(N5110 &lcd)
+{
+    if (_jump == 0 && (_wjr == 0 || _wjr == 5) && (_wjl == 0 || _wjl == 5) && _ani.pixelsDown(_x,_y,lcd) == false) {
+        if (_fall == 0) {
+            move_down(lcd, 1);                                          //one pixel down per refresh to start
+            _fall++;
+        } else if (_fall == 1) {
+            _fall++;
+            move_down(lcd, 2);                                          //then two pixels down per refresh
+        } else if (_fall == 2) {
+            _fall++;
+            move_down(lcd, 3);                                          //then three..
+        } else if (_fall >= 3) {
+            _fall++;
+            move_down(lcd, 4);                                          //then four pixels per fresh (Maximum velocity!)
+        }
+    } else {
+        _fall = 0;                                                      //rest fall counter when no longer falling
+
+    }
+    
+    //printf("_fall = %d, _x = %d, _y = d%", _fall, _x, _y);  //uncoment to print for testing
+
+}
+
+
+//gets direction from joystick, and returns as speed
+float Blockhead::get_speed(Gamepad &pad)
+{
+
+    Vector2D coord = pad.get_coord();
+    float speed = coord.x;                                              //set speed to the cordinates of the joystick's x value
+
+    return speed;
+    
+    //printf("speed = %d, _x = %d, _y = d%", speed);  //uncoment to print for testing
+}
+
+
+//moves blockhead right according to speed
+void Blockhead::run_right(N5110 &lcd, float speed)
+{
+    if (_ani.pixelsRight(_x,_y,lcd) == false && (_wjl == 0 || _wjl == 5)) {     //run right if no obstical
+        if (speed > 0.1f && speed <= 0.25f) {                                   //depending on speed, move...
+            move_right(lcd, 1);                                                 //1 pixel right
+        } else if (speed > 0.25f && speed <= 0.5f) {
+            move_right(lcd, 2);                                                 //2 pixels right
+        } else if (speed > 0.5f && speed <= 0.75f) {
+            move_right(lcd, 3);                                                 //3 pixels right
+        } else if (speed > 0.75f) {
+            move_right(lcd, 4);                                                 //4 pixels right
+            _sprintright++;
+            if (_sprintright > 20) {                                            //if at top speed for more than 20 cycles, sprint! (6 pix per refresh);
+                move_right(lcd, 2);
+            }
+        }
+    }
+    
+    //printf("speed = %d, _x = %d, _y = d%", speed, _x, _y);  //uncoment to print for testing
+
+}
+
+
+//moves blockhead left according to speed
+void Blockhead::run_left(N5110 &lcd, float speed)
+{
+
+
+    if (_ani.pixelsLeft(_x,_y,lcd) == false && (_wjr == 0 || _wjr == 5)) {      //run left if no obstical
+        if (speed < -0.1f && speed >= -0.25f) {                                 //depending on speed move..
+            move_left(lcd, 1);                                                  //1 pixel left
+        } else if (speed < -0.25f && speed >= -0.5f) {
+            move_left(lcd, 2);                                                  //2 pixels right
+        } else if (speed < -0.5f && speed >= -0.75f) {
+            move_left(lcd, 3);                                                  //3 pixels right
+        } else if (speed < -0.75f) {
+            move_left(lcd, 4);                                                  //4 pixels right
+            _sprintleft++;
+            if (_sprintleft > 20) {                                             //if at top speed for more than 20 cycles, sprint!
+                move_left(lcd, 2);
+            }
+
+        }
+    }
+
+    //printf("speed = %d, _x = %d, _y = d%", speed, _x, _y);  //uncoment to print for testing
+
+}
+
+
+//restets sprint incrment if collision or joystick idle
+void Blockhead::cancel_sprint(N5110 &lcd, float speed)
+{
+
+    if (speed < 0.5f || _ani.pixelsRight(_x,_y,lcd) ) {
+        _sprintright = 0;                                                   //if collision or speed drops below 0.5 cancell sprint
+    }
+
+    if (speed > -0.5f || _ani.pixelsLeft(_x,_y,lcd) ) {
+        _sprintleft = 0;                                                   //if collision or speed drops below 0.5 cancell sprint
+    }
+    
+    //printf("_sprintleft = %d, _sprintright = %d", _jump;  //uncoment to print for testing
+
+}
+
+//runs blockhead's alive sequnce untill _death flag turns to one (as a result of death)
+void Blockhead::runner_state(N5110 &lcd, Gamepad &pad, float speed)
+{
+
+    if (_death == 0) {
+        alive_sequence(lcd, speed);                         //whilst game over flag is 0, runs alive sequence animation
+    } else {
+        death_sequence(lcd, pad);                           //when game over flag turns 1, run death sequence animation)
+    }
+
+
+
+}
+
+
+//displays the correct animation depending on runner state  (for example when moving slowly walking animation is displayed)
+void Blockhead::alive_sequence(N5110 &lcd, float _speed)    
+{
+    if (_ani.pixelsRight(_x, _y, lcd) && (_fall > 0 || _jump > 0 ) && (_d3 != 3 && _d4 !=3)) {                                  //if by right wall in air,
+        _ani.wallclingRight(_x, _y, lcd);                                                                                       //display wall cling right spite
+    } else if (_ani.pixelsLeft(_x, _y, lcd) && (_fall > 0 || _jump > 0 ) && (_d3 != 3 && _d4 !=3)) {                            //if by left wall in air,
+        _ani.wallclingLeft(_x, _y, lcd);                                                                                        //display wall cling left sprite
+    } else if ( ( (_wjr > 0 && _wjr < 5) || (_speed >= 0.1f && (_fall > 0 || _jump > 0)) ) && (_d3 != 3 && _d4 != 3) ) {        //if falling right,
+        _ani.fallingRight(_x, _y, lcd);                                                                                         //display falling left sprite
+    } else if ( ( (_wjl > 0 && _wjl < 5) || (_speed < -0.1f && (_fall > 0 || _jump > 0 )) ) && (_d3 != 3 && _d4 != 3) ) {       //if fallig left,
+        _ani.fallingLeft(_x, _y, lcd);                                                                                          //display falling left sprite
+    } else if ( (_wjr ==9 || _fall > 0 || _jump > 0 ) && (_d3 != 3 && _d4 !=3) )  {                                             //if falling,
+        _ani.falling(_x, _y, lcd);                                                                                              //display falling sprite
+    } else if (_speed > 0.5f) {                                                                                                 //if speed is more than 0.5
+        run_sequence_right(lcd);                                                                                                //peform run right animation
+    } else if (_speed > 0.1f) {                                                                                                 //if only more than 0
+        walk_sequence_right(lcd);                                                                                               //peform walk right animation
+    } else if (_speed < -0.5f) {                                                                                                //if speed less than -0.5
+        run_sequence_left(lcd);                                                                                                 //peform run left animation
+    } else if (_speed <  -0.1f) {                                                                                               //if only less than 0
+        walk_sequence_left(lcd);                                                                                                //peform walk left animation
+    } else {                                                                                                                    //if none of the above
+        _ani.standing(_x, _y, lcd);                                                                                             //display standing sprite!
+    }
+
+
+}
+
+
+//displays running animation (right)
+void Blockhead::run_sequence_right(N5110 &lcd)
+{
+    _runani++;
+    if (_runani == 1) {                                                 //when running right, cr alterntes between 1 and 2,
+        _ani.runRightOne(_x, _y, lcd);                                  //displaying the run right sprites consecutively thus creating a running animation
+    } else if (_runani == 2) {
+        _ani.runRightTwo(_x, _y, lcd);
+        _runani = 0;
+    }
+
+
+
+}
+
+
+//displays running animation (left)
+void Blockhead::run_sequence_left(N5110 &lcd)
+{
+    _runani++;
+    if (_runani == 1) {                                                 //when running left, cr alterntes between 1 and 2,
+        _ani.runLeftOne(_x, _y, lcd);                                   //displaying the run left sprites consecutively thus creating a running animation
+    } else if (_runani == 2) {
+        _ani.runLeftTwo(_x, _y, lcd);
+        _runani = 0;
+    }
+
+
+
+}
+
+
+//displays walking animation (right)
+void Blockhead::walk_sequence_right(N5110 &lcd)
+{
+    _walkani++;
+    if (_walkani == 1) {
+        _ani.walkRightOne(_x, _y, lcd);                                     //when walking right, cw runs between 1 2 3 4,
+    } else if (_walkani == 2) {                                             //displaying the walk right sprites consecutively thus creating a walking animation
+        _ani.walkRightTwo(_x, _y, lcd);
+    } else if (_walkani == 3) {
+        _ani.walkRightThree(_x, _y, lcd);
+    } else if (_walkani == 4) {
+        _ani.walkRightFour(_x, _y, lcd);
+        _walkani = 0;
+    }
+
+
+}
+
+
+//displays walking animation (left)
+void Blockhead::walk_sequence_left(N5110 &lcd)
+{
+    _walkani++;
+    if (_walkani == 1) {                                                 //when walking left, cw runs between 1 2 3 4,
+        _ani.walkLeftOne(_x, _y, lcd);                                   //displaying the walk right sprites consecutively thus creating a walking animation
+    } else if (_walkani == 2) {
+        _ani.walkLeftTwo(_x, _y, lcd);
+    } else if (_walkani == 3) {
+        _ani.walkLeftThree(_x, _y, lcd);
+    } else if (_walkani == 4) {
+        _ani.walkLeftFour(_x, _y, lcd);
+        _walkani = 0;
+    }
+
+
+}
+
+
+//displays death animation 
+void Blockhead::death_sequence(N5110 &lcd, Gamepad &pad)
+{
+
+    if (_death == 1) {
+        _ani.deathOne(_x,_y,lcd);                                       //when cd activated by gameover, run death sequence animation
+        pad.tone(261.62, 0.1); //c3                                     //a tone is played each fram, creating a disonant tune along with the animation
+    } else if (_death == 2) {
+        _ani.deathTwo(_x,_y,lcd);
+        pad.tone(97.999, 0.1); //g2
+    } else if (_death == 3) {
+        _ani.deathThree(_x,_y,lcd);
+        pad.tone(207.652, 0.1);  //g1#
+    } else if (_death == 4) {
+        _ani.deathFour(_x,_y,lcd);
+        pad.tone(155.563, 0.1);   //d1#
+    }
+    _death++;
+
+
+}
+
+
+//changes level when either side of screen
+int Blockhead::next_level()
+{
+    if (_x > 76) {  
+        _x = -1;                                                        //when blockhead goes off right side of screen,
+        _level++;                                                       //level increments, and blockhead appears at left side
+    } else if (_x < -1) {
+        _x = 76;                                                        //when blockhead goes off left side of screen,
+        _level--;                                                       //level deccrements, and block head appears at right side
+    }
+    
+    //printf("_level = %d", _level);  //uncoment to print for testing
+
+    return _level;
+
+}
+
+
+//checks if blockhead is on horizontal platform
+int Blockhead::on_hoz_check(Pos pos)
+{
+    int d;
+    int c = 0;
+
+    for (int i = 0; i < pos.l; i++) {                                                       //for the entire lenth of moving platform one
+        if (((_x+2 == pos.x+i) || (_x+6 == pos.x+i)) &&(_y+12 == pos.y)) {                  //checks if cordinates of horizontal moving platform one,
+            c++;                                                                            //are the same as blockheads's underside cordinates, if so c++
+        }
+    }
+    if (c > 0) {                                                                            //if c > 0 blockhead is on the moving platform,
+        d = pos.d;                                                                          //then d = direction of moving platform (0 = right, 1 - left)
+    } else {                                                                                //if not then d = 2 (insignificant number)
+        d = 2;
+    }
+    
+    //printf("d = %d", d);  //uncoment to print for testing
+
+    return d;                                                                               //d is then used to move blcokhead in the direction of the platform he is on
+}
+
+
+//checks if blockhead is by right of horizontal platform
+int Blockhead::by_hoz_check_right(Pos pos)
+{
+    int c = 0;
+    int d;
+
+    for (int i = 0; i < 12; i ++) {                                                                                             //for 12 (height of blockhead)
+        if ((_x-1 == pos.x + pos.l) && ((_y + i == pos.y) || (_y + i == pos.y+1) || (_y + i == pos.y+2))) {                     //check if cordinates of right side horizontal moving platform one
+            c++;                                                                                                                //are the same as blockhead's left side
+        }
+    }
+
+    if (c > 0 && pos.d == 0) {                                                              // if c > 0 and the platform is moving right
+        d = 1;                                                                              // then d = 1,
+    } else {                                                                                // otherwise d = 0 (insignificant number)
+        d = 0;
+    }
+    
+    //printf("d = %d", d);  //uncoment to print for testing
+
+    return d;                                                                               //d is then used to move blockhead in the direction the platform is pushing against him
+}
+
+
+//checks if blockhead is by left of horizontal platform
+int Blockhead::by_hoz_check_left(Pos pos)
+{
+    int c = 0;
+    int d;
+
+    for (int i = 0; i < 12; i ++) {                                                                                             //for 12 (height of blockhead)
+        if ((_x+9 == pos.x) && ((_y + i == pos.y) || (_y + i == pos.y+1) || (_y + i == pos.y+2))) {                             //check if cordinates of left side horizontal moving platform one
+            c++;                                                                                                                //are the same as blockhead's right side
+        }
+    }
+
+    if (c > 0 && pos.d == 1) {                                                              //if c > 0 and the platform is moving right
+        d = 1;                                                                              //then d = 1,
+    } else {                                                                                //otherwise d = 0 (insignificant number)
+        d = 0;
+    }
+    
+    //printf("d = %d", d);  //uncoment to print for testing
+
+    return d;                                                                               //d is then used to move blockhead in the dicrection the platform is pushing against him
+}
+
+
+//checks if blockhead is on horizontal platform (2)
+int Blockhead::on_hoz_2_check(Pos pos)
+{
+    int d;
+    int c = 0;
+
+    for (int i = 0; i < pos.l2; i++) {
+        if (((_x+2 == pos.x2+i) || (_x+6 == pos.x2+i)) &&(_y+12 == pos.y2)) {               //for the entire lenth of moving platform one
+            c++;                                                                            //checks if cordinates of horizontal moving platform one,
+        }                                                                                   //are the same as blockheads's underside cordinates, if so c++
+    }
+    if (c > 0) {
+        d = pos.d2;                                                                         //if c > 0 blockhead is on the moving platform,
+    } else {                                                                                //then d = direction of moving platform (0 = right, 1 - left)
+        d = 2;                                                                              //if not then d = 2 (insignificant number)
+    }
+    
+    //printf("d = %d", d);  //uncoment to print for testing
+
+    return d;                                                                               //d is then used to move blcokhead in the direction of the platform he is on
+}
+
+
+//checks if blockhead is by right of horizontal platform (2)
+int Blockhead::by_hoz_2_check_right(Pos pos)
+{
+    int c = 0;
+    int d;
+
+    for (int i = 0; i < 12; i ++) {                                                                                             //for 12 (height of blockhead)
+        if ((_x-1 == pos.x2 + pos.l2) && ((_y+i == pos.y2) || (_y+i == pos.y2+1) || (_y + i == pos.y2+2))) {                    //check if cordinates of right side horizontal moving platform one
+            c++;                                                                                                                //are the same as blockhead's left side
+        }
+    }
+    //if c > 0 and the platform is moving right
+    if (c > 0 && pos.d2 == 0) {                                                             //then d = 1,
+        d = 1;                                                                              //otherwise d = 0 (insignificant number)
+    } else {
+        d = 0;
+    }
+    
+    //printf("d = %d", d);  //uncoment to print for testing
+
+    return d;                                                                               //d is then used to move blockhead in the direction the platform is pushing against him
+}
+
+
+//checks if blockhead is by left of horizontal platform (2)
+int Blockhead::by_hoz_2_check_left(Pos pos)
+{
+    int c = 0;
+    int d;
+
+    for (int i = 0; i < 12; i ++) {                                                                                             //for 12 (height of blockhead)
+        if ((_x+9 == pos.x2) && ((_y + i == pos.y2) || (_y + i == pos.y2+1) || (_y + i == pos.y2+2))) {                         //check if cordinates of left side horizontal moving platform one
+            c++;                                                                                                                //are the same as blockhead's right side
+        }
+    }
+
+    if (c > 0 && pos.d2 == 1) {                                                             //if c > 0 and the platform is moving right
+        d = 1;                                                                              //then d = 1,
+    } else {                                                                                //otherwise d = 0 (insignificant number)
+        d = 0;
+    }
+    
+    //printf("d = %d", d);  //uncoment to print for testing
+
+    return d;                                                                               //d is then used to move blockhead in the dicrection the platform is pushing against him
+}
+
+
+//check is blockhead is on vertical moving platform
+int Blockhead::on_ver_check(Pos pos) // add the _x part..
+{
+    int d;
+    int c = 0;
+
+    for (int i = 0; i < pos.vl+1; i++) {                                                    //for width of vertical moving platform
+        if ((_y+11 == pos.vy-1) && ((_x == pos.vx+i) || (_x+1 == pos.vx+i) || (_x+2 == pos.vx+i) || (_x+6 == pos.vx+i) || (_x+7 == pos.vx+i) || (_x+8 == pos.vx+i))) {            //check if cordinates of top of vertical moving platform,
+            c++;                                                                            //are the same as blockheads underside
+        }
+    }
+    
+    if (c > 0) {                                                                            //if c > 0 blockhead is on the moving platform,
+        d = pos.vd+3; //3 = down 4 = up                                                     //then d = direction of moving platform (3 = down, 4 = up)
+    } else {                                                                                //if not then d = 2 (insignificant number)
+        d = 2; //not moving
+    }
+    
+    //printf("d = %d", d);  //uncoment to print for testing
+
+    return d;
+}
+
+
+//check is blockhead is on vertical moving platform (2)
+int Blockhead::on_ver_2_check(Pos pos)
+{
+    int d;
+    int c = 0;
+
+    for (int i = 0; i < pos.vl2+1; i++) {                                                   //for width of vertical moving platform
+        if ((_y+11 == pos.vy2-1) &&  ((_x == pos.vx2+i) || (_x+1 == pos.vx2+i) || (_x+2 == pos.vx2+i) || (_x+6 == pos.vx2+i) || (_x+7 == pos.vx2+i) || (_x+8 == pos.vx2+i)) ) {   //check if cordinates of top of vertical moving platform
+            c++;                                                                            //are the same as blockheads underside
+        }
+    }
+
+    if (c > 0) {                                                                            //if c > 0 blockhead is on the moving platform,
+        d = pos.vd2+3; //3 = down 4 = up                                                    //then d = direction of moving platform (3 = down, 4 = up)
+    } else {                                                                                //if not then d = 2 (insignificant number)
+        d = 2; //not moving
+    }
+    
+    //printf("d = %d", d);  //uncoment to print for testing
+
+    return d;
+}
+
+
+//checks if blockhead is being crushed by vertical moving platform 
+int Blockhead::crushed_by_ver(Pos pos)  
+{
+    int c = 0;
+    int g = 0;
+
+    for (int a = 0; a < 9; a++) {                                                                  //for the height of blockhead,
+        for (int i = 0; i < pos.vl+1; i++) {                                                       //and the width of the vertical moving platform,
+            if ((_y+10-a == pos.vy-1) &&  ((_x+2 == pos.vx + i) || (_x+6 == pos.vx + i)) ) {       //check if the cordinates of width of vertical moving platform
+                c++;                                                                               //are the same as blockehads, starting from bottom -1 and up.
+            }
+        }
+    }
+
+    for (int a = 0; a < 9; a++) {                                                                   //for the height of blockhead
+        for (int i = 0; i < pos.vl+1; i++) {                                                        //and the width of the vertical moving platform
+            if ((_y+a == pos.vy+pos.vh) &&  ((_x+2 == pos.vx + i) || (_x+6 == pos.vx + i)) ) {      //check if the cordinates of width of vertical moving platform
+                c++;                                                                                //are the same as blockhead's, starting from top -1, and down.
+            }
+        }
+    }
+
+    if (c > 0) {                                                                                    //if so, g = 1 .. this means that blockhead his being crushed
+        g = 1;
+    } else {
+        g = 0;
+    }
+    
+    //printf("g = %d", g);  //uncoment to print for testing
+
+    return g;
+}
+
+
+//checks if blockhead is being crushed by vertical moving platform (2)
+int Blockhead::crushed_by_ver_2(Pos pos)
+{
+    int c = 0;
+    int g = 0;
+
+    for (int a = 0; a < 9; a++) {                                                                   //for the height of blockhead,
+        for (int i = 0; i < pos.vl2+1; i++) {                                                       //and the width of the vertical moving platform two,
+            if ((_y+10-a == pos.vy2-1) &&  ((_x+2 == pos.vx2 + i) || (_x+6 == pos.vx2 + i)) ) {     //check if the cordinates of width of vertical moving platform
+                c++;                                                                                //are the same as blockehads, starting from bottom -1 and up.
+            }
+        }
+    }
+
+    for (int a = 0; a < 9; a++) {                                                                   //for the height of blockhead
+        for (int i = 0; i < pos.vl2+1; i++) {                                                       //and the width of the vertical moving platform two
+            if ((_y+a == pos.vy2+pos.vh2) &&  ((_x+2 == pos.vx2 + i) || (_x+6 == pos.vx2 + i)) ) {  //check if the cordinates of width of vertical moving platform
+                c++;                                                                                //are the same as blockhead's, starting from top -1, and down.
+            }
+        }
+    }
+
+    if (c > 0) {
+        g = 1;                                                                                      //if so, g = 1 .. this means that blockhead is being crushed
+    } else {
+        g = 0;
+    }
+    
+    //printf("g = %d", g);  //uncoment to print for testing
+
+    return g;
+}
+
+
+//checks if blockhead has hit spikes
+int Blockhead::spike_hit(N5110 &lcd, Pos pos)
+{
+    int c = 0;
+    int g;
+
+    for (int i = 0; i < pos.sl; i++) {                                                                                                      //for length of spikes,
+        if (lcd.getPixel(pos.sx+i, pos.sy-3)) {                                                                                             //check if pixels above,
+            c++;                                                                                                                            //if plus c
+        }
+    }
+    if (lcd.getPixel(pos.sx-1, pos.sy) || lcd.getPixel(pos.sx, pos.sy-1) || lcd.getPixel(pos.sx, pos.sy-2)) {                               //check if pixels to left side of spikes
+        c++;                                                                                                                                //if so plus c
+    }
+
+    if (lcd.getPixel(pos.sx+pos.sl+1, pos.sy) || lcd.getPixel(pos.sx+pos.sl, pos.sy-1) || lcd.getPixel(pos.sx+pos.sl, pos.sy-2)) {          //checl if pixels to right side of spikes
+        c++;                                                                                                                                //if so plus c
+    }
+
+
+    if (c > 0) {                                                                                                //if c > 0, g = 1.. this meand that blockhead has hit the spikes!
+        g = 1;
+    } else {
+        g = 0;
+    }
+    
+    //printf("g = %d", g);  //uncoment to print for testing
+
+    return g;
+}
+
+
+//returns 1 if blockhead falls of screen
+int Blockhead::fallen(Gamepad &pad)
+{
+    int g;
+
+    if (_y > 51) {                                                      //if blockhead falls of screen,
+        g = 1;                                                          //g = 1
+        fall_tune(pad);
+    } else {
+        g = 0;
+    }
+
+    //printf("g = %d", g);  //uncoment to print for testing
+
+    return g;
+
+}
+
+
+//plays desending tune to play once blockhead falls off screen.
+void Blockhead::fall_tune(Gamepad &pad)
+{
+
+    pad.tone(1046.502, 0.1);                                            //desending tune to play once blockhead falls off screen.
+    wait(0.1);
+    pad.tone(932.328, 0.1);
+    wait(0.1);
+    pad.tone(622.254, 0.1);
+    wait(0.1);
+    pad.tone(523.251, 0.1);
+    wait(0.1);
+    pad.tone(466.164, 0.1);
+    wait(0.1);
+    pad.tone(369.994, 0.1);
+    wait(0.1);
+    pad.tone(293.665, 0.1);
+    wait(0.1);
+    pad.tone(261.626, 0.1);
+    wait(0.1);
+}
+
+
+//checks if blcokhead is on or by any of the platforms
+void Blockhead::platform_check(Pos pos)
+{
+    _d = on_hoz_check(pos);                                     //checks if blochead on horizontal (hoz) moving platform
+    _r = by_hoz_check_right(pos);                               //checks if blockhead by hoz moving platform
+    _l = by_hoz_check_left(pos);
+    _d2 = on_hoz_2_check(pos);                                  //checks if blockhead on second horizontal moving platform
+    _r2 = by_hoz_2_check_right(pos);
+    _l2 = by_hoz_2_check_left(pos);
+    _d3 = on_ver_check(pos);                                    //checks if blockhead on vertical moving platform
+    _d4 = on_ver_2_check(pos);                                  //checks if blockhead on second vertical moving platform
+}
+
+
+//moves blockhead according to what platform he is on
+void Blockhead::on_platform(N5110 &lcd)                                 //if on platform, move blockhead in the  direction the platform is moving
+{
+
+    if (_d == 0 || _r == 1 || _d2 == 0 || _r2 == 1) {                   //move blockhead right if on/by a horizontal platform moving right
+        move_right(lcd, 1);
+    } else if (_d == 1 || _l == 1 || _d2 == 1 || _l2 == 1) {            //move blockhead left if on/by a horizontal platform moving left
+        move_left(lcd, 1);
+    } else if (_d3 == 4 || _d4 == 4) {                                  //move blockhead up if on a vertical moving platform
+        move_up(lcd, 1);
+    }
+
+}
+
+