Dependencies:   mbed FATFileSystem

SceneCreator/SceneCreator.cpp

Committer:
rottenegg
Date:
2019-05-08
Revision:
17:7d4d8905b608
Parent:
15:3d29fb195958
Child:
18:14e5391beccf

File content as of revision 17:7d4d8905b608:

#include "SceneCreator.h"
#include "ScenePaths.h"

//Timer for dynamic wait times to reduce notice-able lagging between scenes
Timer dynatime;

DigitalOut led(LED_BLUE);
Serial pc(USBTX,USBRX);

//Constructor
SceneCreator::SceneCreator(PinName Button) {
    this->set_buttonPin(Button);
    dead = false;
    
}

//Destructor
SceneCreator::~SceneCreator() {
   this->deletebutton();
}

//Primary Function
void SceneCreator::Scenesp(Bitmap &lcd, CaMove &CM,short int spl,short int spx,short int spy, Direction spd, int rng,WDplayer &wav) {
    //Setting up WDplayer, CaMove and Scene interative regions
    wav.ISRset();
    CM.init(spx,spy,spd);
    CM.AIinit();
    lcd.normalMode();
    this->set_sreg(CM,spl);
    //Array to allow Pos Events to disable or enable Pre Events
    bool p[6] = {true,true,true,true,true,true};
    //Main Loop exit if charater dead or leaves screen
    while(!dead && CM.in_screen()) {
        //start timer
        dynatime.start();
        lcd.clear();
        //reload WDplayer data then Load map data
        wav.ISRpreload();
        lcd.renderBMP(SCN[spl],0,0);
        //CORE_1 (Pre Events Engine)
        this->Core_1(lcd, CM,spl,rng,p);
        //Charater and Chaser Model Update
        CM.move(lcd);
        CM.chase(lcd,spl);
        wav.ISRpreload();
        //CORE_2 (Pos Event Engine)
        this->Core_2(lcd, CM,spl,rng,p,wav);
        if (CM.is_caught()) {
            dead = true;
        }
        lcd.refresh();
        //Dynamic Wait
        dynatime.stop();
        float waittime = 0.15f - dynatime.read();
        if (waittime > 0.00000f) {
            wait(waittime);
        }
        dynatime.reset();
        //Will aim for 7 frames per second if too heavy of performance impacting frame rate will drop
    };
    //reset WDplayer and Delete interative regions
    wav.ISRreset();
    CM.delete_regions();
};

//CORE_1 (Pre EVENTS)
void SceneCreator::Core_1(Bitmap &lcd, CaMove &CM,short int spl,int rng,bool p[6]) {
    if (p[0]) {
            this->pre_func0(spl,lcd,CM,rng);
        }
        if (p[1]) {
            this->pre_func1(spl,lcd,CM,rng);
        }
        if (p[2]) {
            this->pre_func2(spl,lcd,CM,rng);
        }
        if (p[3]) {
            this->pre_func3(spl,lcd,CM,rng);
        }
        if (p[4]) {
            this->pre_func4(spl,lcd,CM,rng);
        }
        if (p[5]) {
            this->pre_func5(spl,lcd,CM,rng);
        }
}

//CORE_2 (Pos EVENTs)
void SceneCreator::Core_2(Bitmap &lcd, CaMove &CM,short int spl,int rng,bool (&p)[6],WDplayer &wav) {
    //Checks which region triggered
    switch(CM.get_treg()) {
            case 0:
                //pause Music
                wav.ISRpause();
                //Signal to player he is progressing by flashing screen (only occurs once)
                if(p[0]) {
                    p[0] *= false;
                    this->flash(lcd);
                }
                //Do this
                this->pos_func0(spl,lcd,CM,rng);
                //Resume Music
                wav.ISRresume();
            break;
            //Same For All Cases
            case 1:
                wav.ISRpause();
                if(p[1]) {
                    p[1] *= false;
                    this->flash(lcd);
                }
                this->pos_func1(spl,lcd,CM,rng);
                wav.ISRresume();
            break;
            case 2:
                wav.ISRpause();
                if(p[2]) {
                    p[2] *= false;
                    this->flash(lcd);
                }
                this->pos_func2(spl,lcd,CM,rng);
                wav.ISRresume();
            break;
            case 3:
                wav.ISRpause();
                if(p[3]) {
                    p[3] *= false;
                    this->flash(lcd);
                }
                this->pos_func3(spl,lcd,CM,rng);
                wav.ISRresume();
            break;
            case 4:
                wav.ISRpause();
                if(p[4]) {
                    p[4] *= false;
                    this->flash(lcd);
                }
                this->pos_func4(spl,lcd,CM,rng);
                wav.ISRresume();
            break;
            case 5:
                wav.ISRpause();
                if(p[5]) {
                    p[5] *= false;
                    this->flash(lcd);
                }
                this->pos_func5(spl,lcd,CM,rng);
                wav.ISRresume();
            break;
        };
}

//settings
//All below Functions Check which scene is operating and then fetches the required Function from SceneFunctions
//They all are they same...
void SceneCreator::set_sreg(CaMove &CM,int sce) {
    switch(sce) {
        case 0:
        this->set_scene0(CM);
        break;
        case 1:
        this->set_scene1(CM);
        break;
        case 2:
        this->set_scene2(CM);
        break;
        case 3:
        this->set_scene3(CM);
        break;
        case 4:
        this->set_scene4(CM);
        break;
    }
}

//pre-func
void SceneCreator::pre_func0(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        this->obj0_scene0(lcd);
        break;
        case 1:
        this->obj0_scene1(lcd);
        break;
        case 2:
        this->obj0_scene2(lcd);
        break;
        case 3:
        this->obj0_scene3(lcd);
        break;
        case 4:
        break;
    }
}

void SceneCreator::pre_func1(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        this->obj1_scene1(lcd);
        break;
        case 2:
        this->obj1_scene2(lcd,rng);
        break;
        case 3:
        this->obj1_scene3(lcd);
        break;
        case 4:
        this->obj1_scene4(lcd);
        break;  
    }
}

void SceneCreator::pre_func2(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        this->obj2_scene4(lcd);
        break;
    }
}

void SceneCreator::pre_func3(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        this->obj3_scene3(lcd);
        break;
        case 4:
        this->obj3_scene4(lcd);
        break;
    }
}

void SceneCreator::pre_func4(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        this->obj4_scene3(lcd);
        break;
        case 4:
        break;
    }
}

void SceneCreator::pre_func5(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
    }
}
//pos func

void SceneCreator::pos_func0(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        this->event0_scene0(lcd);
        break;
        case 1:
        this->event0_scene1(lcd);
        break;
        case 2:
        this->event0_scene2(lcd,CM);
        break;
        case 3:
        this->event0_scene3(lcd);
        break;
        case 4:
        this->event0_scene4(lcd,CM);
        break;
    }
}

void SceneCreator::pos_func1(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        this->event1_scene0(lcd);
        break;
        case 1:
        this->event1_scene1(lcd,CM);
        break;
        case 2:
        break;
        case 3:
        this->event1_scene3(lcd);
        break;
        case 4:
        break;
    }
}

void SceneCreator::pos_func2(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        this->event2_scene3(lcd);
        break;
        case 4:
        break;
    }
}


void SceneCreator::pos_func3(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        this->event3_scene3(lcd,CM);
        break;
        case 4:
        break;
    }
}

void SceneCreator::pos_func4(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
    }
}

void SceneCreator::pos_func5(int sce,Bitmap &lcd,CaMove &CM,int rng) {
    switch(sce) {
        case 0:
        break;
        case 1:
        break;
        case 2:
        break;
        case 3:
        break;
        case 4:
        break;
    }
}

bool SceneCreator::get_dead() {
    return dead;
}

void SceneCreator::set_dead(bool opt) {
    dead = opt;
}