📄 tank.cpp.svn-base
字号:
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 + -