本文整理汇总了C++中IPhysicalEntity类的典型用法代码示例。如果您正苦于以下问题:C++ IPhysicalEntity类的具体用法?C++ IPhysicalEntity怎么用?C++ IPhysicalEntity使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了IPhysicalEntity类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: return
bool CSmartMine::ShouldStartTrackingEntity( const EntityId entityId ) const
{
// Always track player...
if (entityId == g_pGame->GetIGameFramework()->GetClientActorId())
{
return true;
}
// ... or any AI
const SAutoaimTarget* pTargetInfo = g_pGame->GetAutoAimManager().GetTargetInfo( entityId );
if(pTargetInfo != NULL)
{
return (pTargetInfo->pActorWeak.lock() != NULL);
}
// Also track kickable and pickable objects
IEntity* pEntity = gEnv->pEntitySystem->GetEntity( entityId );
IScriptTable* pScriptTable = (pEntity != NULL) ? pEntity->GetScriptTable() : NULL;
if(pScriptTable != NULL)
{
SmartScriptTable propertiesTable;
if(pScriptTable->GetValue("Properties", propertiesTable))
{
int pickable = 0, kickable = 0;
propertiesTable->GetValue("bPickable", pickable);
propertiesTable->GetValue("bInteractLargeObject", kickable);
if(pickable)
{
// Filter out items/weapons
pickable = (g_pGame->GetIGameFramework()->GetIItemSystem()->GetItem(entityId) == NULL);
}
if (pickable || kickable)
{
//Check if object is moving
IPhysicalEntity* pEntityPhysics = pEntity->GetPhysics();
if(pEntityPhysics != NULL)
{
pe_status_dynamics entityDynamics;
if(pEntityPhysics->GetStatus(&entityDynamics))
{
return (entityDynamics.v.len2() > 0.1f);
}
}
}
}
}
return false;
}
示例2: CRY_ASSERT
//------------------------------------------------------------------------
void CVehicleDamageBehaviorImpulse::OnDamageEvent(EVehicleDamageBehaviorEvent event, const SVehicleDamageBehaviorEventParams& behaviorParams)
{
if (event == eVDBE_Hit || event == eVDBE_VehicleDestroyed || event == eVDBE_ComponentDestroyed)
{
IEntity* pEntity = m_pVehicle->GetEntity();
CRY_ASSERT(pEntity);
IPhysicalEntity* pPhysEntity = pEntity->GetPhysics();
if (!pPhysEntity)
return;
pe_status_dynamics dyn;
pPhysEntity->GetStatus(&dyn);
float vehicleMass = dyn.mass;
float r = cry_random(0.0f, 2.f);
float impulseForce = cry_random(m_forceMin, m_forceMax) * vehicleMass;
Vec3 impulseDir(m_impulseDir);
if (!m_worldSpace)
impulseDir = m_pVehicle->GetEntity()->GetWorldTM().TransformVector(impulseDir);
pe_action_impulse actionImpulse;
Vec3& impulse = actionImpulse.impulse;
Vec3& angImpulse = actionImpulse.angImpulse;
impulse = impulseDir * impulseForce;
angImpulse = m_pVehicle->GetEntity()->GetWorldTM().TransformVector(m_angImpulse);
if (r <= 0.75f)
{
float r1 = cry_random(-0.35f, 0.35f);
angImpulse += dyn.v * r1 * max(1.0f, dyn.w.GetLength());
angImpulse *= vehicleMass;
}
else
{
float r1 = cry_random(-0.25f, 0.25f);
float r2 = cry_random(-0.5f, 0.5f);
impulse.z += abs(dyn.v.y) * r1 * vehicleMass;
angImpulse.x += dyn.v.y * r2 * vehicleMass * max(1.0f, dyn.w.GetLength() * 1.5f);
}
if (m_pImpulseLocation)
actionImpulse.point = m_pImpulseLocation->GetWorldSpaceTranslation();
pPhysEntity->Action(&actionImpulse);
}
}
示例3: CRY_ASSERT_MESSAGE
//-----------------------------------------------------------------------
void CSpectacularKill::DeathBlow(CActor& targetActor)
{
CRY_ASSERT_MESSAGE(m_isBusy, "spectacular kill should be in progress when triggering the death blow");
if (!m_isBusy)
return;
if (targetActor.IsDead())
return;
Vec3 targetDir = targetActor.GetEntity()->GetForwardDir();
{
HitInfo hitInfo;
hitInfo.shooterId = m_pOwner->GetEntityId();
hitInfo.targetId = targetActor.GetEntityId();
hitInfo.damage = 99999.0f; // CERTAIN_DEATH
hitInfo.dir = targetDir;
hitInfo.normal = -hitInfo.dir; // this has to be in an opposite direction from the hitInfo.dir or the hit is ignored as a 'backface' hit
hitInfo.type = CGameRules::EHitType::StealthKill;
g_pGame->GetGameRules()->ClientHit(hitInfo);
}
// WARNING: RagDollize resets the entity's rotation!
// [7/30/2010 davidr] FixMe: If the entity isn't dead here (because is immortal or any other reason) ragdollizing it will
// leave it on an inconsistent state (usually only reproducible on debug scenarios)
targetActor.GetGameObject()->SetAspectProfile(eEA_Physics, eAP_Ragdoll);
// Give a small nudge in the hit direction to make the target fall over
const SSpectacularKillParams* pSpectacularKillParams = GetParamsForClass(targetActor.GetEntity()->GetClass());
CRY_ASSERT(pSpectacularKillParams);
if (pSpectacularKillParams && (pSpectacularKillParams->impulseScale > 0.0f) && (pSpectacularKillParams->impulseBone != -1))
{
const float killDeathBlowVelocity = pSpectacularKillParams->impulseScale; // desired velocity after impulse in meters per second
IPhysicalEntity* pTargetPhysics = targetActor.GetEntity()->GetPhysics();
if (pTargetPhysics)
{
pe_simulation_params simulationParams;
pTargetPhysics->GetParams(&simulationParams);
pe_action_impulse impulse;
impulse.partid = pSpectacularKillParams->impulseBone;
impulse.impulse = targetDir*killDeathBlowVelocity*simulationParams.mass; // RagDollize reset the entity's rotation so I have to use the value I cached earlier
pTargetPhysics->Action(&impulse);
}
}
m_deathBlowState = eDBS_Done;
}
示例4: OnExit
void CPlayerStateFly::OnExit( CPlayer& player )
{
player.CreateScriptEvent("printhud",0,"FlyMode/NoClip OFF");
pe_player_dynamics simPar;
IPhysicalEntity* piPhysics = player.GetEntity()->GetPhysics();
if (!piPhysics || piPhysics->GetParams(&simPar) == 0)
{
return;
}
CPlayerStateUtil::PhySetNoFly( player, simPar.gravity );
}
示例5: UpdateInterpolation
void CNetPlayerInput::UpdateInterpolation()
{
Vec3 desiredPosition = m_curInput.position;
Vec3 desiredVelocity = m_curInput.deltaMovement * g_pGameCVars->pl_netSerialiseMaxSpeed;
// Use the physics pos as the entity position is a frame behind at this point
IPhysicalEntity * pent = m_pPlayer->GetEntity()->GetPhysics();
pe_status_pos psp;
pent->GetStatus(&psp);
Vec3 entPos = psp.pos;
pe_status_living psl;
psl.velGround.zero();
pent->GetStatus(&psl);
float dt = gEnv->pTimer->GetFrameTime();
// New data?
if (m_newInterpolation)
m_lerper.AddNewPoint(m_curInput.position, desiredVelocity, entPos, m_curInput.standingOn);
bool bInAirOrJumping = m_pPlayer->GetActorStats()->inAir > 0.01f || m_pPlayer->GetActorStats()->onGround < 0.01f;
// Predict
CNetLerper::SPrediction prediction;
m_lerper.Update(gEnv->pTimer->GetFrameTime(), entPos, prediction, psl.velGround, bInAirOrJumping);
// Update lerp velocity
m_lerpVel = prediction.lerpVel;
// Should Snap
if (prediction.shouldSnap)
{
m_pPlayer->GetEntity()->SetPos(prediction.predictedPos);
pe_action_set_velocity actionVel;
actionVel.v = prediction.lerpVel;
pent->Action(&actionVel);
}
#if !defined(_RELEASE)
// Debug Draw
if (g_pGameCVars->pl_debugInterpolation)
m_lerper.DebugDraw(prediction, entPos, m_newInterpolation);
else
SAFE_DELETE(m_lerper.m_debug);
#endif
m_newInterpolation = false;
}
示例6: CameraSync
void CGameRealtimeRemoteUpdateListener::CameraSync()
{
IGame *pGame = gEnv->pGame;
if(!pGame)
return;
IGameFramework *pGameFramework=pGame->GetIGameFramework();
if(!pGameFramework)
return;
IViewSystem *pViewSystem=pGameFramework->GetIViewSystem();
if(!pViewSystem)
return;
IView *pView=pViewSystem->GetActiveView();
if(!pView)
return;
IEntity *pEntity = gEnv->pEntitySystem->GetEntity(pView->GetLinkedId());
if(!pEntity)
return;
IActor *pPlayer=pGameFramework->GetClientActor();
if ( !pPlayer )
return;
IEntity * pPlayerEntity = pPlayer->GetEntity();
if (!pPlayerEntity)
return;
IPhysicalEntity * piPlayerPhysics = pPlayerEntity->GetPhysics();
if ( !piPlayerPhysics )
return;
pe_player_dimensions dim;
piPlayerPhysics->GetParams( &dim );
//TODO: only GDCE2011, in the future make this game magic constant be gone in LiveCreate 2.0
// game player view code has a complex position code path, the sync position should be
// honoured by game code when live creaate camera sync is enabled
m_Position.z -= 1.62f;
pEntity->SetPos(m_Position);
pPlayerEntity->Hide(false);
pViewSystem->SetOverrideCameraRotation(true,Quat::CreateRotationVDir(m_ViewDirection));
pPlayerEntity->Hide(true);
SEntityUpdateContext ctx;
pPlayer->Update( ctx, 0 );
m_bCameraSync = true;
}
示例7: ResetVelocity
void ResetVelocity(SActivationInfo* pActInfo)
{
IEntity* pGraphEntity = pActInfo->pEntity;
if (pGraphEntity)
{
IPhysicalEntity* pPhysicalEntity = pGraphEntity->GetPhysics();
if (pPhysicalEntity && pPhysicalEntity->GetType() != PE_STATIC)
{
pe_action_set_velocity setVel;
setVel.v.zero();
setVel.w.zero();
pPhysicalEntity->Action(&setVel);
}
}
}
示例8: PhySetNoFly
void CPlayerStateUtil::PhySetNoFly( CPlayer& player, const Vec3& gravity )
{
IPhysicalEntity* pPhysEnt = player.GetEntity()->GetPhysics();
if (pPhysEnt != NULL)
{
pe_player_dynamics pd;
pd.kAirControl = player.GetAirControl();
pd.kAirResistance = player.GetAirResistance();
pd.bSwimming = false;
pd.gravity = gravity;
player.m_actorPhysics.gravity = gravity;
pPhysEnt->SetParams(&pd);
}
}
示例9: ProcessEvent
virtual void ProcessEvent( EFlowEvent event, SActivationInfo *pActInfo )
{
switch (event)
{
case eFE_Initialize:
pActInfo->pGraph->SetRegularlyUpdated( pActInfo->myID, true );
m_Activated = false;
break;
case eFE_Update:
{
bool bReset = GetPortBool(pActInfo, IN_RESET);
bool bCondition = GetPortBool(pActInfo, IN_CONDITION);
if(bReset)
{
ActivateOutput(pActInfo, OUT_SLEEPING, !bCondition);
} else
{
if(bCondition != m_Activated)
{
IEntity * pEntity = pActInfo->pEntity;
if (pEntity)
{
IPhysicalEntity * pPhysEntity = pEntity->GetPhysics();
if (pPhysEntity)
{
pe_status_awake psa;
bool isSleeping = pPhysEntity->GetStatus( &psa ) ? false : true;
ActivateOutput(pActInfo, OUT_SLEEPING, isSleeping);
if(isSleeping)
ActivateOutput(pActInfo, OUT_ONSLEEP, true);
else
ActivateOutput(pActInfo, OUT_ONAWAKE, true);
}
}
m_Activated = bCondition;
}
}
}
}
}
示例10: FUNCTION_PROFILER
bool CCannonBall::RayTraceGeometry( const EventPhysCollision* pCollision, const Vec3& pos, const Vec3& hitDirection, SBackHitInfo* pBackHitInfo )
{
FUNCTION_PROFILER(GetISystem(), PROFILE_GAME);
bool exitPointFound = false;
IPhysicalEntity* pCollider = pCollision->pEntity[1];
assert(pCollider);
pe_params_part partParams;
partParams.partid = pCollision->partid[1];
pe_status_pos posStatus;
if (pCollider->GetParams(&partParams) && pCollider->GetStatus(&posStatus))
{
if (partParams.pPhysGeom && partParams.pPhysGeom->pGeom)
{
geom_world_data geomWorldData;
geomWorldData.R = Matrix33(posStatus.q*partParams.q);
geomWorldData.offset = posStatus.pos + (posStatus.q * partParams.pos);
geomWorldData.scale = posStatus.scale * partParams.scale;
geom_contact *pContacts;
intersection_params intersectionParams;
IGeometry* pRayGeometry = s_pRayWrapper->GetRay(pos, hitDirection);
const Vec3 hitDirectionNormalized = hitDirection.GetNormalized();
{ WriteLockCond lock;
const int contactCount = partParams.pPhysGeom->pGeom->IntersectLocked(pRayGeometry,&geomWorldData,0,&intersectionParams,pContacts,lock);
if (contactCount > 0)
{
float bestDistance = 10.0f;
for (int i = (contactCount-1); (i >= 0) && (pContacts[i].t < bestDistance) && ((pContacts[i].n*hitDirectionNormalized) < 0); i--)
{
bestDistance = (float)pContacts[i].t;
pBackHitInfo->pt = pContacts[i].pt;
exitPointFound = true;
}
}
} // lock
}
}
s_pRayWrapper->ResetRay();
return exitPointFound;
}
示例11: PlayAction
void CFists::RaiseWeapon(bool raise, bool faster /*= false*/)
{
//Only when colliding something while running
if(raise && (GetCurrentAnimState()==eFAS_RUNNING || GetCurrentAnimState()==eFAS_JUMPING) && !IsWeaponRaised())
{
if((m_fm && m_fm->IsFiring())||(m_melee && m_melee->IsFiring()))
return;
PlayAction(g_pItemStrings->raise);
SetDefaultIdleAnimation( eIGS_FirstPerson,g_pItemStrings->idle_relaxed);
SetWeaponRaised(true);
//Also give the player some impulse into the opposite direction
CActor *pPlayer = GetOwnerActor();
Vec3 pos;
if(pPlayer)
{
IPhysicalEntity* playerPhysics = pPlayer->GetEntity()->GetPhysics();
if(playerPhysics)
{
IMovementController *pMC = pPlayer->GetMovementController();
if(pMC)
{
SMovementState state;
pMC->GetMovementState(state);
pe_action_impulse impulse;
impulse.iApplyTime = 1;
impulse.impulse = -state.eyeDirection*600.0f;
playerPhysics->Action(&impulse);
pos = state.eyePosition + state.eyeDirection*0.5f;
}
}
}
GetScheduler()->TimerAction(GetCurrentAnimationTime(eIGS_FirstPerson), CSchedulerAction<EndRaiseWeaponAction>::Create(EndRaiseWeaponAction(this)), true);
//Sound and FX feedback
CollisionFeeback(pos,m_currentAnimState);
}
else if(!raise)
SetWeaponRaised(false);
}
示例12: GetPhysics
//------------------------------------------------------------------------
void CVehicleMovementTank::SetLatFriction(float latFric)
{
// todo: do calculation per-wheel?
IPhysicalEntity* pPhysics = GetPhysics();
int numWheels = m_pVehicle->GetWheelCount();
pe_params_wheel params;
params.kLatFriction = latFric;
for (int i=0; i<numWheels; ++i)
{
params.iWheel = i;
pPhysics->SetParams(¶ms, THREAD_SAFE);
}
m_latFriction = latFric;
}
开发者ID:daujiv,项目名称:ParentChild-Relationship-PlayerInteraction-CryEngine-Cplusplus,代码行数:18,代码来源:VehicleMovementTank.cpp
示例13: assert
//------------------------------------------------------------------------
void CVehicleActionDeployRope::AttachOnRope(IEntity *pEntity)
{
assert(pEntity);
if(!pEntity)
return;
IRopeRenderNode *pRopeUpper = GetRopeRenderNode(m_ropeUpperId);
if(!pRopeUpper)
return;
assert(pRopeUpper->GetPointsCount() >= 2);
IPhysicalEntity *pRopePhys = pRopeUpper->GetPhysics();
assert(pRopePhys);
typedef std::vector <Vec3> TVec3Vector;
TVec3Vector points;
int pointCount;
pe_status_rope ropeStatus;
if(pRopePhys->GetStatus(&ropeStatus))
pointCount = ropeStatus.nSegments + 1;
else
pointCount = 0;
if(pointCount < 2)
return;
points.resize(pointCount);
ropeStatus.pPoints = &points[0];
if(pRopePhys->GetStatus(&ropeStatus))
{
Matrix34 worldTM;
worldTM.SetIdentity();
worldTM = Matrix33(m_pVehicle->GetEntity()->GetWorldTM());
worldTM.SetTranslation(ropeStatus.pPoints[1]);
pEntity->SetWorldTM(worldTM);
}
pRopeUpper->LinkEndEntities(m_pVehicle->GetEntity()->GetPhysics(), pEntity->GetPhysics());
}
示例14: RecoilImpulse
void CRecoil::RecoilImpulse(const Vec3& firingPos, const Vec3& firingDir)
{
if (m_recoilParams.impulse > 0.f)
{
EntityId id = (m_pWeapon->GetHostId()) ? m_pWeapon->GetHostId() : m_pWeapon->GetOwnerId();
IEntity* pEntity = gEnv->pEntitySystem->GetEntity(id);
IPhysicalEntity* pPhysicalEntity = pEntity ? pEntity->GetPhysics() : NULL;
if (pPhysicalEntity)
{
pe_action_impulse impulse;
impulse.impulse = -firingDir * m_recoilParams.impulse;
impulse.point = firingPos;
pPhysicalEntity->Action(&impulse);
}
}
}
示例15: DebugUpdate
void CIntersectionAssistanceUnit::DebugUpdate() const
{
if(g_pGameCVars->pl_pickAndThrow.intersectionAssistDebugEnabled)
{
IEntity* pEntity = gEnv->pEntitySystem->GetEntity(m_subjectEntityId);
if(pEntity)
{
IPhysicalEntity *pPhysical = pEntity->GetPhysics();
if(pPhysical)
{
const float fFontSize = 1.2f;
float drawColor[4] = {1.0f, 1.0f, 1.0f, 1.0f};
string sMsg(string().Format(" Entity ID: [%d]", m_subjectEntityId));
sMsg += string().Format("\n Entity Name: [%s]", pEntity->GetName());
sMsg += string().Format("\n EmbedTimer: [%.3f]", m_embedTimer);
sMsg += string().Format("\n EmbedState: [%s]",(m_embedState == eES_None) ? "NONE" : (m_embedState == eES_Evaluating) ? "EVALUATING" : (m_embedState == eES_ReEvaluating) ? "REEVALUATING" : (m_embedState == eES_NotEmbedded) ? "NOT EMBEDDED" : (m_embedState == eES_Embedded) ? "EMBEDDED" : "UNKNOWN");
Vec3 vCurrTrans = m_entityStartingWPos - pEntity->GetWorldPos();
sMsg += string().Format("\n Translation: < %.3f, %.3f, %.3f >", vCurrTrans.x, vCurrTrans.y, vCurrTrans.z );
sMsg += string().Format("\n Trans magnitude: < %.3f >", vCurrTrans.GetLength() );
sMsg += string().Format("\n Trans per sec: < %.3f >", vCurrTrans.GetLength() / g_pGameCVars->pl_pickAndThrow.intersectionAssistTimePeriod );
sMsg += string().Format("\n Collision count: %u", m_collisionCount );
// RENDER
Vec3 vDrawPos = pEntity->GetWorldPos() + Vec3(0.0f,0.0f,0.6f);
gEnv->pRenderer->DrawLabelEx(vDrawPos, fFontSize, drawColor, true, true, sMsg.c_str());
// Box
pe_params_bbox bbox;
if(pPhysical->GetParams(&bbox))
{
ColorB colDefault = ColorB( 127,127,127 );
ColorB embedded = ColorB(255, 0, 0);
ColorB notEmbedded = ColorB(0, 255, 0);
gEnv->pRenderer->GetIRenderAuxGeom()->DrawAABB( AABB(bbox.BBox[0],bbox.BBox[1]), Matrix34(IDENTITY), false, (m_embedState == eES_Embedded) ? embedded : (m_embedState == eES_NotEmbedded) ? notEmbedded : colDefault, eBBD_Faceted);
}
}
}
}
}