Select Git revision
-
hauerch71498 authored
Chris
hauerch71498 authoredChris
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> ---------------------------------------------------------------------