Explosion death gradient overlay.

linux_template
sigonasr2 2 years ago
parent cf4ed30867
commit 2016053c6e
  1. 55
      Faceball2030/main.cpp
  2. 3
      Faceball2030/main.h

@ -134,6 +134,7 @@ void FaceBall::LoadLevel(int level)
this->level = level; this->level = level;
restingTriangleYDepth = 0.f; restingTriangleYDepth = 0.f;
exitWallsCleared = false; exitWallsCleared = false;
hudShakeTime = 0;
std::vector<std::vector<Tile>>mapData = editor.LoadLevel(level); std::vector<std::vector<Tile>>mapData = editor.LoadLevel(level);
MAP_SIZE = { (int)mapData[0].size(),(int)mapData.size() }; MAP_SIZE = { (int)mapData[0].size(),(int)mapData.size() };
map.clear(); map.clear();
@ -227,7 +228,7 @@ void FaceBall::LoadLevel(int level)
MapWallsObjectIndex = objects.size()-1; MapWallsObjectIndex = objects.size()-1;
objects.push_back({ mapFloor,{0,0,0},0,0 }); objects.push_back({ mapFloor,{0,0,0},0,0 });
//objects.push_back({ game->mapExit,{(float)exitCoords.x+0.5f,0,(float)exitCoords.y+0.5f},0,0.4f }); //objects.push_back({ game->mapExit,{(float)exitCoords.x+0.5f,0,(float)exitCoords.y+0.5f},0,0.4f });
exit = { game->mapExit,{(float)exitCoords.x + 0.5f,0,(float)exitCoords.y + 0.5f},0,0.4f }; exit = { game->mapExit,{(float)exitCoords.x + 0.5f,0.02f,(float)exitCoords.y + 0.5f},0,0.4f };
} }
bool FaceBall::CheckCollision(vec3d movementVector,vf2d pos,float radius){ bool FaceBall::CheckCollision(vec3d movementVector,vf2d pos,float radius){
@ -1089,6 +1090,7 @@ void FaceBall::HandleKeys(float fElapsedTime) {
e.Hurt(999); e.Hurt(999);
e.setExploded(true); e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking()); HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
} }
player.UpdatePos(Vector_Add(player.GetPos(), xMovement)); player.UpdatePos(Vector_Add(player.GetPos(), xMovement));
} }
@ -1100,6 +1102,7 @@ void FaceBall::HandleKeys(float fElapsedTime) {
e.Hurt(999); e.Hurt(999);
e.setExploded(true); e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking()); HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
} }
player.UpdatePos(Vector_Add(player.GetPos(), zMovement)); player.UpdatePos(Vector_Add(player.GetPos(), zMovement));
} }
@ -1121,6 +1124,7 @@ void FaceBall::HandleKeys(float fElapsedTime) {
e.Hurt(999); e.Hurt(999);
e.setExploded(true); e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking()); HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
} }
player.UpdatePos(Vector_Add(player.GetPos(), xMovement)); player.UpdatePos(Vector_Add(player.GetPos(), xMovement));
} }
@ -1132,6 +1136,7 @@ void FaceBall::HandleKeys(float fElapsedTime) {
e.Hurt(999); e.Hurt(999);
e.setExploded(true); e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking()); HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
} }
player.UpdatePos(Vector_Add(player.GetPos(), zMovement)); player.UpdatePos(Vector_Add(player.GetPos(), zMovement));
} }
@ -1150,6 +1155,7 @@ void FaceBall::HandleKeys(float fElapsedTime) {
e.Hurt(999); e.Hurt(999);
e.setExploded(true); e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking()); HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
} }
player.UpdatePos(Vector_Add(player.GetPos(), xMovement)); player.UpdatePos(Vector_Add(player.GetPos(), xMovement));
} }
@ -1161,6 +1167,7 @@ void FaceBall::HandleKeys(float fElapsedTime) {
e.Hurt(999); e.Hurt(999);
e.setExploded(true); e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking()); HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
} }
player.UpdatePos(Vector_Add(player.GetPos(), zMovement)); player.UpdatePos(Vector_Add(player.GetPos(), zMovement));
} }
@ -1184,6 +1191,7 @@ void FaceBall::HandleKeys(float fElapsedTime) {
e.Hurt(999); e.Hurt(999);
e.setExploded(true); e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking()); HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
} }
player.UpdatePos(Vector_Add(player.GetPos(), xMovement)); player.UpdatePos(Vector_Add(player.GetPos(), xMovement));
} }
@ -1195,6 +1203,7 @@ void FaceBall::HandleKeys(float fElapsedTime) {
e.Hurt(999); e.Hurt(999);
e.setExploded(true); e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking()); HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
} }
player.UpdatePos(Vector_Add(player.GetPos(), zMovement)); player.UpdatePos(Vector_Add(player.GetPos(), zMovement));
} }
@ -1353,6 +1362,7 @@ bool Bullet::Update(float fElapsedTime) {
else { else {
if (FaceBall::CheckPlayerCollision(adjustedSpd,{pos.x,pos.z},0.1)) { if (FaceBall::CheckPlayerCollision(adjustedSpd,{pos.x,pos.z},0.1)) {
game->HurtPlayer(shooterID,1,shooterBlinking); game->HurtPlayer(shooterID,1,shooterBlinking);
game->hudShakeTime = 0.2f;
return false; return false;
} else } else
{ {
@ -1381,9 +1391,13 @@ void FaceBall::HurtPlayer(EnemyID id,int damage,bool blinking) {
} }
lastHitBy = id; lastHitBy = id;
lastHitByBlinking = blinking; lastHitByBlinking = blinking;
screenCol = enemyData[lastHitBy].col;
} }
void FaceBall::RenderHud(float fElapsedTime) { void FaceBall::RenderHud(float fElapsedTime) {
if (hudShakeTime > 0) {
hudShakeTime -= fElapsedTime;
}
if (!GetKey(olc::D).bHeld && !GetKey(olc::A).bHeld) { if (!GetKey(olc::D).bHeld && !GetKey(olc::A).bHeld) {
hudOffsetAcc += 20 * fElapsedTime; hudOffsetAcc += 20 * fElapsedTime;
while (hudOffsetAcc >= 1) { while (hudOffsetAcc >= 1) {
@ -1490,17 +1504,26 @@ void FaceBall::RenderHud(float fElapsedTime) {
DrawStringDecal({ float(ScreenWidth() / 2 - GetTextSize(bottomText).x / 2 * 3),float(ScreenHeight() - 140.f) }, bottomText, { 96,96,255 }, { 3,6 }); DrawStringDecal({ float(ScreenWidth() / 2 - GetTextSize(bottomText).x / 2 * 3),float(ScreenHeight() - 140.f) }, bottomText, { 96,96,255 }, { 3,6 });
} }
vf2d hudAdjustment = { -32,-18 }; vf2d hudAdjustment = { -32,-18 };
if (hudShakeTime > 0) {
hudShakeAmt = std::sinf(40 * hudShakeTime);
hudAdjustment.x += hudShakeAmt * 2;
hudAdjustment.y += hudShakeAmt * 4;
}
vf2d hudLoc = { hudAdjustment.x + (hp>0?hudOffset:0),hudAdjustment.y}; vf2d hudLoc = { hudAdjustment.x + (hp>0?hudOffset:0),hudAdjustment.y};
DrawDecal(hudLoc, hud, { 1.05,1.05 }); DrawDecal(hudLoc, hud, { 1.05,1.05 });
DrawDecal(hudLoc + vf2d{ 704,56 } - hudAdjustment, life4, { 1,1 }, float(hp) / maxHP > 0.75f ? WHITE : VERY_DARK_GREEN); DrawDecal(hudLoc + vf2d{ 704+32,56+18 }, life4, { 1,1 }, float(hp) / maxHP > 0.75f ? WHITE : VERY_DARK_GREEN);
DrawDecal(hudLoc + vf2d{ 704 - 64,56 } - hudAdjustment, life3, { 1,1 }, float(hp) / maxHP > 0.34f && float(hp) / maxHP <= 0.75f ? WHITE : VERY_DARK_GREEN); DrawDecal(hudLoc + vf2d{ 704 - 64+32,56+18 }, life3, { 1,1 }, float(hp) / maxHP > 0.34f && float(hp) / maxHP <= 0.75f ? WHITE : VERY_DARK_GREEN);
DrawDecal(hudLoc + vf2d{ 704 - 128,56 } - hudAdjustment, life2, { 1,1 }, hp > 0 && float(hp) / maxHP <= 0.34f ? WHITE : VERY_DARK_GREEN); DrawDecal(hudLoc + vf2d{ 704 - 128+32,56+18 }, life2, { 1,1 }, hp > 0 && float(hp) / maxHP <= 0.34f ? WHITE : VERY_DARK_GREEN);
DrawDecal(hudLoc + vf2d{ 704 - 192,56 } - hudAdjustment, life1, { 1,1 }, hp <= 0 ? WHITE : VERY_DARK_GREEN); DrawDecal(hudLoc + vf2d{ 704 - 192+32,56+18 }, life1, { 1,1 }, hp <= 0 ? WHITE : VERY_DARK_GREEN);
if (hp > 0) { if (hp > 0) {
DrawStringDecal({ 112 + hudOffset,4 }, "Triangles: " + std::to_string(triRenderCount), BLACK, { 2,4 }); DrawStringDecal(vf2d{ 112 + hudOffset+32,4+18 }+hudAdjustment, "Triangles: " + std::to_string(triRenderCount), BLACK, { 2,4 });
std::string hudText = "Tags Left: " + std::to_string(tagsRemaining) + " Lives: " + std::to_string(lives); std::string hudText = "Tags Left: " + std::to_string(tagsRemaining) + " Lives: " + std::to_string(lives);
DrawStringPropDecal(vf2d{ hudOffset + (float)(ScreenWidth() / 2 - GetTextSizeProp(hudText).x * 3 / 2),(float)(ScreenHeight() - 64 - GetTextSizeProp(hudText).y * 6) }, hudText, WHITE, { 3,6 }); DrawStringPropDecal(vf2d{ hudOffset + (float)(ScreenWidth() / 2 - GetTextSizeProp(hudText).x * 3 / 2)+32,(float)(ScreenHeight() - 64 - GetTextSizeProp(hudText).y * 6)+18 } + hudAdjustment, hudText, WHITE, { 3,6 });
} }
GradientFillRectDecal({ 0,0 }, vf2d{ (float)ScreenWidth()/2,(float)ScreenHeight()/2 }, { (uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0) }, { (uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0) }, { (uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime > 0.2f ? 64 : 0) }, { (uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0) });
GradientFillRectDecal({ float(ScreenWidth()/2),0}, vf2d{(float)ScreenWidth() / 2,(float)ScreenHeight() / 2}, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)}, { (uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime > 0.2f ? 64 : 0) }, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)}, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)});
GradientFillRectDecal({ 0,float(ScreenHeight()/2)}, vf2d{(float)ScreenWidth() / 2,(float)ScreenHeight() / 2}, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)}, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)}, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)}, { (uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime > 0.2f ? 64 : 0) });
GradientFillRectDecal({ float(ScreenWidth()/2),float(ScreenHeight() / 2)}, vf2d{(float)ScreenWidth() / 2,(float)ScreenHeight() / 2}, { (uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime > 0.2f ? 64 : 0) }, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)}, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)}, {(uint8_t)screenCol.r,(uint8_t)screenCol.g,(uint8_t)screenCol.b,(uint8_t)(hudShakeTime>0.2f?120:hudShakeTime>0?64:0)});
FillRectDecal({ 0,0 }, vf2d{ (float)ScreenWidth(),(float)ScreenHeight() }, { (uint8_t)0,(uint8_t)0,(uint8_t)0,(uint8_t)screenAlpha }); FillRectDecal({ 0,0 }, vf2d{ (float)ScreenWidth(),(float)ScreenHeight() }, { (uint8_t)0,(uint8_t)0,(uint8_t)0,(uint8_t)screenAlpha });
} }
@ -1668,7 +1691,7 @@ void FaceBall::RunEnemyAI(Enemy& e,float fElapsedTime,int myIndex) {
t.p[1].y = 0.04f + restingTriangleYDepth; t.p[1].y = 0.04f + restingTriangleYDepth;
t.p[2].y = 0.04f + restingTriangleYDepth; t.p[2].y = 0.04f + restingTriangleYDepth;
restingTriangleYDepth += 0.000001f; restingTriangleYDepth += 0.000001f;
if (restingTriangleYDepth > 0.01f) { if (restingTriangleYDepth > 0.001f) {
restingTriangleYDepth = 0.f; restingTriangleYDepth = 0.f;
} }
} }
@ -1688,6 +1711,12 @@ void FaceBall::RunEnemyAI(Enemy& e,float fElapsedTime,int myIndex) {
vf2d movementVec = { std::cosf(e.rot) * dat.movSpd * fElapsedTime,std::sinf(e.rot) * dat.movSpd * fElapsedTime }; vf2d movementVec = { std::cosf(e.rot) * dat.movSpd * fElapsedTime,std::sinf(e.rot) * dat.movSpd * fElapsedTime };
if (-1 == CheckEnemyCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius, myIndex) && if (-1 == CheckEnemyCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius, myIndex) &&
!CheckCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius)) { !CheckCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius)) {
if (CheckPlayerCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius)) {
e.Hurt(999);
e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
}
e.pos.x += movementVec.x; e.pos.x += movementVec.x;
e.pos.z += movementVec.y; e.pos.z += movementVec.y;
} }
@ -1714,6 +1743,12 @@ void FaceBall::RunEnemyAI(Enemy& e,float fElapsedTime,int myIndex) {
vf2d movementVec = { std::cosf(e.rot) * dat.movSpd * fElapsedTime,std::sinf(e.rot) * dat.movSpd * fElapsedTime }; vf2d movementVec = { std::cosf(e.rot) * dat.movSpd * fElapsedTime,std::sinf(e.rot) * dat.movSpd * fElapsedTime };
if (-1 == CheckEnemyCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius, myIndex) && if (-1 == CheckEnemyCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius, myIndex) &&
!CheckCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius)) { !CheckCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius)) {
if (CheckPlayerCollision({ movementVec.x,0,movementVec.y }, { e.pos.x,e.pos.z }, e.radius)) {
e.Hurt(999);
e.setExploded(true);
HurtPlayer(e.GetID(), 1, e.isBlinking());
hudShakeTime = 0.6f;
}
e.pos.x += movementVec.x; e.pos.x += movementVec.x;
e.pos.z += movementVec.y; e.pos.z += movementVec.y;
if (e.CanShoot()) { if (e.CanShoot()) {
@ -1762,8 +1797,10 @@ bool FaceBall::OnUserUpdate(float fElapsedTime)
} }
switch (mode) { switch (mode) {
case GAME: { case GAME: {
if (hp > 0) {
HandleKeys(fElapsedTime); HandleKeys(fElapsedTime);
if (hp > 0) { RenderWorld(); } RenderWorld();
}
else { else {
respawnTimer -= fElapsedTime; respawnTimer -= fElapsedTime;
if (respawnTimer <= 0.0f) { if (respawnTimer <= 0.0f) {

@ -273,6 +273,8 @@ class FaceBall : public PixelGameEngine
float moveSpd = 2.0f; float moveSpd = 2.0f;
float hudOffset = 0; float hudOffset = 0;
float hudOffsetAcc = 0; float hudOffsetAcc = 0;
float hudShakeAmt = 0;
Pixel screenCol = WHITE;
float screenAlpha = 0; float screenAlpha = 0;
float respawnTimer = 0; float respawnTimer = 0;
vec3d spawnLoc = { 0,0.3,0 }; vec3d spawnLoc = { 0,0.3,0 };
@ -321,6 +323,7 @@ class FaceBall : public PixelGameEngine
public: public:
float restingTriangleYDepth = 0.f; float restingTriangleYDepth = 0.f;
std::vector<Bullet>bullets; std::vector<Bullet>bullets;
float hudShakeTime = 0;
Mesh bullet; Mesh bullet;
float shotSpd = 4.0f; float shotSpd = 4.0f;
static bool CheckCollision(vec3d movementVector,vf2d pos,float radius); static bool CheckCollision(vec3d movementVector,vf2d pos,float radius);

Loading…
Cancel
Save