diff --git a/Faceball2030/assets/enemies/bullet.png b/Faceball2030/assets/enemies/bullet.png index 80784ff..5396b21 100644 Binary files a/Faceball2030/assets/enemies/bullet.png and b/Faceball2030/assets/enemies/bullet.png differ diff --git a/Faceball2030/main.cpp b/Faceball2030/main.cpp index 67df1c6..bcc21e8 100644 --- a/Faceball2030/main.cpp +++ b/Faceball2030/main.cpp @@ -4,6 +4,7 @@ #include #include #include "main.h" +#include using namespace olc; @@ -18,6 +19,18 @@ Enemy::Enemy(EnemyID id,vec3d pos,float rot,float radius) } } +EnemyID Enemy::GetID() { + return id; +} + +void Enemy::Hurt() { + health--; +} + +bool Enemy::isDead() { + return health <= 0; +} + void FaceBall::InitializeEnemyData() { enemyData[EnemyID::NONE] = { "VOID",undefined,BLACK }; enemyData[EXIT] = { "EXIT",undefined,GREEN }; @@ -33,6 +46,15 @@ void FaceBall::InitializeEnemyData() { enemyData[AREA_MAP] = { "Map",undefined,GREEN }; } +void FaceBall::InitializeBulletColors() { + green_bullet = bullet; + for (Triangle& t : green_bullet.tris) { + t.col[0] = GREEN; + t.col[1] = GREEN; + t.col[2] = GREEN; + } +} + void FaceBall::LoadLevel(int level) { this->level = level; @@ -540,9 +562,10 @@ void FaceBall::RenderMesh(mat4x4&matView,std::vector&vecTrianglesToRas float colorMult = (dist < 2 ? std::sinf(0.75 * dist + PI / 2) * 4 :1); float colorMult2 = (dist2 < 2 ? std::sinf(0.75 * dist2 + PI / 2) * 4 : 1); float colorMult3 = (dist3 < 2 ? std::sinf(0.75 * dist3 + PI / 2) * 4 : 1); - if (dist < 2) {triViewed.col[0] = Pixel(std::min(255, std::max((int)originalCol[0].r, (int)(originalCol[0].r * colorMult / 2))), std::min(255, std::max((int)originalCol[0].g, (int)(originalCol[0].g * colorMult))), std::min(255, std::max((int)originalCol[0].b, (int)(originalCol[0].b * colorMult / 2))));} - if (dist2 < 2) {triViewed.col[1] = Pixel(std::min(255, std::max((int)originalCol[1].r, (int)(originalCol[1].r * colorMult2 / 2))), std::min(255, std::max((int)originalCol[1].g, (int)(originalCol[1].g * colorMult2))), std::min(255, std::max((int)originalCol[1].b, (int)(originalCol[1].b * colorMult2 / 2))));} - if (dist3 < 2) {triViewed.col[2] = Pixel(std::min(255, std::max((int)originalCol[2].r, (int)(originalCol[2].r * colorMult3 / 2))), std::min(255, std::max((int)originalCol[2].g, (int)(originalCol[2].g * colorMult3))), std::min(255, std::max((int)originalCol[2].b, (int)(originalCol[2].b * colorMult3 / 2))));} + Pixel lightCol = b.col / 2 + Pixel{ 128, 128, 128 }; + if (dist < 2) {triViewed.col[0] = Pixel(std::min(255, std::max((int)originalCol[0].r, (int)(originalCol[0].r * colorMult / float(255.f/lightCol.r)))), std::min(255, std::max((int)originalCol[0].g, (int)(originalCol[0].g * colorMult / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[0].b, (int)(originalCol[0].b * colorMult / float(255.f / lightCol.b)))));} + if (dist2 < 2) {triViewed.col[1] = Pixel(std::min(255, std::max((int)originalCol[1].r, (int)(originalCol[1].r * colorMult2 / float(255.f / lightCol.r)))), std::min(255, std::max((int)originalCol[1].g, (int)(originalCol[1].g * colorMult2 / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[1].b, (int)(originalCol[1].b * colorMult2 / float(255.f / lightCol.b)))));} + if (dist3 < 2) {triViewed.col[2] = Pixel(std::min(255, std::max((int)originalCol[2].r, (int)(originalCol[2].r * colorMult3 / float(255.f / lightCol.r)))), std::min(255, std::max((int)originalCol[2].g, (int)(originalCol[2].g * colorMult3 / float(255.f / lightCol.g)))), std::min(255, std::max((int)originalCol[2].b, (int)(originalCol[2].b * colorMult3 / float(255.f / lightCol.b)))));} } //triViewed.col = triTransformed.col; @@ -631,12 +654,12 @@ void FaceBall::RenderWorld() { for (auto& obj : objects) { RenderMesh(matView,vecTrianglesToRaster,obj); } - for (auto& bullet : bullets) { - RenderMesh(matView, vecTrianglesToRaster, bullet); - } for (auto& enemy : enemies) { RenderMesh(matView, vecTrianglesToRaster, enemy); } + for (auto& bullet : bullets) { + RenderMesh(matView, vecTrianglesToRaster, bullet); + } //std::sort(vecTrianglesToRaster.begin(),vecTrianglesToRaster.end(),[](triangle&t1,triangle&t2){return (t1.p[0].z+t1.p[1].z+t1.p[2].z)/3.0f>(t2.p[0].z+t2.p[1].z+t2.p[2].z)/3.0f;}); ClearBuffer(BLACK, true); @@ -726,7 +749,7 @@ void FaceBall::HandleKeys(float fElapsedTime) { else { pitch = 0; if (GetMouse(0).bPressed) { - bullets.push_back({ bullet,{player.GetPos().x,player.GetPos().y - 0.15f, player.GetPos().z},fYaw,0.125f,{shotSpd * std::cosf(fYaw),shotSpd * std::sinf(fYaw)} }); + bullets.push_back({ green_bullet,{player.GetPos().x,player.GetPos().y - 0.15f, player.GetPos().z},fYaw,0.125f,{shotSpd * std::cosf(fYaw),shotSpd * std::sinf(fYaw)},GREEN,true }); } } if (GetKey(W).bHeld) { @@ -828,14 +851,38 @@ bool FaceBall::OnUserCreate() mapFloor.texture = floor_tex; InitializeEnemyData(); + InitializeBulletColors(); LoadLevel(1); return true; } +int FaceBall::CheckEnemyCollision(vec3d movementVector, vf2d pos, float radius) { + vf2d newpos = { pos.x + movementVector.x,pos.y + movementVector.z }; + for (int i = 0; i < game->enemies.size();i++) { + Enemy& e = game->enemies[i]; + float dist = std::sqrtf(std::powf(newpos.x - e.pos.x, 2) + std::powf(newpos.y - e.pos.z, 2)); + if (dist < radius + e.radius) { + return i; + } + } + return -1; +} + bool Bullet::Update(float fElapsedTime) { vec3d adjustedSpd = { spd.x * fElapsedTime,0,spd.y * fElapsedTime }; + if (friendly) { + int collided_enemy = FaceBall::CheckEnemyCollision(adjustedSpd, { pos.x,pos.z }, 0.1); + if (collided_enemy!=-1) { + Enemy& enemy = game->enemies[collided_enemy]; + enemy.Hurt(); + if (enemy.isDead()) { + game->enemies.erase(game->enemies.begin() + collided_enemy); + } + return false; + } + } if (!FaceBall::CheckCollision(adjustedSpd, {pos.x,pos.z}, 0.05)) { pos.x += adjustedSpd.x; pos.z += adjustedSpd.z; @@ -846,6 +893,14 @@ bool Bullet::Update(float fElapsedTime) { return true; } +void FaceBall::RunEnemyAI(Enemy& e,float fElapsedTime) { + switch (e.GetID()) { + case SHOOTME: { + e.rot += 0.5 * fElapsedTime; + }break; + } +} + bool FaceBall::OnUserUpdate(float fElapsedTime) { for (std::vector::iterator it = bullets.begin(); it != bullets.end(); ++it) { @@ -857,6 +912,10 @@ bool FaceBall::OnUserUpdate(float fElapsedTime) } } } + for (std::vector::iterator it = enemies.begin(); it != enemies.end(); ++it) { + Enemy& e = *it; + RunEnemyAI(e,fElapsedTime); + } switch (mode) { case GAME: { HandleKeys(fElapsedTime); diff --git a/Faceball2030/main.h b/Faceball2030/main.h index b45b248..08e1d7a 100644 --- a/Faceball2030/main.h +++ b/Faceball2030/main.h @@ -2,6 +2,7 @@ #include "pixelGameEngine.h" #include "Editor.h" #include "geometry2d.h" +#include using namespace olc; const float PI = 3.14159f; @@ -146,6 +147,8 @@ struct Object { struct Bullet : Object{ vf2d spd = { 0,0 }; + Pixel col = GREEN; + bool friendly=true; bool Update(float fElapsedTime); }; @@ -174,6 +177,9 @@ struct Enemy : Object { float fireDelay=0; public: Enemy(EnemyID id, vec3d pos, float rot, float radius); + EnemyID GetID(); + void Hurt(); + bool isDead(); }; class FaceBall : public PixelGameEngine @@ -188,15 +194,15 @@ class FaceBall : public PixelGameEngine EnemyData GetData(EnemyID id); Decal* circle,*arrow,*YAZAWA; std::mapenemyData; + std::vectorenemies; private: - Mesh mapWalls,mapFloor,enemy_ShootMe,bullet,undefined; + Mesh mapWalls,mapFloor,enemy_ShootMe,bullet,green_bullet,undefined; Decal* dot, * enemy_ShootMe_tex,*bullet_tex,*wall_tex,*floor_tex; vi2d MAP_SIZE; std::vector>map; std::vectorobjects; std::vectorbullets; - std::vectorenemies; GAMEMODE mode=GAMEMODE::GAME; Editor editor; int level=1; @@ -246,8 +252,11 @@ class FaceBall : public PixelGameEngine bool OnUserUpdate(float fElapsedTime) override; void OnTextEntryComplete(const std::string& sText) override; void InitializeEnemyData(); + void InitializeBulletColors(); void LoadLevel(int level); void RenderMesh(mat4x4&matView, std::vector&vecTrianglesToRaster,Object&o); + void RunEnemyAI(Enemy& e,float fElapsedTime); public: static bool CheckCollision(vec3d movementVector,vf2d pos,float radius); + static int CheckEnemyCollision(vec3d movementVector, vf2d pos, float radius); }; \ No newline at end of file