Skip to content
Snippets Groups Projects
Select Git revision
  • cbbf1a0b15316d61cefb90a2a2d513ff783cfd4c
  • master default
  • Huaer
  • krueger
4 results

Position.hpp

Blame
  • main.cpp 13.14 KiB
    #include <cmath>
    #include <sstream>
    
    #include "PixelBuffer.hpp" // hoffmanncl72341
    #include "PixelShaders.hpp" // hoffmanncl72341
    #include "Platform_Win32Console.hpp" // hoffmanncl72341
    #include "Level.hpp" // kruegerzo72182
    #include "Enemy.hpp" // hauerch71498
    #include "Bomber.hpp" // hauerch71498
    #include "Scoreb.hpp" // hauerch71498
    #include "Tank.hpp" // hauerch71498
    #include "Trooper.hpp" // hauerch71498
    #include "Enemyprojectile.hpp" // hauerch71498
    #include "player.hpp" // weberma73121
    
    //constexpr double PI = 3.14159265358979323846;
    // <kruegerzo72182 ----------------------------------------------------------------------
    bool debug = false;
    // trooperspawner variables
    bool spawnTroopers = true;
    float trooperTimer = 0.0f;
    float trooperSpawnTime = 3.0f;
    int trooperSpawnX = 120;
    int trooperSpawnY = 170;
    int trooperSpawnCount = 1; // +1
    // bomberspawner variables
    float bomberTimer = 25.0f;
    float bomberSpawnTime = 30.0f;
    float bomberSpawnDiffMod = 0.5f;
    // tankspawner variables
    float tankTimer = 15.0f;
    float tankSpawnTime = 25.0f;
    float tankSpawnDiffMod = 0.5f;
    // difficulty variables
    float difficultyTimer = 0.0f;
    float difficultyChangeTime = 60.0f;
    int difficulty = 0;
    // screen
    int screenWidth = 320;
    int screenHeigth = 320;
    
    // global helper funktion to add "buildings"
    void addBuilding(float x, float y, int size, Level &level_ptr)
    {
        int thickness = 3;
        // adds a Wall to the level (length, thickness, position X, position Y, orientation)
        level_ptr.addWall(size, thickness, { x, y }, Orientation::Horizontal);
        level_ptr.addWall(size, thickness, { x, y + size - thickness }, Orientation::Horizontal);
        level_ptr.addWall(size, thickness, { x, y }, Orientation::Vertical);
        level_ptr.addWall(size, thickness, { x + size - thickness, y }, Orientation::Vertical);
    }
    // kruegerzo72182> ----------------------------------------------------------------------
    // <hoffmanncl72341 ---------------------------------------------------------------------
    class GameLoop {
        int frame = 0;
        FloatSeconds time_elapsed{ 0.0f };
        bool GameOverFlag = false; //hauerch71498
        float GameOverTime = 0.0f;
    
        DynamicPixelBuffer framebuffer = {screenWidth, screenHeigth};
        Score Highscore = {screenWidth,screenHeigth};
    public:
        void run(Platform& platform, FloatSeconds const &frame_time, Level &level, Player &player_) {
            framebuffer.clear(_0);
    
            if(frame_time.count() != 0.0f) {
                if(!debug){
                    platform.set_title(
                        "Bestestes ASCII Shooter Ever - " +
                         std::to_string(std::lround(1.0f / frame_time.count())) +
                         " FPS"
                    );
                }
                else {
                    platform.set_title(
                        "<Player X: " +
                         std::to_string(std::lround(player_.getTopLeft().X)) +
                         " --- Player Y: " +
                         std::to_string(std::lround(player_.getTopLeft().Y)) +
                         " --- difficulty: " + std::to_string(difficulty) +
                         " --- bomberSpawnTime: " + std::to_string(bomberSpawnTime) +
                         " --- bomberTimer: " + std::to_string(bomberTimer) +
                         " ---  debug>"
                    );
                }
            }
    // hoffmanncl72341> ---------------------------------------------------------------------
    
    // <kruegerzo72182 ----------------------------------------------------------------------
            //Spawn the troopers from the trooperspawner
            if(spawnTroopers){
              trooperTimer = trooperTimer + frame_time.count();
              if(level.getEnemySpawnCount() != 0){
                  if(trooperTimer > trooperSpawnTime){
                      level.enemyVector_PushBack(level.getTrooperSpawn());
                      trooperTimer = 0.0f;
                  }
                }
              else{
                  spawnTroopers = false;
                  int trPosition = rand() % 2;
                  switch ( trPosition ) {
                      case 1:
                          trooperSpawnX = 120;
                          trooperSpawnY = 170;
                          break;
                      case 2:
                          trooperSpawnX = 200;
                          trooperSpawnY = 160;
                          break;
                      default:
                          trooperSpawnX = 270;
                          trooperSpawnY = 50;
                          break;
                    }
                  level.fillTrooperSpawner(static_cast<float>(trooperSpawnX), static_cast<float>(trooperSpawnY), trooperSpawnCount);
                }
              }
    
            //Spawn bombers from different directions endlessly
            bomberTimer = bomberTimer + frame_time.count();
            if(bomberTimer > bomberSpawnTime){
                direction dir = direction(rand()%4);
                float bombX;
                float bombY;
                int offset = 20;
                switch (dir) {
                    case direction::BACK: //Up
                        bombX = player_.getTopLeft().X;
                        bombY = static_cast<float>(screenHeigth + offset);
                        break;
                    case direction::LEFT: //left
                        bombX = static_cast<float>(screenWidth + offset);
                        bombY = player_.getTopLeft().Y;
                        break;
                    case direction::RIGHT: //right
                        bombX = static_cast<float>(-offset);
                        bombY = player_.getTopLeft().Y;
                        break;
                    default: //Down
                        bombX = player_.getTopLeft().X;
                        bombY = static_cast<float>(-offset);
                        break;
                }
                level.enemyVector_PushBack(std::make_unique<Bomber>(Bomber(bombX, bombY, dir, 0)));
                bomberTimer = 0.0f;
              }
    
            //Spawn tanks from different positions endlessly
            tankTimer = tankTimer + frame_time.count();
            if(tankTimer > tankSpawnTime){
                direction dir;
                int position = rand() % 6;
                float tankX;
                float tankY;
                switch ( position ) {
                    case 1:
                        tankX = static_cast<float>(50);
                        tankY = static_cast<float>(150);
                        dir = direction::BACK;
                        break;
                    case 2:
                        tankX = static_cast<float>(200);
                        tankY = static_cast<float>(160);
                        dir = direction::LEFT;
                        break;
                    case 3:
                        tankX = static_cast<float>(270);
                        tankY = static_cast<float>(50);
                        dir = direction::FRONT;
                        break;
                    case 4:
                        tankX = static_cast<float>(15);
                        tankY = static_cast<float>(225);
                        dir = direction::RIGHT;
                        break;
                    case 5:
                        tankX = static_cast<float>(170);
                        tankY = static_cast<float>(210);
                        dir = direction::LEFT;
                        break;
                    default:
                        tankX = static_cast<float>(20);
                        tankY = static_cast<float>(25);
                        dir = direction::RIGHT;
                        break;
                }
                level.enemyVector_PushBack(std::make_unique<Tank>(Tank(tankX, tankY, dir, 0)));
                tankTimer = 0.0f;
              }
    // kruegerzo72182> ----------------------------------------------------------------------
    
    // <hauerch71498 ----------------------------------------------------------------------
            if(!GameOverFlag)
            {
            // <kruegerzo72182
            // player movement
            player_.move(platform, frame_time, level);
            } else {
                GameOverTime += frame_time.count();
            }
    
            // enemy movement
            GameOverFlag = (level.doDoSteps(frame_time) == false);
    // hauerch71498> ----------------------------------------------------------------------
    
    // <kruegerzo72182 ----------------------------------------------------------------------
            difficultyTimer = difficultyTimer + frame_time.count();
            if((difficultyTimer > difficultyChangeTime))
              {
                difficulty++;
                difficultyTimer = 0.0f;
                spawnTroopers = true;
                // raise troopers to spawn every 4 levels until max troppers to spawn is 12
                if(trooperSpawnCount < 11 && difficulty%4 == 0){
                    trooperSpawnCount = trooperSpawnCount + 2;
                  }
                if(difficulty < 55)
                  {
                    if(bomberSpawnTime < 4){
                        bomberSpawnTime = 5;
                      }
                    else{
                        bomberSpawnTime = bomberSpawnTime - bomberSpawnDiffMod;
                      }
                  }
                if(difficulty < 25)
                  {
                    if(tankSpawnTime < 4){
                        tankSpawnTime = 5.0f;
                      }
                    else{
                        tankSpawnTime = tankSpawnTime - tankSpawnDiffMod;                    
                      }
                  }
              }
    // kruegerzo72182> ----------------------------------------------------------------------
    
    // <hauerch71498 ---------------------------------------------------------------------
            // Output to the console, Gamelogic should happen before this
            auto const &levelBuffer = level.draw();
            Highscore.SetScoreSprite(level.getScore());
            if(GameOverFlag) {
                DiagonalFadeoutShader dfs = {levelBuffer, (GameOverTime / 2.0f)}; // hoffmanncl72341
                framebuffer.blit_topleft({ 0, 0 }, dfs); // hoffmanncl72341
    
                framebuffer.blit_topleft(Highscore.GameOverPos,Highscore.getGameOverSprite());
                int c = 0;
                for(auto & i : Highscore.ScoreBoard){
    
                    i.ScorePos.x = screenWidth/2+25-c*10;
                    i.ScorePos.y = screenHeigth/2+20;
                    c++;
                    framebuffer.blit_topleft(i.ScorePos,i.getScoreSprite());
                }
            } else {
                framebuffer.blit_topleft({ 0, 0 }, levelBuffer); // hoffmanncl72341
                for(auto & i : Highscore.ScoreBoard){
                    framebuffer.blit_topleft(i.ScorePos,i.getScoreSprite());
                }
            }
    // hauerch71498> ---------------------------------------------------------------------
            framebuffer.blit_topleft({ 3, 3 },player_.getLivesSprite());
            // kruegerzo72182>
            // <hoffmanncl72341
            platform.render(framebuffer);
    
            ++frame;
            time_elapsed += frame_time;
        }
    };
    
    int run(Platform &platform)
    {
        GameLoop gameloop;
    // hoffmanncl72341> ---------------------------------------------------------------------
    
    // <kruegerzo72182 ----------------------------------------------------------------------
        // add the player
        Player player(15, 15);
    
        // build the level layout
        Level level1(screenWidth, screenHeigth, player);
        // adds a Wall to the level (length, thickness, position X, position Y, orientation)
        // buildings (global function, see on top)
        addBuilding(100, 100, 20, level1);
        addBuilding(130, 100, 25, level1);
        addBuilding(100, 130, 20, level1);
        addBuilding(135, 135, 30, level1);
        addBuilding(135, 165, 20, level1);
        addBuilding(10, 200, 15, level1);
        addBuilding(285, 270, 15, level1);
        // adds a scenery object to the level (position X, position Y, scenerytype)
        level1.addScenery({ 150, 80 }, SceneryType::Dead_Tree);
        level1.addScenery({ 50, 200 }, SceneryType::Dead_Tree);
        level1.addScenery({ 280, 290 }, SceneryType::Dead_Tree);
        level1.addScenery({ 200, 220 }, SceneryType::Dead_Tree);
        level1.addScenery({ 140, 240 }, SceneryType::Rock);
        level1.addScenery({ 40, 15 }, SceneryType::Rock);
        level1.addScenery({ 270, 65 }, SceneryType::Rock);
        level1.addScenery({ 230, 135 }, SceneryType::Rock);
        level1.addScenery({ 30, 90 }, SceneryType::Rock);
        level1.addScenery({ 100, 40 }, SceneryType::Rubble);
        level1.addScenery({ 250, 190 }, SceneryType::Rubble);
        level1.addScenery({ 60, 270 }, SceneryType::Rubble);
        level1.addScenery({ 205, 250 }, SceneryType::Rubble);
        level1.addScenery({ 200, 100 }, SceneryType::Bush);
        level1.addScenery({ 180, 280 }, SceneryType::Bush);
        level1.addScenery({ 240, 275 }, SceneryType::Bush);
        level1.addScenery({ 270, 240 }, SceneryType::Bush);
        level1.addScenery({ 100, 250 }, SceneryType::Bush);
        level1.addScenery({ 280, 165 }, SceneryType::Bush);
        level1.addScenery({ 245, 25 }, SceneryType::Bush);
    
        // add enemies to the level
        level1.addEnemy(std::make_unique<Tank>(Tank(50, 150, direction::BACK, 0)));
        level1.addEnemy(std::make_unique<Tank>(Tank(200, 160, direction::LEFT, 0)));
        level1.fillTrooperSpawner(static_cast<float>(trooperSpawnX), static_cast<float>(trooperSpawnY), 3);
    // kruegerzo72182> ----------------------------------------------------------------------
    
    // <hoffmanncl72341 ---------------------------------------------------------------------
        while(true) {
            platform.frame([&](FloatSeconds const &frame_time) {
                gameloop.run(platform, frame_time, level1, player);
            });
        }
        return 0;
    }
    
    int main()
    {
        auto platform = Platform_Win32Console::init();
        run(platform);
        platform.exit();
    }
    // hoffmanncl72341> ---------------------------------------------------------------------