float CircleCollider::GetCenterY(bool relativeToEntity) { if (relativeToEntity) return offset.y; else return GetEntityPosition().y + offset.y; }
bool CircleCollider::IntersectsPoint(const Vector2& point, CollisionData *collisionData) { Vector2 ePos = GetEntityPosition(); Vector2 diff = point - (ePos + offset); return (diff.IsInRange(radius)); }
void BattleManagerScreen::onEntityEffectEvent( CCObject* e ) { GameEntityEffectEvt* evt = dynamic_cast<GameEntityEffectEvt*>(e); if(!evt) return; if( evt->name.compare("Death Grip") == 0 ) { CCLog("death grip"); kmVec2 pOrigin; kmVec2 pTarget; if( !GetEntityPosition(evt->origin, pOrigin) || !GetEntityPosition(evt->target, pTarget) ) { CCLog("aborting death grip evt due to invalid target(s)"); } kmVec2 toTarget; kmVec2Subtract(&toTarget, &pTarget, &pOrigin); kmVec2 u_toTarget; kmVec2Normalize(&u_toTarget, &toTarget); float leashDistance = 1; //one game unit kmVec2 dv; kmVec2Scale(&dv, &u_toTarget, leashDistance ); kmVec2 posEnd; kmVec2Add(&posEnd, &pOrigin, &dv); //convert back to screen coordinates kmVec2Scale(&posEnd, &posEnd, VIEW_UNIT_CONVERSION); GameEntityView* tView = getViewForEntity(evt->target); tView->setPosition(posEnd.x, posEnd.y); } }
//----------------------------------------------------------------------------- // called when we're ticked... //----------------------------------------------------------------------------- void CEntityPanel::OnTick() { // Determine if panel parent should switch ComputeParent(); // If we should shouldn't draw, don't bother with any of this if ( !ShouldDraw() ) return; // Update our current position int sx, sy; GetEntityPosition( sx, sy ); // Recalculate our size ComputeAndSetSize(); // Set the position SetPos( (int)(sx + m_OffsetX + 0.5f), (int)(sy + m_OffsetY + 0.5f)); }
bool CircleCollider::IntersectsLine(const Vector2& start, const Vector2& end, float lineRadius, CollisionData *collisionData) { //Algorithm stolen from: http://www.gamedev.net/topic/304578-finite-line-circle-intersection/page__view__findpost__p__2938618 Vector2 ePos = GetEntityPosition(); Vector2 dir = end - start; Vector2 diff = (ePos + offset) - start; float t = diff.Dot(dir) / dir.GetSquaredMagnitude(); if (t < 0.0f) t = 0.0f; if (t > 1.0f) t = 1.0f; Vector2 closest = (t * dir) + start; Vector2 d = (ePos + offset) - closest; if (collisionData) { collisionData->hitPoint = closest; } return d.GetSquaredMagnitude() <= (radius + lineRadius) * (radius + lineRadius); }
void CHudPlayerOverlay::OnTick( ) { BaseClass::OnTick(); if (!IsLocalPlayerInTactical() || !engine->IsInGame()) { Hide(); return; } // Don't draw if I'm not visible in the tactical map if ( MapData().IsEntityVisibleToTactical( GetEntity() ) == false ) { Hide(); return; } // Don't draw it if I'm on team 0 (haven't decided on a team) C_BaseTFPlayer *pPlayer = m_hPlayer.Get(); if (!pPlayer || (pPlayer->GetTeamNumber() == 0) || (pPlayer->GetClass() == TFCLASS_UNDECIDED)) { Hide(); return; } SetVisible( true ); char *pName = g_PR->Get_Name( m_PlayerNum ); if ( pName ) { m_pName->SetName( pName ); } else { Hide(); return; } Vector pos, screen; C_BaseTFPlayer *tf2player = dynamic_cast<C_BaseTFPlayer *>( GetEntity() ); int iteam = 0; int iclass = 0; if ( tf2player ) { iteam = tf2player->GetTeamNumber(); iclass = tf2player->PlayerClass(); // FIXME: Get max health for player m_pHealth->SetHealth( (float)tf2player->GetHealth() / (float)100.0f ); } m_pClass->SetImage( 0 ); if ( iteam != 0 && iclass != TFCLASS_UNDECIDED ) m_pClass->SetTeamAndClass( iteam, iclass ); // Update our position on screen int sx, sy; GetEntityPosition( sx, sy ); // Set the position SetPos( (int)(sx + m_OffsetX + 0.5f), (int)(sy + m_OffsetY + 0.5f)); // Add it in m_pHealth->SetVisible( true ); m_pName->SetVisible( true ); m_pClass->SetVisible( true ); if ( MapData().m_Players[ m_PlayerNum - 1 ].m_bSelected ) { m_pSelected->SetVisible( true ); } else { m_pSelected->SetVisible( false ); } if ( MapData().m_Players[ m_PlayerNum - 1 ].m_nSquadNumber != 0 ) { char sz[ 32 ]; Q_snprintf( sz, sizeof( sz ), "%i", MapData().m_Players[ m_PlayerNum - 1 ].m_nSquadNumber ); m_pSquad->SetSquad( sz ); m_pSquad->SetVisible( true ); } else { m_pSquad->SetVisible( false ); } // Hide details if it's an enemy if ( ArePlayersOnSameTeam( engine->GetPlayer(), m_PlayerNum ) == false ) { m_pHealth->SetVisible( false ); m_pName->SetVisible( false ); m_pSelected->SetVisible( false ); m_pSquad->SetVisible( false ); // Only show class icon m_pClass->SetVisible( true ); } }