test 1 doc

Dependencies:   mbed Gamepad2

Engine/Engine.cpp

Committer:
joebarhouch
Date:
2020-05-27
Revision:
9:9830d3a78572
Parent:
8:d19b30a6cd69
Child:
10:9317a62bd4d0

File content as of revision 9:9830d3a78572:

#include "Engine.h"

Platform maps[6] = {Platform(0, 40, 20, 3), Platform(0, 14, 20, 3), Platform(64, 14, 10, 3), Platform(70, 40, 20, 3), Platform(5, 20, 30, 3), Platform(55, 30, 25, 3)};
int mapSize = sizeof(maps)/sizeof(*maps);
vector <Enemy> enemies;


////////////////////// DRAW MAP //////////////////////////
void drawMap(N5110 &lcd)
{
    for (int i = 0; i < mapSize; i++) {
        maps[i].draw(lcd);

        //debugs
        //coords = maps[i].get_pos();
        //printf("x: %i, y: %i,w: %i,h: %i \n",coords.x, coords.y, coords.width, coords.height);
    }
    //debugs
    //printf("-----------------------------------------\n");
}



Engine::Engine()
{
}
Engine::~Engine()
{
}


////////////////////// INIT ////////////////////////////
void Engine::init()
{
    //init coord
    _px = WIDTH / 2;
    _py = 5;

    //init call
    _p.init(_px, _py);

    //ennemy
    enemies.push_back(Enemy(0, 0));
    enemies.push_back(Enemy(75, 0));


    //physics parameters
    _Ypos = 0;
    _fall = true;
    _c = false;

    //rands
    srand(time(NULL));
}



////////////////////// INPUT //////////////////////////
//reads direction and magnitude from the JOYSTICK to control the player
void Engine::read_input(Gamepad &pad)
{
    _d = pad.get_direction();
    _mag = pad.get_mag();
    _jump = pad.B_held();
    //printf("%s", _jump ? "true\n" : "false\n");
}





////////////////////// DRAW ///////////////////////////
//draw both player and map
void Engine::draw(N5110 &lcd)
{


    // player
    _p.draw(lcd);

    // map
    drawMap(lcd);

    //enemies
    for(int i = 0; i < enemies.size(); i ++) {
        enemies.at(i).draw(lcd);
    }


}




////////////////////// UPDATE //////////////////////////
//provide the player file with necessary Joystick values
void Engine::update(Gamepad &pad)
{
    floorCollide();
    efloorCollide();
    spawnEnemy();

    _p.update(_d,_mag, _Ypos, _fall, _jump);

    for(int i = 0; i < enemies.size(); i ++) {
        enemies.at(i).update(_eYpos.at(i), _efall.at(i));
        //printf("Enemy %i!\n", i);
    }

    /*
        if (_c == true) {

            //debug
            //printf("collison\n");
        } else {

            //debug
            //printf("no collison\n");
        }
        //enemmyCollide(pad);
    }
    */
}

////////////////////// FLOOR COLLISION //////////////////////////
void Engine::floorCollide()
{

    int a;
    Vector4 coords[mapSize];
    Vector2D player = _p.get_pos();
    //coordinates of platforms
    for(int i = 0; i < mapSize; i++) {
        coords[i] = maps[i].get_pos();
    }


    if(_c == false) {
        _fall = true;
        for(int j=0; j < mapSize; j++) {
            if(player.x+5 >= coords[j].x  && player.x+1 <= coords[j].x + coords[j].width  && player.y+9 >= coords[j].y  && player.y+9 <= coords[j].y + coords[j].height) {
                a = j;
                _c = true;
                //printf("%i, %i\n", player.x, player.y );
            }
        }
    }

    if(_c == true) {
        _Ypos = coords[a].y - 8;
        _fall = false;
        _c = false;
    }
}


////////////////////// SPAWN ENEMY /////////////////////////////////////
void Engine::spawnEnemy()
{


    for(int i = 0; i < enemies.size(); i ++) {
        //printf("%s", enemies.at(i).fell() ? "true\n" : "false\n");
        if ( enemies.at(i).fell() == true ) {
            int f = rand()%2;
            if ( f == 0) {
                place =1;
            } else if ( f ==1) {
                place = 0;
            }
            printf("%s\n", f ? "true" : "false");
            //enemies.erase(enemies.begin() + i);
            switch(place) {
                case 1:
                    enemies.at(i).set_pos(0,0);
                    //enemies.push_back(Enemy(0,0));
                    break;
                case 0:
                    enemies.at(i).set_pos(0,75);
                    //enemies.push_back(Enemy(0,75));
                    break;
            }

        }
    }

}


////////////////////// ENNEMY FLOOR COLLISION //////////////////////////
void Engine::efloorCollide()
{
    vector <Vector2D> epos;
    Vector4 coord[mapSize];
    int b;
    //coordinates of platforms
    for(int i = 0; i < mapSize; i++) {
        coord[i] = maps[i].get_pos();
    }

    for(int i = 0; i <enemies.size(); i++) {
        epos.push_back(enemies.at(i).get_pos());
        _eYpos.push_back(1);
        _efall.push_back(true);
        
        //printf("pos of %i: %f, %f\n", i, epos.at(i).x, epos.at(i).y);
    }

/*
    if(_e == false) {
        //_efall = true;
        for(int i=0; i<mapSize; i++) {
            for(int j=0; j < epos.size(); j++) {
                if(epos.at(j).x >= coord[i].x && epos.at(j).x+1 <= coord[i].x + coord[i].width && epos.at(j).y+6 >= coord[i].y && epos.at(j).y+6 <= coord[i].y + coord[i].height) {
                    b = j;
                    _e = true;
                    //printf("%f, %f\n", epos.at(j).x,epos.at(j).y );
                }
            }
        }
    }

    if(_e == true) {
        _eYpos.at(i) = coord[b].y - 8;
        _efall.at(i) = false;
        _e = false;
        //printf("enemy fall");
    }
*/
    for(int i=0; i < mapSize; i++){
            for(int j=0; j< epos.size(); j++){
                    if(epos.at(j).x >= coord[i].x && epos.at(j).x+1 <= coord[i].x + coord[i].width && epos.at(j).y+6 >= coord[i].y && epos.at(j).y+6 <= coord[i].y + coord[i].height){
                            _eYpos.at(i) = coord[i].y - 8;
                            _efall.at(i) = false;
                        }
                    else{
                            _efall.at(i) = true;
                        }
                }
        }

}