open and closing of powerup capsule.

linux_template
sigonasr2 2 years ago
parent 5e9fed6992
commit 78b7aef32f
  1. 55
      Faceball2030/main.cpp
  2. 3
      Faceball2030/main.h

@ -158,6 +158,7 @@ bool Powerup::Update(float fElapsedTime) {
aliveTime += fElapsedTime;
colorCycle = std::sinf(10 * aliveTime);
col = game->powerupColorData[type] * colorCycle;
opened = false; //Open state is false until a player causes it to open.
return true;
}
@ -188,6 +189,7 @@ void FaceBall::LoadLevel(int level)
objects.clear();
bullets.clear();
enemies.clear();
powerups.clear();
exitCoords = { 0,0 };
for (int y = 0; y < MAP_SIZE.y; y++) {
std::vector<MapSquare>row;
@ -835,7 +837,7 @@ void FaceBall::RenderPowerupMesh(mat4x4& matView, std::vector<Triangle>& vecTria
rotMat = Matrix_MultiplyMatrix(rotMat, flipMat);
}
localMat = Matrix_MultiplyMatrix(localMat, rotMat);
mat4x4 matTrans = Matrix_MakeTranslation(p.pos.x, p.pos.y+(i?0.375f:0), p.pos.z);
mat4x4 matTrans = Matrix_MakeTranslation(p.pos.x, p.pos.y+(i?p.opened?0.65f:0.375f:p.opened?-0.125f:0), p.pos.z);
localMat = Matrix_MultiplyMatrix(localMat, matTrans);
triTransformed.p[0] = Matrix_MultiplyVector(localMat, tri.p[0]);
@ -1292,7 +1294,8 @@ void FaceBall::HandleKeys(float fElapsedTime) {
freeRoamCamera = Vector_Add(freeRoamCamera, vLeftStrafe);
}
else {
if (!CheckCollision({ vLeftStrafe.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())) {
if (!CheckCollision({ vLeftStrafe.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())&&
CheckPowerupCollision({ vLeftStrafe.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())==-1) {
vec3d xMovement{ vLeftStrafe.x,0,0 };
int enemyCollisionIndex = CheckExplosiveEnemyCollision(xMovement, { player.GetPos().x,player.GetPos().z }, player.GetRadius());
if (enemyCollisionIndex != -1) {
@ -1304,7 +1307,8 @@ void FaceBall::HandleKeys(float fElapsedTime) {
}
player.UpdatePos(Vector_Add(player.GetPos(), xMovement));
}
if (!CheckCollision({ 0,0,vLeftStrafe.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())) {
if (!CheckCollision({ 0,0,vLeftStrafe.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) &&
CheckPowerupCollision({ 0,0,vLeftStrafe.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) == -1) {
vec3d zMovement{ 0,0,vLeftStrafe.z };
int enemyCollisionIndex = CheckExplosiveEnemyCollision(zMovement, { player.GetPos().x,player.GetPos().z }, player.GetRadius());
if (enemyCollisionIndex != -1) {
@ -1326,7 +1330,8 @@ void FaceBall::HandleKeys(float fElapsedTime) {
freeRoamCamera = Vector_Add(freeRoamCamera, vRightStrafe);
}
else {
if (!CheckCollision({ vRightStrafe.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())) {
if (!CheckCollision({ vRightStrafe.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) &&
CheckPowerupCollision({ vRightStrafe.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) == -1) {
vec3d xMovement{ vRightStrafe.x,0,0 };
int enemyCollisionIndex = CheckExplosiveEnemyCollision(xMovement, { player.GetPos().x,player.GetPos().z }, player.GetRadius());
if (enemyCollisionIndex != -1) {
@ -1338,7 +1343,8 @@ void FaceBall::HandleKeys(float fElapsedTime) {
}
player.UpdatePos(Vector_Add(player.GetPos(), xMovement));
}
if (!CheckCollision({ 0,0,vRightStrafe.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())) {
if (!CheckCollision({ 0,0,vRightStrafe.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) &&
CheckPowerupCollision({ 0,0,vRightStrafe.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) == -1) {
vec3d zMovement{ 0,0,vRightStrafe.z };
int enemyCollisionIndex = CheckExplosiveEnemyCollision(zMovement, { player.GetPos().x,player.GetPos().z }, player.GetRadius());
if (enemyCollisionIndex != -1) {
@ -1357,7 +1363,8 @@ void FaceBall::HandleKeys(float fElapsedTime) {
freeRoamCamera = Vector_Add(freeRoamCamera, vForward);
}
else {
if (!CheckCollision({ vForward.x,0,0 }, {player.GetPos().x,player.GetPos().z},player.GetRadius())) {
if (!CheckCollision({ vForward.x,0,0 }, {player.GetPos().x,player.GetPos().z},player.GetRadius()) &&
CheckPowerupCollision({ vForward.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) == -1) {
vec3d xMovement{ vForward.x,0,0 };
int enemyCollisionIndex = CheckExplosiveEnemyCollision(xMovement, { player.GetPos().x,player.GetPos().z }, player.GetRadius());
if (enemyCollisionIndex != -1) {
@ -1369,7 +1376,8 @@ void FaceBall::HandleKeys(float fElapsedTime) {
}
player.UpdatePos(Vector_Add(player.GetPos(), xMovement));
}
if (!CheckCollision({ 0,0,vForward.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())) {
if (!CheckCollision({ 0,0,vForward.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) &&
CheckPowerupCollision({ 0,0,vForward.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) == -1) {
vec3d zMovement{ 0,0,vForward.z };
int enemyCollisionIndex = CheckExplosiveEnemyCollision(zMovement, { player.GetPos().x,player.GetPos().z }, player.GetRadius());
if (enemyCollisionIndex != -1) {
@ -1393,7 +1401,8 @@ void FaceBall::HandleKeys(float fElapsedTime) {
freeRoamCamera = Vector_Add(freeRoamCamera, vReverse);
}
else {
if (!CheckCollision({ vReverse.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())) {
if (!CheckCollision({ vReverse.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) &&
CheckPowerupCollision({ vReverse.x,0,0 }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) == -1) {
vec3d xMovement{ vReverse.x,0,0 };
int enemyCollisionIndex = CheckExplosiveEnemyCollision(xMovement, { player.GetPos().x,player.GetPos().z }, player.GetRadius());
if (enemyCollisionIndex != -1) {
@ -1405,7 +1414,8 @@ void FaceBall::HandleKeys(float fElapsedTime) {
}
player.UpdatePos(Vector_Add(player.GetPos(), xMovement));
}
if (!CheckCollision({ 0,0,vReverse.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius())) {
if (!CheckCollision({ 0,0,vReverse.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) &&
CheckPowerupCollision({ 0,0,vReverse.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius()) == -1) {
vec3d zMovement{ 0,0,vReverse.z };
int enemyCollisionIndex = CheckExplosiveEnemyCollision(zMovement, { player.GetPos().x,player.GetPos().z }, player.GetRadius());
if (enemyCollisionIndex != -1) {
@ -1516,6 +1526,19 @@ bool FaceBall::OnUserCreate()
return true;
}
int FaceBall::CheckPowerupCollision(vec3d movementVector, vf2d pos, float radius) {
vf2d newpos = { pos.x + movementVector.x,pos.y + movementVector.z };
for (int i = 0; i < game->powerups.size(); i++) {
Powerup& p = game->powerups[i];
float dist = std::sqrtf(std::powf(newpos.x - p.pos.x, 2) + std::powf(newpos.y - p.pos.z, 2));
if (dist < radius + p.radius) {
lastPowerupCollidedWith = i; //This function is only meant for the player to collide with things. If this is needed for other things, we will have to refactor/reconsider this line as they would modify the player's last powerup touched variable which is a no-no.
return i;
}
}
return -1;
}
//Collisions will not occur if the player is dead.
bool FaceBall::CheckPlayerCollision(vec3d movementVector, vf2d pos, float radius) {
if (game->hp <= 0) { return false; }
@ -2003,10 +2026,12 @@ void FaceBall::RunEnemyAI(Enemy& e,float fElapsedTime,int myIndex) {
bool FaceBall::OnUserUpdate(float fElapsedTime)
{
gameTimer += fElapsedTime;
switch (mode) {
case GAME: {
for (std::vector<Bullet>::iterator it = bullets.begin(); it != bullets.end();) {
Bullet& b = *it;
if (!b.Update(fElapsedTime)) {
it=bullets.erase(it);
it = bullets.erase(it);
}
else {
it++;
@ -2018,7 +2043,7 @@ bool FaceBall::OnUserUpdate(float fElapsedTime)
if (e.isLastHitTimerActive()) {
e.reduceLastHitTimer(fElapsedTime);
}
RunEnemyAI(e, fElapsedTime,i);
RunEnemyAI(e, fElapsedTime, i);
}
for (std::vector<Powerup>::iterator it = powerups.begin(); it != powerups.end();) {
Powerup& p = *it;
@ -2029,8 +2054,12 @@ bool FaceBall::OnUserUpdate(float fElapsedTime)
it++;
}
}
switch (mode) {
case GAME: {
if (lastPowerupCollidedWith != -1) {
vec3d vForward = Vector_Mul(vLookDir, std::min(player.GetRadius() - 0.00001f, moveSpd * fElapsedTime));
if (CheckPowerupCollision({ vForward.x,0,vForward.z }, { player.GetPos().x,player.GetPos().z }, player.GetRadius() * 1.25) != -1) {
powerups[lastPowerupCollidedWith].opened = true;
}
}
if (hp > 0) {
HandleKeys(fElapsedTime);
RenderWorld();

@ -174,6 +174,7 @@ struct Powerup : Object {
Pixel col;
float colorCycle=1;
float aliveTime=0;
bool opened = false;
bool Update(float fElapsedTime);
};
@ -278,6 +279,7 @@ class FaceBall : public PixelGameEngine
int tagsRemaining = 10;
int lives = 3;
double gameTimer = 0;
int lastPowerupCollidedWith = -1;
mat4x4 matProj;
@ -374,6 +376,7 @@ class FaceBall : public PixelGameEngine
void RenderHud(float fElapsedTime);
void ConvertBulletColor(Mesh& bullet, Pixel col);
void Display3DKillerModel();
int CheckPowerupCollision(vec3d movementVector, vf2d pos, float radius);
public:
vi2d MAP_SIZE;
float restingTriangleYDepth = 0.f;

Loading…
Cancel
Save