Select Git revision
-
weberma73121 authoredweberma73121 authored
Enemy.cpp 4.63 KiB
#include "Enemy.hpp"
#include "Level.hpp"
#include "Enemyprojectile.hpp"
//WeberMa73121: implementation enum direction dir replaces int direcion---------------------------------------
//Hauerch71498 ----------------------------------------------------------------------------------------------
Enemy::Enemy(int health,float x, float y, enum direction dir, int animationstep)
{
this->hitpoints = health;
this->topleft = { x, y };
this->dir = dir;
this->animationstep = animationstep;
}
void Enemy::shoot(Level &level)
{
const auto &sprite = this->getSprite();
if(timetillreload<0)
{
switch ( this->dir ) {
case direction::FRONT: //Up
{
level.addEnemyProjectile({this->topleft.X+sprite.w()/2-1,this->topleft.Y+sprite.h()/2,dir});
break;
}
case direction::LEFT: //left
level.addEnemyProjectile({this->topleft.X,this->topleft.Y+sprite.h()/2,dir});
break;
case direction::RIGHT: //right
level.addEnemyProjectile({this->topleft.X+sprite.w(),this->topleft.Y+sprite.h()/2,dir});
break;
default: //Down
level.addEnemyProjectile({this->topleft.X+sprite.w()/2-1,this->topleft.Y,dir});
break;
}
timetillreload = 5;
}
};
void Enemy::move(
[[maybe_unused]] FloatSeconds const & Frametime,
[[maybe_unused]] Level &level
)
{
};
bool Enemy::lookup(float PlayerY, Level &level)
{
if(this->topleft.Y > PlayerY)
{
int i = static_cast<int>(this->topleft.Y-(this->getSprite().h()/2));
i = i-static_cast<int>(PlayerY);
if(level.checkCollision(this->topleft.X, this->topleft.Y+(this->getSprite().h()/2)+i, i, 1))
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
};
bool Enemy::lookdown(float PlayerY, Level &level)
{
if(this->topleft.Y < PlayerY)
{
int i = static_cast<int>(this->topleft.Y+(this->getSprite().h()/2));
i = static_cast<int>(PlayerY)-i;
if(level.checkCollision(this->topleft.X, this->topleft.Y+(this->getSprite().h()/2), i, 1))
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
};
bool Enemy::lookleft(float PlayerX, Level &level)
{
if(this->topleft.X > PlayerX)
{
int i = static_cast<int>(this->topleft.X-(this->getSprite().w()/2));
i = i-static_cast<int>(PlayerX);
if(level.checkCollision(this->topleft.X-(this->getSprite().w()/2)-i, this->topleft.Y, i, 1))
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
};
bool Enemy::lookright(float PlayerX, Level &level)
{
if(this->topleft.X < PlayerX)
{
int i = static_cast<int>(this->topleft.X+(this->getSprite().w()/2));
i = static_cast<int>(PlayerX)-i;
if(level.checkCollision(this->topleft.X-(this->getSprite().w()/2), this->topleft.Y, i, 1))
{
return false;
}
else
{
return true;
}
}
else
{
return false;
}
};
bool Enemy::lookAtPlayer(float PlayerX, float PlayerY, Level &level)
{
switch (dir) {
case direction::BACK: //back
return lookup(PlayerY, level);
break;
case direction::LEFT: //left
return lookleft(PlayerX, level);
break;
case direction::RIGHT: //right
return lookright(PlayerX, level);
break;
default:
return lookdown(PlayerY, level);
break;
}
}
bool Enemy::playerdetected(float PlayerX, float PlayerY, Level &level)
{
if(abs(this->topleft.X - PlayerX) < 20) //buffer of 5
{
if(lookdown(PlayerY, level))
{
dir = direction::FRONT;
return true;
}
else if(lookup(PlayerY, level))
{
dir = direction::BACK;
return true;
}
else
{
return false;
}
}
else if(abs(this->topleft.Y - PlayerY) < 20) //buffer of 5
{
if(lookleft(PlayerX, level))
{
dir = direction::LEFT;
return true;
}
else if(lookright(PlayerX, level))
{
dir = direction::RIGHT;
return true;
}
else
{
return false;
}
}
else
{
return false;
}
};