示例#1
0
	float CircleCollider::GetCenterY(bool relativeToEntity)
	{
		if (relativeToEntity)
			return offset.y;
		else
			return GetEntityPosition().y + offset.y;
	}
示例#2
0
	bool CircleCollider::IntersectsPoint(const Vector2& point, CollisionData *collisionData)
	{
		Vector2 ePos = GetEntityPosition();

		Vector2 diff = point - (ePos + offset);
		return (diff.IsInRange(radius));
	}
示例#3
0
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));
}
示例#5
0
	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);
	}
示例#6
0
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 );
    }
}