|
|
|
@ -4,6 +4,7 @@ |
|
|
|
|
#include <strstream> |
|
|
|
|
#include <algorithm> |
|
|
|
|
#include "main.h" |
|
|
|
|
#include <optional> |
|
|
|
|
|
|
|
|
|
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<Triangle>&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<Bullet>::iterator it = bullets.begin(); it != bullets.end(); ++it) { |
|
|
|
@ -857,6 +912,10 @@ bool FaceBall::OnUserUpdate(float fElapsedTime) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (std::vector<Enemy>::iterator it = enemies.begin(); it != enemies.end(); ++it) { |
|
|
|
|
Enemy& e = *it; |
|
|
|
|
RunEnemyAI(e,fElapsedTime); |
|
|
|
|
} |
|
|
|
|
switch (mode) { |
|
|
|
|
case GAME: { |
|
|
|
|
HandleKeys(fElapsedTime); |
|
|
|
|