From 1579e92b358d3aab481b0b31bce6bdc41972fb32 Mon Sep 17 00:00:00 2001 From: s473577 Date: Wed, 7 Feb 2024 22:46:33 +0100 Subject: [PATCH 1/5] Add random location enemy generator --- grk/project/src/ex_9_1.hpp | 57 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/grk/project/src/ex_9_1.hpp b/grk/project/src/ex_9_1.hpp index 4505308..0ba59a6 100644 --- a/grk/project/src/ex_9_1.hpp +++ b/grk/project/src/ex_9_1.hpp @@ -26,6 +26,8 @@ #include "../ParticleSystem.h" #include "Camera.h" +#include + #ifndef EX_9_1_HPP #define EX_9_1_HPP @@ -309,12 +311,61 @@ void createSolarSystem(glm::vec3 sunPos, GLuint sunTexId, float sunScale, float* planets.push_back(planet); } } +bool isFarFromReferencePoints(float x, float y, float z, const std::vector& referencePoints) { + float minDistance = 10.0f; + + glm::vec3 currentPoint(x, y, z); + + auto checkDistance = [currentPoint, minDistance](const glm::vec3& referencePoint) { + return glm::distance(currentPoint, referencePoint) > minDistance; + }; + + for (const auto& referencePoint : referencePoints) { + if (!checkDistance(referencePoint)) { + return false; // JeÅ›li choć jeden punkt jest zbyt blisko, zwracamy false + } + } + + return true; // JeÅ›li wszystkie punkty sÄ… wystarczajÄ…co daleko, zwracamy true +} void createEnemies() { - enemies.push_back(new Enemy(100.0f,100.0f, glm::mat4(1.0f), 1.0f, 5.0f)); - enemies.push_back(new Enemy(100.0f,100.0f, glm::translate(glm::mat4(1.0f) , glm::vec3(1.f,1.f,1.f)), 1.0f, 5.0f)); - enemies.push_back(new Enemy(100.0f,100.0f, glm::translate(glm::mat4(1.0f), glm::vec3(-1.f, 2.f, -0.9f)), 1.0f, 5.0f)); + //enemies.push_back(new Enemy(100.0f,100.0f, glm::mat4(1.0f), 1.0f, 5.0f)); + //enemies.push_back(new Enemy(100.0f,100.0f, glm::translate(glm::mat4(1.0f) , glm::vec3(1.f,1.f,1.f)), 1.0f, 5.0f)); + //enemies.push_back(new Enemy(100.0f,100.0f, glm::translate(glm::mat4(1.0f), glm::vec3(-1.f, 2.f, -0.9f)), 1.0f, 5.0f)); + + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution disX(-30.0f, 180.0f); + std::uniform_real_distribution disY(-50.0f, 60.0f); + std::uniform_real_distribution disZ(-30.0f, 210.0f); + + + std::vector referencePoints = { + glm::vec3(0, 2, 0), + glm::vec3(150, 5, 0), + glm::vec3(-20, -30, 50), + glm::vec3(100, 20, -50), + glm::vec3(0, 52, 200), + glm::vec3(150, 55, 200), + glm::vec3(-20, 20, 250), + glm::vec3(100, 70, 150) + }; + for (int i = 0; i < 20; ++i) { + float randomX, randomY, randomZ; + + do { + randomX = disX(gen); + randomY = disY(gen); + randomZ = disZ(gen); + } while (!isFarFromReferencePoints(randomX, randomY, randomZ, referencePoints)); + + glm::mat4 randomModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(randomX, randomY, randomZ)); + + enemies.push_back(new Enemy(100.0f, 100.0f, randomModelMatrix, 1.0f, 5.0f)); + } + //obiekty do ktorych bedzie sprawdzana kolizja dla pociskow enemy gameEntities.push_back(spaceship); From 91c2dca35b735a81ebd3c08ee7c4a2defb1e3100 Mon Sep 17 00:00:00 2001 From: s473577 Date: Wed, 7 Feb 2024 22:54:19 +0100 Subject: [PATCH 2/5] Change spaceship starting position and lower nitro consumption --- grk/project/Spaceship.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grk/project/Spaceship.h b/grk/project/Spaceship.h index 6b615f2..0bc5a56 100644 --- a/grk/project/Spaceship.h +++ b/grk/project/Spaceship.h @@ -41,7 +41,7 @@ public: float turbo = 1.0f; float turboMAX = 1.0f; - glm::vec3 spaceshipPos /*= glm::vec3(0.065808f, 1.250000f, -2.189549f)*/; + glm::vec3 spaceshipPos = glm::vec3(4.065808f, 10.250000f, -20.189549f); glm::vec3 spaceshipDir = glm::vec3(-0.490263f, 0.000000f, 0.871578f); glm::vec3 spotlightPos = glm::vec3(0, 0, 0); @@ -225,7 +225,7 @@ public: if (w == GLFW_PRESS) { if (shiftState == GLFW_PRESS) { - turbo = glm::max(0.0f, turbo - 0.004f * deltaTime * 60); + turbo = glm::max(0.0f, turbo - 0.003f * deltaTime * 60); if (turbo == 0.0f) { shiftState = GLFW_RELEASE; moveSpeed = 0.05f * deltaTime * 60; From 6737f14356c23858a247bcec42d9f5dcccb44678 Mon Sep 17 00:00:00 2001 From: s473577 Date: Wed, 7 Feb 2024 23:44:53 +0100 Subject: [PATCH 3/5] Add respawn for spaceship and enemies --- grk/project/Bullet.h | 9 +++++---- grk/project/Enemy.h | 11 +++++++++-- grk/project/GameEntity.h | 7 +++++++ grk/project/Spaceship.h | 8 ++++++++ grk/project/src/ex_9_1.hpp | 13 ++++++++++--- 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/grk/project/Bullet.h b/grk/project/Bullet.h index bbfea5b..7e3c2e8 100644 --- a/grk/project/Bullet.h +++ b/grk/project/Bullet.h @@ -62,7 +62,6 @@ public: for (const auto& entity : gameEntities) { glm::mat4 entityModelMatrix = entity->getModelMatrix(); - // SprawdŸ kolizjê AABB miêdzy pociskiem a obiektem z wektora gameEntities if (checkAABBCollision(bulletModelMatrix, entityModelMatrix)) { entity->applyDamage(attackerDmg); return true; @@ -72,12 +71,14 @@ public: return false; } bool checkAABBCollision(const glm::mat4& obj1ModelMatrix, const glm::mat4& obj2ModelMatrix) { - // Pobierz rozmiary obiektów z ich macierzy modelu + glm::vec3 obj1Min = glm::vec3(obj1ModelMatrix * glm::vec4(-0.5f, -0.5f, -0.5f, 1.0f)); glm::vec3 obj1Max = glm::vec3(obj1ModelMatrix * glm::vec4(0.5f, 0.5f, 0.5f, 1.0f)); - glm::vec3 obj2Min = glm::vec3(obj2ModelMatrix * glm::vec4(-0.5f, -0.5f, -0.5f, 1.0f)); - glm::vec3 obj2Max = glm::vec3(obj2ModelMatrix * glm::vec4(0.5f, 0.5f, 0.5f, 1.0f)); + /*glm::vec3 obj2Min = glm::vec3(obj2ModelMatrix * glm::vec4(-0.5f, -0.5f, -0.5f, 1.0f)); + glm::vec3 obj2Max = glm::vec3(obj2ModelMatrix * glm::vec4(0.5f, 0.5f, 0.5f, 1.0f));*/ + glm::vec3 obj2Min = glm::vec3(obj2ModelMatrix * glm::vec4(-0.6f, -0.6f, -0.6f, 1.0f)); + glm::vec3 obj2Max = glm::vec3(obj2ModelMatrix * glm::vec4(0.6f, 0.6f, 0.6f, 1.0f)); // SprawdŸ kolizjê wzd³u¿ trzech osi (x, y, z) bool collisionX = obj1Max.x >= obj2Min.x && obj1Min.x <= obj2Max.x; diff --git a/grk/project/Enemy.h b/grk/project/Enemy.h index 6249fc7..2fd7fae 100644 --- a/grk/project/Enemy.h +++ b/grk/project/Enemy.h @@ -12,6 +12,7 @@ private: std::list bullets; float lastShootTime = 0.f; float shootInterval = 0.3f; + glm::mat4 initialModelMatrix; public: glm::mat4 modelMatrix; @@ -21,6 +22,7 @@ public: : aggroRange(initialAggroRange), modelMatrix(initialModelMatrix), + initialModelMatrix(initialModelMatrix), GameEntity(currHp, initialHp, initialDmg) {} @@ -70,7 +72,11 @@ public: { return modelMatrix; } - + void respawn() override { + this->currentHP = this->maxHP; + this->modelMatrix = this->initialModelMatrix; + return; + } private: void requestShoot(float time) { if (canShoot(time)) { @@ -84,7 +90,8 @@ private: void shoot(float time) { Spaceship* spaceship = Spaceship::getInstance(); - glm::vec3 bulletDirection = glm::normalize(spaceship->spaceshipPos - glm::vec3(modelMatrix[3])); + //glm::vec3 bulletDirection = glm::normalize(spaceship->spaceshipPos - glm::vec3(modelMatrix[3])); + glm::vec3 bulletDirection = glm::normalize(glm::vec3(spaceship->getModelMatrix()[3]) - glm::vec3(modelMatrix[3])); //bulletDirection += glm::linearRand(glm::vec3(-0.01f), glm::vec3(0.1f)); // Modyfikacja kierunku o losowy szum this->bullets.push_back(Bullet::createSimpleBullet(bulletDirection, this->modelMatrix[3], time)); this->lastShootTime = time; diff --git a/grk/project/GameEntity.h b/grk/project/GameEntity.h index 7a5c189..c8019f5 100644 --- a/grk/project/GameEntity.h +++ b/grk/project/GameEntity.h @@ -19,5 +19,12 @@ public: }; virtual glm::vec3 getPosition() const = 0; virtual glm::mat4 getModelMatrix() = 0; + virtual bool isAlive() { + if (this->currentHP <= 0) { + return false; + } + return true; + }; + virtual void respawn() = 0; }; diff --git a/grk/project/Spaceship.h b/grk/project/Spaceship.h index 0bc5a56..3d5769b 100644 --- a/grk/project/Spaceship.h +++ b/grk/project/Spaceship.h @@ -386,4 +386,12 @@ public: return cameraMatrix; } + + void respawn() override { + this->currentHP = this->maxHP; + this->turbo = this->turboMAX; + this->spaceshipPos = glm::vec3(4.065808f, 10.250000f, -20.189549f); + return; + } + }; \ No newline at end of file diff --git a/grk/project/src/ex_9_1.hpp b/grk/project/src/ex_9_1.hpp index 0ba59a6..0f90fb4 100644 --- a/grk/project/src/ex_9_1.hpp +++ b/grk/project/src/ex_9_1.hpp @@ -260,6 +260,13 @@ void renderScene(GLFWwindow* window) glm::mat4 viewMatrix = Core::createViewMatrix(spaceship->cameraPos, spaceship->cameraDir, cameraUp); spaceship->renderParticles(programParticle, viewMatrix, Core::createPerspectiveMatrix(), time); + if(!spaceship->isAlive()){ + spaceship->respawn(); + for (const auto& enemy : enemies) { + enemy->respawn(); + } + + } renderHUD(window); renderEnemies(); @@ -322,11 +329,11 @@ bool isFarFromReferencePoints(float x, float y, float z, const std::vector Date: Thu, 8 Feb 2024 00:23:07 +0100 Subject: [PATCH 4/5] Add constant enemies respawn when half of them is defeated --- grk/project/Enemy.h | 7 +- grk/project/GameEntity.h | 3 +- grk/project/src/ex_9_1.hpp | 128 +++++++++++++++++++++---------------- 3 files changed, 81 insertions(+), 57 deletions(-) diff --git a/grk/project/Enemy.h b/grk/project/Enemy.h index 2fd7fae..8d0eda4 100644 --- a/grk/project/Enemy.h +++ b/grk/project/Enemy.h @@ -12,17 +12,20 @@ private: std::list bullets; float lastShootTime = 0.f; float shootInterval = 0.3f; - glm::mat4 initialModelMatrix; + float initAggroRange; public: glm::mat4 modelMatrix; float aggroRange; + glm::mat4 initialModelMatrix; + Enemy(float currHp,float initialHp, glm::mat4 initialModelMatrix, float initialDmg, float initialAggroRange) : aggroRange(initialAggroRange), modelMatrix(initialModelMatrix), initialModelMatrix(initialModelMatrix), + initAggroRange(initialAggroRange), GameEntity(currHp, initialHp, initialDmg) {} @@ -75,6 +78,8 @@ public: void respawn() override { this->currentHP = this->maxHP; this->modelMatrix = this->initialModelMatrix; + this->aggroRange = this->initAggroRange; + this->dmg = this->initDMG; return; } private: diff --git a/grk/project/GameEntity.h b/grk/project/GameEntity.h index c8019f5..0715193 100644 --- a/grk/project/GameEntity.h +++ b/grk/project/GameEntity.h @@ -7,9 +7,10 @@ public: float currentHP; float dmg; float maxHP; + float initDMG; GameEntity(float currentHP, float maxHP, float initialDmg) - : currentHP(currentHP), maxHP(maxHP), dmg(initialDmg) + : currentHP(currentHP), maxHP(maxHP), dmg(initialDmg),initDMG(initialDmg) { } diff --git a/grk/project/src/ex_9_1.hpp b/grk/project/src/ex_9_1.hpp index 0f90fb4..2f02156 100644 --- a/grk/project/src/ex_9_1.hpp +++ b/grk/project/src/ex_9_1.hpp @@ -95,6 +95,17 @@ Spaceship* spaceship = Spaceship::getInstance(); void createSolarSystem(glm::vec3 sunPos, GLuint sunTexId,float sunScale, float* planetSizes, int numberOfPlanets, float planetsDistance, float planetSpeedCoef); Core::SpriteRenderer* spriteRenderer; +const int ENEMY_COUNT = 20; +std::vector referencePoints = { + glm::vec3(0, 2, 0), + glm::vec3(150, 5, 0), + glm::vec3(-20, -30, 50), + glm::vec3(100, 20, -50), + glm::vec3(0, 52, 200), + glm::vec3(150, 55, 200), + glm::vec3(-20, 20, 250), + glm::vec3(100, 70, 150) +}; void updateDeltaTime(float time) { if (lastTime < 0) { lastTime = time; @@ -139,8 +150,67 @@ void renderHUD(GLFWwindow* window) { programSpriteBar); glEnable(GL_DEPTH_TEST); } +bool isFarFromReferencePoints(float x, float y, float z, const std::vector& referencePoints) { + float minDistance = 10.0f; + + glm::vec3 currentPoint(x, y, z); + + auto checkDistance = [currentPoint, minDistance](const glm::vec3& referencePoint) { + return glm::distance(currentPoint, referencePoint) > minDistance; + }; + + for (const auto& referencePoint : referencePoints) { + if (!checkDistance(referencePoint)) { + return false; + } + } + + return true; +} +glm::mat4 generateRandomMatrix(const glm::mat4& startMatrix) { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_real_distribution disX(-30.0f, 180.0f); + std::uniform_real_distribution disY(-50.0f, 60.0f); + std::uniform_real_distribution disZ(-30.0f, 210.0f); + float randomX, randomY, randomZ; + + do { + randomX = disX(gen); + randomY = disY(gen); + randomZ = disZ(gen); + } while (!isFarFromReferencePoints(randomX, randomY, randomZ, referencePoints)); + + glm::mat4 randomModelMatrix = glm::translate(startMatrix, glm::vec3(randomX, randomY, randomZ)); + + + return randomModelMatrix; +} void renderEnemies() { - + int counter = 0; + glUseProgram(program); + for (const auto& enemy : enemies) { + if (enemy->isAlive()) { + enemy->attack(spaceship->spaceshipPos, glfwGetTime()); + enemy->renderBullets(glfwGetTime(), program, gameEntities); + } + else { + counter++; + } + + } + if (counter >= ENEMY_COUNT / 2) { + for (const auto& enemy : enemies) { + if (!enemy->isAlive()) { + enemy->initialModelMatrix = generateRandomMatrix(enemy->getModelMatrix()); + enemy->respawn(); + enemy->aggroRange *= 1.1; + enemy->dmg *= 1.2; + } + } + counter = 0; + } + glUseProgram(programSpriteBar); for (const auto& enemy : enemies) { if (enemy->isAlive()) { @@ -163,15 +233,6 @@ void renderEnemies() { } } - glUseProgram(program); - for (const auto& enemy : enemies) { - if (enemy->isAlive()) { - enemy->attack(spaceship->spaceshipPos, glfwGetTime()); - enemy->renderBullets(glfwGetTime(), program, gameEntities); - } - - } - } TextureTuple getRandomPlanetTexture() { int textureIndex = rand() % planetTextures.size(); @@ -318,58 +379,15 @@ void createSolarSystem(glm::vec3 sunPos, GLuint sunTexId, float sunScale, float* planets.push_back(planet); } } -bool isFarFromReferencePoints(float x, float y, float z, const std::vector& referencePoints) { - float minDistance = 10.0f; - - glm::vec3 currentPoint(x, y, z); - - auto checkDistance = [currentPoint, minDistance](const glm::vec3& referencePoint) { - return glm::distance(currentPoint, referencePoint) > minDistance; - }; - - for (const auto& referencePoint : referencePoints) { - if (!checkDistance(referencePoint)) { - return false; - } - } - - return true; -} - void createEnemies() { //enemies.push_back(new Enemy(100.0f,100.0f, glm::mat4(1.0f), 1.0f, 5.0f)); //enemies.push_back(new Enemy(100.0f,100.0f, glm::translate(glm::mat4(1.0f) , glm::vec3(1.f,1.f,1.f)), 1.0f, 5.0f)); //enemies.push_back(new Enemy(100.0f,100.0f, glm::translate(glm::mat4(1.0f), glm::vec3(-1.f, 2.f, -0.9f)), 1.0f, 5.0f)); - std::random_device rd; - std::mt19937 gen(rd()); - std::uniform_real_distribution disX(-30.0f, 180.0f); - std::uniform_real_distribution disY(-50.0f, 60.0f); - std::uniform_real_distribution disZ(-30.0f, 210.0f); - - - std::vector referencePoints = { - glm::vec3(0, 2, 0), - glm::vec3(150, 5, 0), - glm::vec3(-20, -30, 50), - glm::vec3(100, 20, -50), - glm::vec3(0, 52, 200), - glm::vec3(150, 55, 200), - glm::vec3(-20, 20, 250), - glm::vec3(100, 70, 150) - }; - for (int i = 0; i < 20; ++i) { - float randomX, randomY, randomZ; - - do { - randomX = disX(gen); - randomY = disY(gen); - randomZ = disZ(gen); - } while (!isFarFromReferencePoints(randomX, randomY, randomZ, referencePoints)); - - glm::mat4 randomModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(randomX, randomY, randomZ)); + for (int i = 0; i < ENEMY_COUNT; ++i) { + glm::mat4 randomModelMatrix = generateRandomMatrix(glm::mat4(1.0f)); enemies.push_back(new Enemy(100.0f, 100.0f, randomModelMatrix, 1.0f, 8.0f)); } From 5d2405774bd3943abc81275ad5eb30ca92f59b4c Mon Sep 17 00:00:00 2001 From: s473577 Date: Thu, 8 Feb 2024 00:43:24 +0100 Subject: [PATCH 5/5] Add starter enemy --- grk/project/Bullet.h | 6 ++---- grk/project/src/ex_9_1.hpp | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/grk/project/Bullet.h b/grk/project/Bullet.h index 7e3c2e8..0d92cec 100644 --- a/grk/project/Bullet.h +++ b/grk/project/Bullet.h @@ -75,10 +75,8 @@ public: glm::vec3 obj1Min = glm::vec3(obj1ModelMatrix * glm::vec4(-0.5f, -0.5f, -0.5f, 1.0f)); glm::vec3 obj1Max = glm::vec3(obj1ModelMatrix * glm::vec4(0.5f, 0.5f, 0.5f, 1.0f)); - /*glm::vec3 obj2Min = glm::vec3(obj2ModelMatrix * glm::vec4(-0.5f, -0.5f, -0.5f, 1.0f)); - glm::vec3 obj2Max = glm::vec3(obj2ModelMatrix * glm::vec4(0.5f, 0.5f, 0.5f, 1.0f));*/ - glm::vec3 obj2Min = glm::vec3(obj2ModelMatrix * glm::vec4(-0.6f, -0.6f, -0.6f, 1.0f)); - glm::vec3 obj2Max = glm::vec3(obj2ModelMatrix * glm::vec4(0.6f, 0.6f, 0.6f, 1.0f)); + glm::vec3 obj2Min = glm::vec3(obj2ModelMatrix * glm::vec4(-0.5f, -0.5f, -0.5f, 1.0f)); + glm::vec3 obj2Max = glm::vec3(obj2ModelMatrix * glm::vec4(0.5f, 0.5f, 0.5f, 1.0f)); // SprawdŸ kolizjê wzd³u¿ trzech osi (x, y, z) bool collisionX = obj1Max.x >= obj2Min.x && obj1Min.x <= obj2Max.x; diff --git a/grk/project/src/ex_9_1.hpp b/grk/project/src/ex_9_1.hpp index 2f02156..384d6c3 100644 --- a/grk/project/src/ex_9_1.hpp +++ b/grk/project/src/ex_9_1.hpp @@ -385,6 +385,7 @@ void createEnemies() { //enemies.push_back(new Enemy(100.0f,100.0f, glm::translate(glm::mat4(1.0f) , glm::vec3(1.f,1.f,1.f)), 1.0f, 5.0f)); //enemies.push_back(new Enemy(100.0f,100.0f, glm::translate(glm::mat4(1.0f), glm::vec3(-1.f, 2.f, -0.9f)), 1.0f, 5.0f)); + enemies.push_back(new Enemy(100.0f, 100.0f, glm::translate(glm::translate(glm::mat4(1.0f), spaceship->getPosition()), glm::vec3(1.f, 1.f, 2.f)), 1.0f, 5.0f)); for (int i = 0; i < ENEMY_COUNT; ++i) { glm::mat4 randomModelMatrix = generateRandomMatrix(glm::mat4(1.0f));