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

📄 tank.cpp.svn-base

📁 坦克大战游戏完整全套源代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
            getTank().RemoveMoveStatus(MS_LEFT);
            getTank().RemoveMoveStatus(MS_RIGHT);
            getTank().setTurnDirection = false;
        }
        pData ? getTank().AddMoveStatus(MS_RIGHT) : getTank().RemoveMoveStatus(MS_RIGHT);
        break;
    case TCI_Forward:
        pData ? getTank().AddMoveStatus(MS_UP) : getTank().RemoveMoveStatus(MS_UP);
        break;
    case TCI_Backward:
        pData ? getTank().AddMoveStatus(MS_DOWN) : getTank().RemoveMoveStatus(MS_DOWN);
        break;
    case TCI_HalfEnginePower:
        pData ? getTank().AddMoveStatus(MS_HalfEnginePower) : getTank().RemoveMoveStatus(MS_HalfEnginePower);
        break;
    case TCI_Fire:
        pData ? getTank().AddAttackStatus(AS_Cannon) : getTank().RemoveAttackStatus(AS_Cannon);
        break;
    case TCI_Shoot:
        pData ? getTank().AddAttackStatus(AS_Gun) : getTank().RemoveAttackStatus(AS_Gun);
        break;
    case TCI_Aim:
        {
            assert(pData);
            const Point2f &pos = *(const Point2f *)pData;
            getTank().SetAttackTarget(pos);
        }
        break;
    case TCI_Turn:
        {
            Point2f turnToPos = *(const Point2f *)pData;
            turnToPos = turnToPos - getTank().pos;
            getTank().setTurnDirection = true;
            getTank().turnDirection = atan2(turnToPos.y, turnToPos.x) * 180.f / Pi;
        }
        break;
    }
}

void Tank::CollisionEntity::onCollision(iCollisionEntity &o, const iContactInfo &contactInfo)
{
    float fDamage;
    int nPenetrability;
    Point2f oPos;

    contactInfo;
    if (getEntity().state == TS_Dead)
        return;

    Entity &oe = o.getEntity();
    switch(o.getCollisionCategory())
    {
    case CC_Tank:
        break;
    case CC_Bullet:
        if (oe.getStatus(Bullet::ESI_Damage, &fDamage) &&
            oe.getStatus(Bullet::ESI_Penetrability, &nPenetrability))
            getEntity().damage(fDamage, 0);
        break;
    case CC_Cannon:
        if (oe.getStatus(CannonBall::ESI_Damage, &fDamage) &&
            oe.getStatus(CannonBall::ESI_Penetrability, &nPenetrability))
            getEntity().damage(fDamage, nPenetrability);
        break;
    case CC_Explosive:
        {
            Explosive &explosive = *(Explosive *)&oe;
            explosive.getDamage(getEntity().pos, fDamage, nPenetrability);
            getEntity().damage(fDamage, nPenetrability);
        }
        break;
    }
}

void Tank::SetBarbette(const Barbette &barbette, const Barbette &gunBarbette)
{
    if (mBarbette)
        delete mBarbette;
    if (mGunBarbette)
        delete mGunBarbette;
    mBarbette = new Barbette::BarbetteInstance(barbette, *this);
    mGunBarbette = new Barbette::BarbetteInstance(gunBarbette, *this);
}

void Tank::SetCannon(const Cannon &cannon)
{
    if (!mCannon)
    {
        mCannon = new Weapon::WeaponInstance(cannon);
    }
    else if (&mCannon->getWeapon() != &cannon)
    {
        delete mCannon;
        mCannon = new Weapon::WeaponInstance(cannon);
    }
    mCannon->chargeAmmo(20);
}

void Tank::SetGun(const Gun &gun)
{
    if (mGun)
    {
        if (&mGun->getWeapon() != &gun)
        {
            delete mGun;
            mGun = new Weapon::WeaponInstance(gun);
        }
    }
    else
        mGun = new Weapon::WeaponInstance(gun);
    mGun->chargeAmmo(100);
}

Entity::iEntity* Tank::getEntityInterface(EntityInterfaceId id)
{
    switch(id)
    {
    case EII_CollisionEntity:
        return &this->collisionEntity;
    case EII_ControlEntity:
        return &this->controlEntity;
    case EII_GraphicEntity:
        return &this->graphicEntity;
    case EII_ViewerEntity:
        return &this->viewerEntity;
    case EII_RadarEntity:
        return &this->radarEntity;
    case EII_TargetEntity:
        return &this->targetEntity;
    }

    return Entity::getEntityInterface(id);
}

bool Tank::getStatus(EntityStatusId id, void *p)
{
    switch(id)
    {
    case ESI_Position:
        *(Point2f *)p = this->pos;
        return true;
    case ESI_Orientation:
        *(float *)p = this->getDirection() / 180.f * Pi;
        return true;
    case ESI_GunCoolDown:
        if (mGun)
        {
            *(float *)p = mGun->getCooldownPercentage();
            return true;
        }
        break;
    case ESI_CannonCoolDown:
        if (mCannon)
        {
            *(float *)p = mCannon->getCooldownPercentage();
            return true;
        }
        break;
    case ESI_GunAmmoAmount:
        if (mGun)
        {
            *(size_t *)p = mGun->getAmmoAmount();
            return true;
        }
        break;
    case ESI_CannonAmmoAmount:
        if (mCannon)
        {
            *(size_t *)p = mCannon->getAmmoAmount();
            return true;
        }
        break;
    }
    return false;
}

void Tank::attachCooldownIcon(CooldownIcon *gunCooldown, CooldownIcon *cannonCooldown)
{
    this->gunAttacheeEntity.attach(*gunCooldown);
    gunCooldown->statusId = ESI_GunCoolDown;
    gunCooldown->statusId_ammoAmount = ESI_GunAmmoAmount;
    this->cannonAttacheeEntity.attach(*cannonCooldown);
    cannonCooldown->statusId = ESI_CannonCoolDown;
    cannonCooldown->statusId_ammoAmount = ESI_CannonAmmoAmount;
}

Tank::GraphicEntity::GraphicEntity(Entity &e, cAni::iAnimResManager &arm, hgeFont *_font) : iGraphicEntity(e, arm), font(_font)
{
    animTank = iSystem::GetInstance()->createAnimation(NumTankAnimIds);
    animTank->setAnimData(animResManager.getAnimData("data/tank/idle.xml"), TAI_Idle);
    //animTank.setAnimData(animResManager.getAnimData("data/tank/move"), TAI_Move);
    //animTank.setAnimData(animResManager.getAnimData("data/tank/accelerate"), TAI_Accelerate);
    //animTank.setAnimData(animResManager.getAnimData("data/tank/decelerate"), TAI_Decelerate);

    animBarbette = iSystem::GetInstance()->createAnimation(NumBarbetteAnimIds);
    animBarbette->setAnimData(animResManager.getAnimData("data/tank/barbetteidle.xml"), BAI_Idle);
    //animBarbette->setAnimData(animResManager.getAnimData("data/tank/barbetteturn.xml"), BAI_Turning);
    //animBarbette->setAnimData(animResManager.getAnimData("data/tank/barbettefire.xml"), BAI_Fire);

    animCross = iSystem::GetInstance()->createAnimation();
    animCross->setAnimData(animResManager.getAnimData("data/tank/cross.xml"), 0);

    explodeSmoke = iSystem::GetInstance()->createAnimation();
    explodeSmoke->setAnimData(animResManager.getAnimData("data/tank/smoke.xml"), 0);

}

Tank::GraphicEntity::~GraphicEntity()
{
    iSystem::GetInstance()->release(this->animTank);
    this->animTank = 0;
    iSystem::GetInstance()->release(this->animBarbette);
    this->animBarbette = 0;
    iSystem::GetInstance()->release(this->animCross);
    this->animCross = 0;
    iSystem::GetInstance()->release(this->explodeSmoke);
    this->explodeSmoke = 0;
}
void Tank::GraphicEntity::render(float gameTime, float deltaTime)
{
    deltaTime;

    assert(animTank);

    int timeInFrame = int(gameTime * 60);

    if (trigStartExplodeSmoke)
    {
        trigStartExplodeSmoke = false;
        explodeSmoke->startAnim(timeInFrame);
    }
    if (getEntity().state == Tank::TS_Dead)
    {
        RenderQueue::getSingleton().render(getEntity().pos, 0, timeInFrame, explodeSmoke, GLI_Bullets);
    }
    else
    {
        RenderQueue::getSingleton().render(getEntity().pos, -getEntity().fDirection / 180 * M_PI, timeInFrame, animTank, GLI_Tank);

        float barbetteDirection;
        float gunDirection;
        Point2f posAttackTarget1 = getEntity().pos;
        Point2f posAttackTarget2 = getEntity().pos;
        Barbette::BarbetteInstance *mBarbette = getEntity().mBarbette;
        if (mBarbette)
        {
            barbetteDirection = mBarbette->getDirection();
            posAttackTarget1 = mBarbette->getAttackPos();
        }
        else
        {
            barbetteDirection = getEntity().getDirection();
        }
        Barbette::BarbetteInstance *mGunBarbette = getEntity().mGunBarbette;
        if (mGunBarbette)
        {
            gunDirection = mGunBarbette->getDirection();
            posAttackTarget2 = mGunBarbette->getAttackPos();
        }
        else
        {
            gunDirection = getEntity().getDirection();
        }
        RenderQueue::getSingleton().render(getEntity().pos, -barbetteDirection / 180 * M_PI, timeInFrame, animBarbette, GLI_Tank);


        char buf[128];
        if (getEntity().bShowAim)
        {
            float attackLength1 = (posAttackTarget1 - getEntity().pos).Length();
            getEntity().mCannon->render(gameTime, deltaTime, getEntity().pos, attackLength1, barbetteDirection / 180 * M_PI);

            float attackLength2 = (posAttackTarget2 - getEntity().pos).Length();
            getEntity().mGun->render(gameTime, deltaTime, getEntity().pos, attackLength2, gunDirection / 180 * M_PI);

            RenderQueue::getSingleton().render(posAttackTarget1, 0, timeInFrame, animCross, GLI_UI);

            sprintf(buf, "%.2f m", attackLength1);
            RenderQueue::getSingleton().render(posAttackTarget1 + Point2f(0, -20), font, buf, TA_CENTER, ARGB(255, 255, 128, 128), GLI_UI);
        }

        sprintf(buf, "%d:%d", int(ceil(getEntity().fArmor)), int(ceil(getEntity().fHealth)));
        RenderQueue::getSingleton().render(getEntity().pos + Point2f(0, -20), font, buf, TA_CENTER, ARGB(255, 255, 128, 128), GLI_UI);
    }
#ifdef _DEBUG
#if 0
    const Rectf &r = getEntity().collisionEntity.getBoundingBox();
    RenderQueue::getSingleton().render(Point2f(r.left, r.top), Point2f(r.right, r.top), ARGB(128, 0, 0, 255));
    RenderQueue::getSingleton().render(Point2f(r.right, r.top), Point2f(r.right, r.bottom), ARGB(128, 0, 0, 255));
    RenderQueue::getSingleton().render(Point2f(r.right, r.bottom), Point2f(r.left, r.bottom), ARGB(128, 0, 0, 255));
    RenderQueue::getSingleton().render(Point2f(r.left, r.bottom), Point2f(r.left, r.top), ARGB(128, 0, 0, 255));
#endif
#endif
}

⌨️ 快捷键说明

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