Skip to content
Snippets Groups Projects
Select Git revision
  • cbbf1a0b15316d61cefb90a2a2d513ff783cfd4c
  • master default
  • Huaer
  • krueger
4 results

Enemyprojectile.hpp

Blame
  • Enemy.cpp NaN GiB
    #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;
            }
    };