本文整理汇总了C++中GetPosX函数的典型用法代码示例。如果您正苦于以下问题:C++ GetPosX函数的具体用法?C++ GetPosX怎么用?C++ GetPosX使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了GetPosX函数的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ChangeAIState
void CPatrolEnemy::Update(float fElapsedTime)
{
CBaseEnemy::Update(fElapsedTime);
if(GetCurrentHP() <= 0)
ChangeAIState(pDead);
else
{
tVector2D Result;
Result.fX = GetTargetPosition().fX - GetPosX();
Result.fY = GetTargetPosition().fY - GetPosY();
float Distance = sqrt(Result.fX*Result.fX + Result.fY*Result.fY);
if(Distance <= GetSightRange())
{
ChangeAIState(pActive);
this->ReturnAIState();
}
else
ChangeAIState(Patrol);
switch(ReturnAIState())
{
case Patrol:
{
SetPosX((GetPosX() + GetBaseVelX() * fElapsedTime));
if(GetPosX() <= 0)
{
SetPosX(0);
SetCurrentDist(0);
SetSpeed(-1*GetSpeed());
}
SetCurrentDist(GetCurrentDist() + (fabs(GetBaseVelX()) * fElapsedTime));
if(GetCurrentDist() >= GetMaxDist())
{
SetCurrentDist(0);
SetSpeed(-1*GetSpeed());
}
SetBaseVelX(GetBaseVelX() + GetSpeed() * fElapsedTime);
if(GetBaseVelX() > 50)
SetBaseVelX(50);
else if(GetBaseVelX() < -50)
SetBaseVelX(-50);
}
break;
case pActive:
{
SetSpeed(-1*GetSpeed());
SetBaseVelX(0);
}
break;
case pDead:
{
}
break;
};
}
}
示例2: switch
bool cMinecart::TestBlockCollision(NIBBLETYPE a_RailMeta)
{
switch (a_RailMeta)
{
case E_META_RAIL_ZM_ZP:
{
if (GetSpeedZ() > 0)
{
BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT, POSY_TOINT, (int)ceil(GetPosZ()));
if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
// We could try to detect a block in front based purely on coordinates, but xoft made a bounding box system - why not use? :P
cBoundingBox bbBlock(Vector3d(POSX_TOINT, POSY_TOINT, (int)ceil(GetPosZ())), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight());
if (bbBlock.DoesIntersect(bbMinecart))
{
SetSpeed(0, 0, 0);
SetPosZ(floor(GetPosZ()) + 0.4);
return true;
}
}
}
else if (GetSpeedZ() < 0)
{
BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1);
if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
cBoundingBox bbBlock(Vector3d(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ() - 1), GetWidth() / 2, GetHeight());
if (bbBlock.DoesIntersect(bbMinecart))
{
SetSpeed(0, 0, 0);
SetPosZ(floor(GetPosZ()) + 0.65);
return true;
}
}
}
break;
}
case E_META_RAIL_XM_XP:
{
if (GetSpeedX() > 0)
{
BLOCKTYPE Block = m_World->GetBlock((int)ceil(GetPosX()), POSY_TOINT, POSZ_TOINT);
if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
cBoundingBox bbBlock(Vector3d((int)ceil(GetPosX()), POSY_TOINT, POSZ_TOINT), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX(), floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight());
if (bbBlock.DoesIntersect(bbMinecart))
{
SetSpeed(0, 0, 0);
SetPosX(floor(GetPosX()) + 0.4);
return true;
}
}
}
else if (GetSpeedX() < 0)
{
BLOCKTYPE Block = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT);
if (!IsBlockRail(Block) && cBlockInfo::IsSolid(Block))
{
cBoundingBox bbBlock(Vector3d(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT), 0.5, 1);
cBoundingBox bbMinecart(Vector3d(GetPosX() - 1, floor(GetPosY()), GetPosZ()), GetWidth() / 2, GetHeight());
if (bbBlock.DoesIntersect(bbMinecart))
{
SetSpeed(0, 0, 0);
SetPosX(floor(GetPosX()) + 0.65);
return true;
}
}
}
break;
}
case E_META_RAIL_CURVED_ZM_XM:
case E_META_RAIL_CURVED_ZM_XP:
case E_META_RAIL_CURVED_ZP_XM:
case E_META_RAIL_CURVED_ZP_XP:
{
BLOCKTYPE BlockXM = m_World->GetBlock(POSX_TOINT - 1, POSY_TOINT, POSZ_TOINT);
BLOCKTYPE BlockXP = m_World->GetBlock(POSX_TOINT + 1, POSY_TOINT, POSZ_TOINT);
BLOCKTYPE BlockZM = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT - 1);
BLOCKTYPE BlockZP = m_World->GetBlock(POSX_TOINT, POSY_TOINT, POSZ_TOINT + 1);
if (
(!IsBlockRail(BlockXM) && cBlockInfo::IsSolid(BlockXM)) ||
(!IsBlockRail(BlockXP) && cBlockInfo::IsSolid(BlockXP)) ||
(!IsBlockRail(BlockZM) && cBlockInfo::IsSolid(BlockZM)) ||
(!IsBlockRail(BlockZP) && cBlockInfo::IsSolid(BlockZP))
)
{
SetSpeed(0, 0, 0);
SetPosition(POSX_TOINT + 0.5, GetPosY(), POSZ_TOINT + 0.5);
return true;
}
break;
}
default: break;
//.........这里部分代码省略.........
示例3: Destroy
bool cMinecart::DoTakeDamage(TakeDamageInfo & TDI)
{
if ((TDI.Attacker != NULL) && TDI.Attacker->IsPlayer() && ((cPlayer *)TDI.Attacker)->IsGameModeCreative())
{
Destroy();
TDI.FinalDamage = GetMaxHealth(); // Instant hit for creative
SetInvulnerableTicks(0);
return super::DoTakeDamage(TDI); // No drops for creative
}
m_LastDamage = TDI.FinalDamage;
if (!super::DoTakeDamage(TDI))
{
return false;
}
m_World->BroadcastEntityMetadata(*this);
if (GetHealth() <= 0)
{
Destroy();
cItems Drops;
switch (m_Payload)
{
case mpNone:
{
Drops.push_back(cItem(E_ITEM_MINECART, 1, 0));
break;
}
case mpChest:
{
Drops.push_back(cItem(E_ITEM_CHEST_MINECART, 1, 0));
break;
}
case mpFurnace:
{
Drops.push_back(cItem(E_ITEM_FURNACE_MINECART, 1, 0));
break;
}
case mpTNT:
{
Drops.push_back(cItem(E_ITEM_MINECART_WITH_TNT, 1, 0));
break;
}
case mpHopper:
{
Drops.push_back(cItem(E_ITEM_MINECART_WITH_HOPPER, 1, 0));
break;
}
default:
{
ASSERT(!"Unhandled minecart type when spawning pickup!");
return true;
}
}
m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ());
}
return true;
}
示例4: CPickup
CEnemy::~CEnemy( )
{
if(m_SpellType == OBJ_WIND)
{
if(dynamic_cast<AIStateWind*>(currState))
{
if(((AIStateWind*)currState)->GetFlock())
{
((AIStateWind*)currState)->GetFlock()->RemoveMember(this);
}
}
}
if( currState )
delete currState;
CPickup * newpickup = new CPickup();
newpickup->SetPosX(GetPosX());
newpickup->SetPosY(GetPosY());
newpickup->SetActive(true);
if(!(rand() % 20))
{
newpickup->SetType(OBJ_T3SPELL);
//newpickup->SetImage( CSGD_TextureManager::GetInstance()->LoadTexture("resource/graphics/Lapid_SuperEnergy.png"));
newpickup->SetWidth(32);
newpickup->SetHeight(32);
CEmitter* hahaiworknow = CParticleManager::GetInstance()->LoadEmitter("resource/data/powerSpecial.lapipt",newpickup->GetPosX(),newpickup->GetPosY());
newpickup->SetEmitter(hahaiworknow);
CParticleManager::GetInstance()->AddEmitter(newpickup->GetEmitter());
}
else
{
newpickup->SetType(OBJ_ENERGY);
if(GetEleType() == OBJ_EARTH)
{
newpickup->SetEleType(OBJ_EARTH);
//newpickup->SetImage( CSGD_TextureManager::GetInstance()->LoadTexture("resource/graphics/Lapid_EarthEnergy.png"));
newpickup->SetWidth(64);
newpickup->SetHeight(48);
CEmitter* hahaiworknow = CParticleManager::GetInstance()->LoadEmitter("resource/data/powerEarth.lapipt",newpickup->GetPosX(),newpickup->GetPosY());
newpickup->SetEmitter(hahaiworknow);
CParticleManager::GetInstance()->AddEmitter(newpickup->GetEmitter());
}
else if(GetEleType() == OBJ_FIRE)
{
newpickup->SetEleType(OBJ_FIRE);
//newpickup->SetImage( CSGD_TextureManager::GetInstance()->LoadTexture("resource/graphics/Lapid_FireEnergy.png"));
newpickup->SetWidth(64);
newpickup->SetHeight(48);
CEmitter* hahaiworknow = CParticleManager::GetInstance()->LoadEmitter("resource/data/powerFire.lapipt",newpickup->GetPosX(),newpickup->GetPosY());
newpickup->SetEmitter(hahaiworknow);
CParticleManager::GetInstance()->AddEmitter(newpickup->GetEmitter());
}
else if(GetEleType() == OBJ_ICE)
{
newpickup->SetEleType(OBJ_ICE);
//newpickup->SetImage( CSGD_TextureManager::GetInstance()->LoadTexture("resource/graphics/Lapid_IceEnergy.png"));
newpickup->SetWidth(64);
newpickup->SetHeight(48);
CEmitter* hahaiworknow = CParticleManager::GetInstance()->LoadEmitter("resource/data/powerIce.lapipt",newpickup->GetPosX(),newpickup->GetPosY());
newpickup->SetEmitter(hahaiworknow);
CParticleManager::GetInstance()->AddEmitter(newpickup->GetEmitter());
}
else
{
newpickup->SetEleType(OBJ_WIND);
//newpickup->SetImage( CSGD_TextureManager::GetInstance()->LoadTexture("resource/graphics/Lapid_WindEnergy.png"));
newpickup->SetWidth(64);
newpickup->SetHeight(58);
CEmitter* hahaiworknow = CParticleManager::GetInstance()->LoadEmitter("resource/data/powerWind.lapipt",newpickup->GetPosX(),newpickup->GetPosY());
newpickup->SetEmitter(hahaiworknow);
CParticleManager::GetInstance()->AddEmitter(newpickup->GetEmitter());
}
}
Corona_ObjectManager::GetInstance()->AddObject(newpickup);
newpickup->Release();
}
示例5: SetHealth
void CEnemy::Update( float fElapsedTime )
{
if( ! ( CGameplayState::GetInstance()->GetLevel()->GetTile((int)GetPosX(), (int)GetPosY() ) ) )
{
SetHealth(0);
}
if(m_nHealth >0)
{
Frame * currFrame = (animation->GetAllFrames())[animation->GetFrame()];
if(LastFrame && currAnimation == 2 || currAnimation == 1)
{
float oldheight = m_fLastPosition + (LastFrame->DrawRect.bottom - LastFrame->DrawRect.top) * m_fScale;
while(oldheight < GetPosY() + (currFrame->DrawRect.bottom - currFrame->DrawRect.top) * m_fScale)
{
SetPosY(GetPosY() - 1);
}
while(oldheight > GetPosY() + (currFrame->DrawRect.bottom - currFrame->DrawRect.top) * m_fScale)
{
SetPosY(GetPosY() + 1);
}
}
LastFrame = currFrame;
m_fLastPosition = GetPosY();
if(!m_bKnockBack)
{
m_fShotTimer = m_fShotTimer - fElapsedTime;
if( 0.0f == m_fWaitTimer )
{
if(m_SpellType == OBJ_WIND)
{
CBase::Update( fElapsedTime );
}
else
{
CCharacter::Update( fElapsedTime );
}
m_nAttackWho = currState->Update( fElapsedTime, this );
if( m_nAttackWho && m_fShotTimer < 0 )
{
m_fWaitTimer += fElapsedTime;
m_fShotTimer = 2.0f;
animation->Reset();
SetAnimation(m_nAnimation,2);
}
}
else
{
m_fWaitTimer = m_fWaitTimer + fElapsedTime;
/*if(m_SpellType !=OBJ_WIND)
SetPosY( GetPosY( ) + 150.0f * fElapsedTime );*/
char* pleasework = animation->GetTrigger();
if(strcmp(pleasework, "Done") == 0)
{
if( 1 == m_nAttackWho )
{
currState->Attack( CGameplayState::GetInstance( )->GetPlayerOne( ), this );
}
else if( 2 == m_nAttackWho )
{
currState->Attack( CGameplayState::GetInstance( )->GetPlayerTwo( ), this );
}
animation->Reset();
SetAnimation(m_nAnimation,0);
m_fWaitTimer = 0.0f;
}
}
}
else
{
if(m_fKnockBack < 0)
{
m_bKnockBack = false;
}
else
{
CCharacter::Update(fElapsedTime);
m_fKnockBack-=fElapsedTime * 100;
}
}
if(m_bBurning)
{
m_fBurnTimer -= fElapsedTime;
if(m_fBurnTimer <= 0)
{
//.........这里部分代码省略.........
示例6: GetSpeed
void cEntity::BroadcastMovementUpdate(const cClientHandle * a_Exclude)
{
// Process packet sending every two ticks
if (GetWorld()->GetWorldAge() % 2 == 0)
{
double SpeedSqr = GetSpeed().SqrLength();
if (SpeedSqr == 0.0)
{
// Speed is zero, send this to clients once only as well as an absolute position
if (!m_bHasSentNoSpeed)
{
m_World->BroadcastEntityVelocity(*this, a_Exclude);
m_World->BroadcastTeleportEntity(*this, a_Exclude);
m_bHasSentNoSpeed = true;
}
}
else
{
// Movin'
m_World->BroadcastEntityVelocity(*this, a_Exclude);
m_bHasSentNoSpeed = false;
}
// TODO: Pickups move disgracefully if relative move packets are sent as opposed to just velocity. Have a system to send relmove only when SetPosXXX() is called with a large difference in position
int DiffX = (int)(floor(GetPosX() * 32.0) - floor(m_LastPos.x * 32.0));
int DiffY = (int)(floor(GetPosY() * 32.0) - floor(m_LastPos.y * 32.0));
int DiffZ = (int)(floor(GetPosZ() * 32.0) - floor(m_LastPos.z * 32.0));
if ((DiffX != 0) || (DiffY != 0) || (DiffZ != 0)) // Have we moved?
{
if ((abs(DiffX) <= 127) && (abs(DiffY) <= 127) && (abs(DiffZ) <= 127)) // Limitations of a Byte
{
// Difference within Byte limitations, use a relative move packet
if (m_bDirtyOrientation)
{
m_World->BroadcastEntityRelMoveLook(*this, (char)DiffX, (char)DiffY, (char)DiffZ, a_Exclude);
m_bDirtyOrientation = false;
}
else
{
m_World->BroadcastEntityRelMove(*this, (char)DiffX, (char)DiffY, (char)DiffZ, a_Exclude);
}
// Clients seem to store two positions, one for the velocity packet and one for the teleport/relmove packet
// The latter is only changed with a relmove/teleport, and m_LastPos stores this position
m_LastPos = GetPosition();
}
else
{
// Too big a movement, do a teleport
m_World->BroadcastTeleportEntity(*this, a_Exclude);
m_LastPos = GetPosition(); // See above
m_bDirtyOrientation = false;
}
}
if (m_bDirtyHead)
{
m_World->BroadcastEntityHeadLook(*this, a_Exclude);
m_bDirtyHead = false;
}
if (m_bDirtyOrientation)
{
// Send individual update in case above (sending with rel-move packet) wasn't done
GetWorld()->BroadcastEntityLook(*this, a_Exclude);
m_bDirtyOrientation = false;
}
}
}
示例7: TakeDamage
void cEntity::TickBurning(cChunk & a_Chunk)
{
// Remember the current burning state:
bool HasBeenBurning = (m_TicksLeftBurning > 0);
if (m_World->IsWeatherWet())
{
if (POSY_TOINT > m_World->GetHeight(POSX_TOINT, POSZ_TOINT))
{
m_TicksLeftBurning = 0;
}
}
// Do the burning damage:
if (m_TicksLeftBurning > 0)
{
m_TicksSinceLastBurnDamage++;
if (m_TicksSinceLastBurnDamage >= BURN_TICKS_PER_DAMAGE)
{
if (!m_IsFireproof)
{
TakeDamage(dtOnFire, NULL, BURN_DAMAGE, 0);
}
m_TicksSinceLastBurnDamage = 0;
}
m_TicksLeftBurning--;
}
// Update the burning times, based on surroundings:
int MinRelX = (int)floor(GetPosX() - m_Width / 2) - a_Chunk.GetPosX() * cChunkDef::Width;
int MaxRelX = (int)floor(GetPosX() + m_Width / 2) - a_Chunk.GetPosX() * cChunkDef::Width;
int MinRelZ = (int)floor(GetPosZ() - m_Width / 2) - a_Chunk.GetPosZ() * cChunkDef::Width;
int MaxRelZ = (int)floor(GetPosZ() + m_Width / 2) - a_Chunk.GetPosZ() * cChunkDef::Width;
int MinY = std::max(0, std::min(cChunkDef::Height - 1, POSY_TOINT));
int MaxY = std::max(0, std::min(cChunkDef::Height - 1, (int)ceil (GetPosY() + m_Height)));
bool HasWater = false;
bool HasLava = false;
bool HasFire = false;
for (int x = MinRelX; x <= MaxRelX; x++)
{
for (int z = MinRelZ; z <= MaxRelZ; z++)
{
int RelX = x;
int RelZ = z;
for (int y = MinY; y <= MaxY; y++)
{
BLOCKTYPE Block;
a_Chunk.UnboundedRelGetBlockType(RelX, y, RelZ, Block);
switch (Block)
{
case E_BLOCK_FIRE:
{
HasFire = true;
break;
}
case E_BLOCK_LAVA:
case E_BLOCK_STATIONARY_LAVA:
{
HasLava = true;
break;
}
case E_BLOCK_STATIONARY_WATER:
case E_BLOCK_WATER:
{
HasWater = true;
break;
}
} // switch (BlockType)
} // for y
} // for z
} // for x
if (HasWater)
{
// Extinguish the fire
m_TicksLeftBurning = 0;
}
if (HasLava)
{
// Burn:
m_TicksLeftBurning = BURN_TICKS;
// Periodically damage:
m_TicksSinceLastLavaDamage++;
if (m_TicksSinceLastLavaDamage >= LAVA_TICKS_PER_DAMAGE)
{
if (!m_IsFireproof)
{
TakeDamage(dtLavaContact, NULL, LAVA_DAMAGE, 0);
}
m_TicksSinceLastLavaDamage = 0;
}
}
else
{
m_TicksSinceLastLavaDamage = 0;
//.........这里部分代码省略.........
示例8: DoTakeDamage
void cMonster::DoTakeDamage(TakeDamageInfo & a_TDI)
{
super::DoTakeDamage(a_TDI);
if((m_SoundHurt != "") && (m_Health > 0)) m_World->BroadcastSoundEffect(m_SoundHurt, (int)(GetPosX() * 8), (int)(GetPosY() * 8), (int)(GetPosZ() * 8), 1.0f, 0.8f);
if (a_TDI.Attacker != NULL)
{
m_Target = a_TDI.Attacker;
AddReference(m_Target);
}
}
示例9: switch
void cMonster::KilledBy(cEntity * a_Killer)
{
super::KilledBy(a_Killer);
if (m_SoundHurt != "")
{
m_World->BroadcastSoundEffect(m_SoundDeath, (int)(GetPosX() * 8), (int)(GetPosY() * 8), (int)(GetPosZ() * 8), 1.0f, 0.8f);
}
int Reward;
switch (m_MobType)
{
// Animals
case cMonster::mtChicken:
case cMonster::mtCow:
case cMonster::mtHorse:
case cMonster::mtPig:
case cMonster::mtSheep:
case cMonster::mtSquid:
case cMonster::mtMooshroom:
case cMonster::mtOcelot:
case cMonster::mtWolf:
{
Reward = m_World->GetTickRandomNumber(2) + 1;
break;
}
// Monsters
case cMonster::mtCaveSpider:
case cMonster::mtCreeper:
case cMonster::mtEnderman:
case cMonster::mtGhast:
case cMonster::mtSilverfish:
case cMonster::mtSkeleton:
case cMonster::mtSpider:
case cMonster::mtWitch:
case cMonster::mtZombie:
case cMonster::mtZombiePigman:
case cMonster::mtSlime:
case cMonster::mtMagmaCube:
{
Reward = 6 + (m_World->GetTickRandomNumber(2));
break;
}
case cMonster::mtBlaze:
{
Reward = 10;
break;
}
// Bosses
case cMonster::mtEnderDragon:
{
Reward = 12000;
break;
}
case cMonster::mtWither:
{
Reward = 50;
break;
}
default:
{
Reward = 0;
break;
}
}
if ((a_Killer != NULL) && (!IsBaby()))
{
m_World->SpawnExperienceOrb(GetPosX(), GetPosY(), GetPosZ(), Reward);
}
m_DestroyTimer = 0;
}
示例10: ASSERT
//.........这里部分代码省略.........
{
return;
}
if(obj->GetTypeId() == TYPEID_CORPSE)
{
m_corpses.erase(((Corpse*)obj));
}
if(!obj->GetMapCell())
{
/* set the map cell correctly */
if(obj->GetPositionX() >= _maxX || obj->GetPositionX() <= _minY ||
obj->GetPositionY() >= _maxY || obj->GetPositionY() <= _minY)
{
// do nothing
}
else
{
obj->SetMapCell(this->GetCellByCoords(obj->GetPositionX(), obj->GetPositionY()));
}
}
if(obj->GetMapCell())
{
ASSERT(obj->GetMapCell());
// Remove object from cell
obj->GetMapCell()->RemoveObject(obj);
// Unset object's cell
obj->SetMapCell(NULL);
}
// Clear any updates pending
if(obj->GetTypeId() == TYPEID_PLAYER)
{
_processQueue.erase( static_cast< Player* >( obj ) );
static_cast< Player* >( obj )->ClearAllPendingUpdates();
}
// Remove object from all objects 'seeing' him
for (Object::InRangeSet::iterator iter = obj->GetInRangeSetBegin();
iter != obj->GetInRangeSetEnd(); ++iter)
{
if( (*iter) )
{
if( (*iter)->GetTypeId() == TYPEID_PLAYER )
{
if( static_cast< Player* >( *iter )->IsVisible( obj ) && static_cast< Player* >( *iter )->m_TransporterGUID != obj->GetGUID() )
static_cast< Player* >( *iter )->PushOutOfRange(obj->GetNewGUID());
}
(*iter)->RemoveInRangeObject(obj);
}
}
// Clear object's in-range set
obj->ClearInRangeSet();
// If it's a player - update his nearby cells
if(!_shutdown && obj->GetTypeId() == TYPEID_PLAYER)
{
// get x/y
if(obj->GetPositionX() >= _maxX || obj->GetPositionX() <= _minY ||
obj->GetPositionY() >= _maxY || obj->GetPositionY() <= _minY)
{
// do nothing
}
else
{
uint32 x = GetPosX(obj->GetPositionX());
uint32 y = GetPosY(obj->GetPositionY());
UpdateCellActivity(x, y, 2);
}
m_PlayerStorage.erase( static_cast< Player* >( obj )->GetLowGUID() );
}
// Remove the session from our set if it is a player.
if(plObj)
{
for(set<Object*>::iterator itr = _mapWideStaticObjects.begin(); itr != _mapWideStaticObjects.end(); ++itr)
{
plObj->PushOutOfRange((*itr)->GetNewGUID());
}
// Setting an instance ID here will trigger the session to be removed
// by MapMgr::run(). :)
plObj->GetSession()->SetInstance(0);
// Add it to the global session set.
// Don't "re-add" to session if it is being deleted.
if(!plObj->GetSession()->bDeleted)
sWorld.AddGlobalSession(plObj->GetSession());
}
if(!HasPlayers() && !InactiveMoveTime && !forced_expire && GetMapInfo()->type != INSTANCE_NULL)
{
InactiveMoveTime = UNIXTIME + (MAPMGR_INACTIVE_MOVE_TIME * 60); // 5 mins -> move to inactive
}
}
示例11: if
//.........这里部分代码省略.........
if(obj->GetMapMgr() != this)
{
/* Something removed us. */
return;
}
if(obj->GetPositionX() >= _maxX || obj->GetPositionX() <= _minX ||
obj->GetPositionY() >= _maxY || obj->GetPositionY() <= _minY)
{
if(obj->IsPlayer())
{
Player* plr = static_cast< Player* >( obj );
if(plr->GetBindMapId() != GetMapId())
{
plr->SafeTeleport(plr->GetBindMapId(),0,plr->GetBindPositionX(),plr->GetBindPositionY(),plr->GetBindPositionZ(),0);
plr->GetSession()->SystemMessage("Teleported you to your hearthstone location as you were out of the map boundaries.");
return;
}
else
{
obj->GetPositionV()->ChangeCoords(plr->GetBindPositionX(),plr->GetBindPositionY(),plr->GetBindPositionZ(),0);
plr->GetSession()->SystemMessage("Teleported you to your hearthstone location as you were out of the map boundaries.");
WorldPacket * data = plr->BuildTeleportAckMsg(plr->GetPosition());
plr->GetSession()->SendPacket(data);
delete data;
}
}
else
{
obj->GetPositionV()->ChangeCoords(0,0,0,0);
}
}
uint32 cellX = GetPosX(obj->GetPositionX());
uint32 cellY = GetPosY(obj->GetPositionY());
if(cellX >= _sizeX || cellY >= _sizeY)
{
return;
}
MapCell *objCell = GetCell(cellX, cellY);
MapCell * pOldCell = obj->GetMapCell();
if (!objCell)
{
objCell = Create(cellX,cellY);
objCell->Init(cellX, cellY, _mapId, this);
}
// If object moved cell
if (objCell != obj->GetMapCell())
{
// THIS IS A HACK!
// Current code, if a creature on a long waypoint path moves from an active
// cell into an inactive one, it will disable itself and will never return.
// This is to prevent cpu leaks. I will think of a better solution very soon :P
if(!objCell->IsActive() && !plObj && obj->Active)
obj->Deactivate(this);
if(obj->GetMapCell())
obj->GetMapCell()->RemoveObject(obj);
objCell->AddObject(obj);
obj->SetMapCell(objCell);
示例12: sizeof
/** 创建windows窗口 */
bool GLWindow::Create(const char * window_title,const char * class_name,bool fullscreen, HINSTANCE h_instance, LPVOID lpParam)
{
m_IsFullScreen = fullscreen;
int nX=0;
int nY=0;
PIXELFORMATDESCRIPTOR pfd = /**< 设置像素描述结构 */
{
sizeof(PIXELFORMATDESCRIPTOR), /**< 像素描述结构的大小 */
1, /**< 版本号 */
PFD_DRAW_TO_WINDOW | /**< 缓存区的输出显示在一个窗口中 */
PFD_SUPPORT_OPENGL | /**< 缓存区支持OpenGL绘图 */
PFD_STEREO | /**< 颜色缓存区是立体缓存 */
PFD_DOUBLEBUFFER, /**< 颜色缓存区是双缓存 */
PFD_TYPE_RGBA, /**< 使用RGBA颜色格式 */
m_BitsPerPixel, /**< 颜色缓存区中颜色值所占的位深 */
0, 0, 0, 0, 0, 0, /**< 使用默认的颜色设置 */
0, /**< 无Alpha缓存 */
0, /**< 颜色缓存区中alpha成分的移位计数 */
0, /**< 无累计缓存区 */
0, 0, 0, 0, /**< 累计缓存区无移位 */
32, /**< 32位深度缓存 */
0, /**< 无蒙版缓存 */
0, /**< 无辅助缓存区 */
PFD_MAIN_PLANE, /**< 必须为PFD_MAIN_PLANE,设置为主绘图层 */
0, /**< 表示OpenGL实现所支持的上层或下层平面的数量 */
0, 0, 0 /**< 过时,已不再使用 */
};
DWORD windowStyle = WS_OVERLAPPEDWINDOW & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX &~WS_MINIMIZEBOX; /**< 定义我们窗口类型,使用常规设定,去掉最大化按钮,并不能改变窗体大小 */
DWORD windowExtendedStyle = WS_EX_APPWINDOW;
if (m_IsFullScreen == true) /**< 如果为全屏模式,尝试转化为全屏模式 */
{
if (ChangeScreenSetting() == false)
{ /**< 全屏模式转换失败,弹出对话框提示,并尝试窗口模式 */
MessageBox(HWND_DESKTOP, "模式转换失败.\n在窗口模式下运行.", "Error", MB_OK | MB_ICONEXCLAMATION);
m_IsFullScreen = false; /**< 设置为窗口模式 */
}
else /**< 如果为窗口模式 */
{
//ShowCursor(false); /**< 隐藏鼠标 */
windowStyle = WS_POPUP; /**< 设置窗口模式为顶层窗口 */
windowExtendedStyle |= WS_EX_TOPMOST;
}
}
/// 调整我们窗口的大小,使其客户区的大小为我们设置的大小
RECT windowRect = {GetPosX(), GetPosY(), GetPosX() + GetWidth(), GetPosY() + GetHeight()};
if (m_IsFullScreen == false) /**< 在窗口模式下使用 */
{
windowExtendedStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; /**< 使窗口具有3D外观 */
int wid = GetSystemMetrics(SM_CXSCREEN); /**< 获取当前屏幕宽 */
int hei = GetSystemMetrics(SM_CYSCREEN); /**< 获取当前屏幕高 */
nX = (wid - GetWidth()) / 2; /**< 计算窗口居中用 */
nY = (hei - GetHeight()) / 2;
/// 调整我们窗口的大小,使其客户区的大小为我们设置的大小
AdjustWindowRectEx(&windowRect, windowStyle, 0, windowExtendedStyle);
/// 判断窗口的左上角是否隐藏在桌面外
if (windowRect.left < 0) /**< 如果窗口X坐标为负,移动坐标到0处,并调整窗口的位置 */
{
windowRect.right -= windowRect.left;
windowRect.left = 0;
}
if (windowRect.top < 0) /**< 如果窗口Y坐标为负,移动坐标到0处,并调整窗口的位置 */
{
windowRect.bottom -= windowRect.top;
windowRect.top = 0;
}
}
/// 创建窗口
m_hWnd = CreateWindowEx(windowExtendedStyle, /**< 窗口的扩展风格 */
class_name, /**< 窗口的类名 */
window_title, /**< 窗口标题 */
windowStyle, /**< 窗口的风格 */
nX,nY, /**< 窗口的左上角位置 */
windowRect.right - windowRect.left, /**< 窗口的宽度 */
windowRect.bottom - windowRect.top, /**< 窗口的高度 */
HWND_DESKTOP, /**< 窗口的父窗口为桌面 */
0, /**< 无菜单 */
h_instance, /**< 传入窗口的实例句柄 */
lpParam); /**< 传入程序类参数 */
while (m_hWnd != 0) /**< 窗口是否创建成功 */
{
m_hDC = GetDC(m_hWnd); /**< 返回窗口的设备描述表 */
if (m_hDC == 0) /**< 如果为空 */
{ /**< 失败 */
break;
}
GLuint PixelFormat = ChoosePixelFormat(m_hDC, &pfd); /**< 查找一个兼容的像素格式 */
if (PixelFormat == 0) /**< 如果没找到 */
{ /**< 失败 */
break;
}
if (SetPixelFormat(m_hDC, PixelFormat, &pfd) == false) /**< 设置像素格式 */
{ /**< 失败 */
break;
//.........这里部分代码省略.........
示例13: GetSpeed
void cProjectileEntity::HandlePhysics(float a_Dt, cChunk & a_Chunk)
{
if (m_IsInGround)
{
// Already-grounded projectiles don't move at all
return;
}
Vector3d PerTickSpeed = GetSpeed() / 20;
Vector3d Pos = GetPosition();
// Trace the tick's worth of movement as a line:
Vector3d NextPos = Pos + PerTickSpeed;
cProjectileTracerCallback TracerCallback(this);
if (!cLineBlockTracer::Trace(*m_World, TracerCallback, Pos, NextPos))
{
// Something has been hit, abort all other processing
return;
}
// The tracer also checks the blocks for slowdown blocks - water and lava - and stores it for later in its SlowdownCoeff
// Test for entity collisions:
cProjectileEntityCollisionCallback EntityCollisionCallback(this, Pos, NextPos);
a_Chunk.ForEachEntity(EntityCollisionCallback);
if (EntityCollisionCallback.HasHit())
{
// An entity was hit:
Vector3d HitPos = Pos + (NextPos - Pos) * EntityCollisionCallback.GetMinCoeff();
// DEBUG:
LOGD("Projectile %d has hit an entity %d (%s) at {%.02f, %.02f, %.02f} (coeff %.03f)",
m_UniqueID,
EntityCollisionCallback.GetHitEntity()->GetUniqueID(),
EntityCollisionCallback.GetHitEntity()->GetClass(),
HitPos.x, HitPos.y, HitPos.z,
EntityCollisionCallback.GetMinCoeff()
);
OnHitEntity(*(EntityCollisionCallback.GetHitEntity()), HitPos);
}
// TODO: Test the entities in the neighboring chunks, too
// Update the position:
SetPosition(NextPos);
// Add slowdown and gravity effect to the speed:
Vector3d NewSpeed(GetSpeed());
NewSpeed.y += m_Gravity / 20;
NewSpeed *= TracerCallback.GetSlowdownCoeff();
SetSpeed(NewSpeed);
SetRotationFromSpeed();
SetPitchFromSpeed();
// DEBUG:
LOGD("Projectile %d: pos {%.02f, %.02f, %.02f}, speed {%.02f, %.02f, %.02f}, rot {%.02f, %.02f}",
m_UniqueID,
GetPosX(), GetPosY(), GetPosZ(),
GetSpeedX(), GetSpeedY(), GetSpeedZ(),
GetRotation(), GetPitch()
);
}
示例14: SetPosX
void CBase::Update(float fElapsedTime)
{
SetPosX( GetPosX() + GetVelX() * fElapsedTime );
SetPosY( GetPosY() + GetVelY() * fElapsedTime );
}
示例15: UNUSED
/// Moves pickups from above this hopper into it. Returns true if the contents have changed.
bool cHopperEntity::MovePickupsIn(cChunk & a_Chunk, Int64 a_CurrentTick)
{
UNUSED(a_CurrentTick);
class cHopperPickupSearchCallback :
public cEntityCallback
{
public:
cHopperPickupSearchCallback(const Vector3i & a_Pos, cItemGrid & a_Contents) :
m_Pos(a_Pos),
m_bFoundPickupsAbove(false),
m_Contents(a_Contents)
{
}
virtual bool Item(cEntity * a_Entity) override
{
ASSERT(a_Entity != NULL);
if (!a_Entity->IsPickup() || a_Entity->IsDestroyed())
{
return false;
}
Vector3f EntityPos = a_Entity->GetPosition();
Vector3f BlockPos(m_Pos.x + 0.5f, (float)m_Pos.y + 1, m_Pos.z + 0.5f); // One block above hopper, and search from center outwards
double Distance = (EntityPos - BlockPos).Length();
if (Distance < 0.5)
{
if (TrySuckPickupIn((cPickup *)a_Entity))
{
return false;
}
}
return false;
}
bool TrySuckPickupIn(cPickup * a_Pickup)
{
cItem & Item = a_Pickup->GetItem();
for (int i = 0; i < ContentsWidth * ContentsHeight; i++)
{
if (m_Contents.IsSlotEmpty(i))
{
m_bFoundPickupsAbove = true;
m_Contents.SetSlot(i, Item);
a_Pickup->Destroy(); // Kill pickup
return true;
}
else if (m_Contents.GetSlot(i).IsEqual(Item) && !m_Contents.GetSlot(i).IsFullStack())
{
m_bFoundPickupsAbove = true;
int PreviousCount = m_Contents.GetSlot(i).m_ItemCount;
Item.m_ItemCount -= m_Contents.ChangeSlotCount(i, Item.m_ItemCount) - PreviousCount; // Set count to however many items were added
if (Item.IsEmpty())
{
a_Pickup->Destroy(); // Kill pickup if all items were added
}
return true;
}
}
return false;
}
bool FoundPickupsAbove(void) const
{
return m_bFoundPickupsAbove;
}
protected:
Vector3i m_Pos;
bool m_bFoundPickupsAbove;
cItemGrid & m_Contents;
};
cHopperPickupSearchCallback HopperPickupSearchCallback(Vector3i(GetPosX(), GetPosY(), GetPosZ()), m_Contents);
a_Chunk.ForEachEntity(HopperPickupSearchCallback);
return HopperPickupSearchCallback.FoundPickupsAbove();
}