⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seesenemy.cpp

📁 C人工智能游戏开发的一些实例源代码 C Game development in artificial intelligence source code of some examples
💻 CPP
字号:

#include "character.h"
#include "SeesEnemy.h"
#include "gametime.h"
#include "util.h"

SeesEnemy::SeesEnemy()
{
    m_name      = "SeesEnemy";
    m_owner     = NULL;
}

void SeesEnemy::init   ( IEOwner * owner )
{
    m_owner = dynamic_cast<Character *> (owner);
}


bool SeesEnemy::update () 
{
    int px;
    int py;

    m_owner->getPos ( px, py );

    int xdir;
    int ydir;

    m_owner->getDirection ( xdir, ydir );

    int dist = m_owner->getSightRange();

    Character * enemy = lookForEnemy ( px, py, xdir, ydir, dist );

    if ( enemy )
    {
        m_owner->setEnemy ( enemy );
        return true;
    }
    else
    {
        m_owner->setEnemy ( NULL );
        return false;
    }
}


IEOwner * SeesEnemy::getOwner ()
{
    return m_owner;
}

const char * SeesEnemy::getName()
{
    return m_name.c_str();
}

Character * SeesEnemy::lookForEnemy ( int x, int y, int xdir, int ydir, int range )
{
    int  i;
    int  sx;
    int  sy;

    Character * enemy = NULL;

    World2D  * world = m_owner->getWorld();
    
    int width  = world->getWidth();
    int length = world->getLength();

    if ( xdir > 0 )
    {
        for ( i=x+1; i<=x+range; i++ )
        {
            sy = y;

            if ( i >= width )
                sx = 0 + (i - width);
            else
                sx = i;

            enemy = testEnemy ( sx, sy );
            if ( enemy )
                return enemy;
        }
    }
    else if ( xdir < 0 )
    {
        for ( i=x-1; i>=x-range; i-- )
        {
            sy = y;

            if ( i < 0 )
                sx = width + i;
            else
                sx = i;

            enemy = testEnemy ( sx, sy );
            if ( enemy )
                return enemy;
        }
    }
    else if ( ydir > 0 )
    {
        for ( i=y+1; i<=y+range; i++ )
        {
            sx = x;

            if ( i >= length )
                sy = 0 + (i - length);
            else
                sy = i;

            enemy = testEnemy ( sx, sy );
            if ( enemy )
                return enemy;
        }
    }
    else if ( ydir < 0 )
    {
        for ( i=y-1; i>=y-range; i-- )
        {
            sx = x;

            if ( i < 0 )
                sy = range + i;
            else
                sy = i;

            enemy = testEnemy ( sx, sy );
            if ( enemy )
                return enemy;
        }
    }

    return NULL;
}

Character * SeesEnemy::testEnemy ( int x, int y )
{
    Character * enemy = NULL;

    WorldPos * wpos;
    WorldObj * obj;
    World2D  * world = m_owner->getWorld();
    
    wpos = world->getPos ( x, y );

    obj  = wpos->getObj();

    if ( obj )
    {
        Character * other = (Character *)obj;

        if ( other )
        {
            if ( m_owner->isEnemy ( other ) )
            {
                enemy = other;
            }
        }
    }

    return enemy;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -