Control de disparo

Gestión de los disparos
Enumeramos los diferentes jugadores que habrá:

enum FACTION
{
	FT_TANK_GREEN,
	FT_TANK_RED,
	FT_MISSILE_GREEN,
	FT_MISSILE_RED,
	FT_WALL,
};

Con estos identificadores podremos asignar las puntuaciones y validar si los impactos son válidos o no
Control del jugador cuando validamos en los impactos de un misil que no sea del mismo bando. Es decir si misil azul con un tanque azul, etc.

En el caso del misil

// Return FALSE if: Green Missile collide on the Green Tank  OR  Red Missile collide on the Red Tank
else if (a_node2->GetFaction() == FT_TANK_GREEN && m_eFaction == FT_MISSILE_GREEN || 
	a_node2->GetFaction() == FT_TANK_RED && m_eFaction == FT_MISSILE_RED)
	return false;

 

En el caso del jugador

// No Collision for Green Tank & Green Missile
if (this->GetFaction() == FT_TANK_GREEN && a_node2->GetFaction() == FT_MISSILE_GREEN)
	return false;

// No Collision for Red Tank & Red Missile
if (this->GetFaction() == FT_TANK_RED && a_node2->GetFaction() == FT_MISSILE_RED)
	return false;


En el caso de recibir un impacto mostramos la destrucción del jugador

if (this->GetFaction() == FT_TANK_GREEN)
{
	m_tank->LoadTexture("./Images/tank1_explode.png");
	Respawn(900, 400);
}


Mostramos al jugador cuando se carga otra vez en las coordenadas de inicio

if (this->GetFaction() == FT_TANK_GREEN)
	m_tank->LoadTexture("./Images/tank1_body.png");
else
	m_tank->LoadTexture("./Images/tank2_body.png");

Función donde ser realiza la gestión de impacto de los proyectiles

bool Missile::TestCollide(Node* a_node2)
{
	if (this->GetPosition().isCollidingCircles(a_node2->GetPosition(), m_radius, a_node2->GetRadius() ))
	{
		// Missile collide on the Wall for 1st time, so it will bounce back
		if (a_node2->GetFaction() == FT_WALL && m_collideCount == 0)
		{

			if (m_worldTrans.GetRotation(1) == 0)
			{
				// Robound 180 degree for top side wall
				this->Rotate(180);
			}
			else if (this->prevpos.m_X < a_node2->GetPosition().GetX() &&
				this->prevpos.m_Y >= a_node2->GetPosition().GetY() - a_node2->GetRadius() &&
				this->prevpos.m_Y <= a_node2->GetPosition().GetY() + a_node2->GetRadius())
			{
				// Working OK for right side wall
				float t_Rotation = m_worldTrans.GetRotation(1);
				this->Rotate(360 - t_Rotation * -2.0f);
			}
			else if (this->prevpos.m_X > a_node2->GetPosition().GetX() &&
				this->prevpos.m_Y >= a_node2->GetPosition().GetY() - a_node2->GetRadius() &&
				this->prevpos.m_Y <= a_node2->GetPosition().GetY() + a_node2->GetRadius())
			{
				// Working OK for left side wall
				float t_Rotation = m_worldTrans.GetRotation(1);
				this->Rotate(360 - t_Rotation * 2.0f);
			}
			else if (this->prevpos.m_Y > a_node2->GetPosition().GetY())
			{
				// Working OK for upper wall
				float t_Rotation = m_worldTrans.GetRotation(2);
				this->Rotate(180 - t_Rotation * 2.0f);
			}
			else
			{
				// Working OK for lower wall
				float t_Rotation = m_worldTrans.GetRotation(2);
				this->Rotate(180 + t_Rotation * 2.0f);
			}

			m_collideCount = m_collideCount + 1;	//Increment count of Collision
			return false;
		}  
		// Return FALSE if: Green Missile collide on the Green Tank  OR  Red Missile collide on the Red Tank
		else if (a_node2->GetFaction() == FT_TANK_GREEN && m_eFaction == FT_MISSILE_GREEN || 
			a_node2->GetFaction() == FT_TANK_RED && m_eFaction == FT_MISSILE_RED)
			return false;
		else
			return true;	//Otherwise, return TRUE for other conditions
	}
	else
		return false;
}

 

Fragmento de código encargado de la creación de los proyectiles

//Missile initial velocity
Vector3 missileVelocity;
missileVelocity.m_X = 0.0f;
missileVelocity.m_Y = -5.0f;
missileVelocity.m_Z = 0.0f;

Matrix3x3 m;
m.Identity();
m.SetTranslation(0, -35);

Matrix3x3 missileWorld = this->m_worldTrans * m;

if (m_eFaction == FT_TANK_GREEN)
	GameController::createMissile(missileWorld, missileVelocity, FT_MISSILE_GREEN);
else
	GameController::createMissile(missileWorld, missileVelocity, FT_MISSILE_RED);


Para el pintado de los proyectiles seguirá el mismo funcionamiento que el resto de elementos de juego desde DrawGrid se llamara a Draw() que finamente llamara a la misma función de Sprite