Alta de un jugador

Pasos seguidos en la creación de un tercer jugador:

Declaramos el objeto player en GameController

Tank* m_player1;
Tank* m_player2;

 

Añadimos nuevos valores e la enumeración FACTION en Node

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

 

En la función LoadAssets llamamos al constructor de Tank al cual enviamos las imágenes necesarias para Sprite así como las coordenadas de creación por
defecto y la facción a la cual pertenecerá el jugador

m_player1 = new Tank("./Images/tank1_body.png", "./Images/tank1_turret.png", 900, 400, FT_TANK_GREEN);
m_player2 = new Tank("./Images/tank2_body.png","./Images/tank2_turret.png", 125, 400, FT_TANK_RED);

 

Añadimos el objeto a la lista de elementos a tener en cuenta cuando se realice el cálculo de colisiones

m_pkGridIndex->AddNode(m_player1);
m_pkGridIndex->AddNode(m_player2);

 

Añadimos el destructor para liberar memoria

if( m_player1 != NULL )
{
	//TODO free player tank and turret sprites
	delete m_player1;
}

 

Una vez iniciado el estado de GAME procedemos a la asignación de los controles del jugador

Player 1

  • Desplazarse hacia delante Flecha arriba
  • Desplazarse hacia atrás Flecha abajo
  • Girar derecha Flecha derecha
  • Girar izquierda Flecha izquierda
  • Disparar misil Enter
  • Girar la torreta a derecha Tecla Control derecho
  • Girar la torreta a izquierda Tecla Mayús> Derecho

 

/***********************************************************/
//	Player 1 Key Control
/***********************************************************/

//If RIGHT KEY PRESSED
if(m_keyboard->GetKeyStates(SDLK_RIGHT) == KEY_HELD)
	m_player1->Rotate(-50.0f * dT);

//If LEFT KEY PRESSED
if(m_keyboard->GetKeyStates(SDLK_LEFT) == KEY_HELD)
	m_player1->Rotate(50.0f * dT);

//If UP KEY PRESSED
if(m_keyboard->GetKeyStates(SDLK_UP) == KEY_HELD)
{
	//moving forward
	m_player1->m_acc.m_X += 0.0f;
	m_player1->m_acc.m_Y -= 2.0f;

	if(m_player1->m_acc.m_Y < -100.0f)
		m_player1->m_acc.m_Y = -100.0f;

	m_player1->Translate(0.0f, m_player1->m_acc.m_Y * dT);
}
else if (m_player1->m_acc.m_Y  < 0)
{
	m_player1->m_acc.m_Y += 2.0f;
	if(m_player1->m_acc.m_Y > 0)
		m_player1->m_acc.m_Y = 0.0f;
		m_player1->Translate(0.0f, m_player1->m_acc.m_Y * dT);	
}

//If DOWN KEY PRESSED
if(m_keyboard->GetKeyStates(SDLK_DOWN) == KEY_HELD)
{
	//moving backward
	m_player1->m_acc.m_X += 0.0f;
	m_player1->m_acc.m_Y += 2.0f;

	if(m_player1->m_acc.m_Y > 100.0f)
		m_player1->m_acc.m_Y = 100.0f;

	m_player1->Translate(0.0f, m_player1->m_acc.m_Y * dT);	
}
else if (m_player1->m_acc.m_Y  > 0)
{
	m_player1->m_acc.m_Y -= 2.0f;
	if(m_player1->m_acc.m_Y < 0)
		m_player1->m_acc.m_Y = 0.0f;

	m_player1->Translate(0.0f, m_player1->m_acc.m_Y * dT);	
}

//If RIGHT SHIFT KEY PRESSED
if(m_keyboard->GetKeyStates(SDLK_RSHIFT) == KEY_HELD)
{
	m_player1->RotateTurret(50.0f * dT);
}

//If RIGHT CTRL KEY PRESSED
if(m_keyboard->GetKeyStates(SDLK_RCTRL) == KEY_HELD)
{
	m_player1->RotateTurret(-50.0f * dT);
}

//If RETURN KEY PRESSED
if(m_keyboard->GetKeyStates(SDLK_RETURN) == KEY_HELD)
{
	m_player1->Shoot();		//Fire Missile
}

 

Desde la función Draw mostraremos la puntuación del jugador

if (m_player1->m_szProfileName == "")
{
	tmpScore = "Tank 1: ";
	tmpScore = tmpScore.append(itoa(m_player1->m_score, tmpNum, 10));
}
else
	tmpScore = m_player1->m_szProfileName + ": " + itoa(m_player1->m_score, tmpNum, 10);


//Draw Player1 Score
m_textfont->DrawTxt(tmpScore, 75, 70, 20, 30, 1);

 

Añadimos al control de colisiones al tercer jugador :

if ((nd2->GetFaction() == FT_MISSILE_GREEN || nd2->GetFaction() == FT_MISSILE_RED) && nd2->m_timer == 0 ||
	(nd2->GetFaction() == FT_MISSILE_GREEN || nd2->GetFaction() == FT_MISSILE_RED) && (nd1->GetFaction() == FT_TANK_GREEN || nd1->GetFaction() == FT_TANK_RED))
{
	TNode::iterator it = AllNodes.begin();
	while(it != AllNodes.end())
	{
		if(nd2 == *it)
		{
			AllNodes.erase(it);
			tn1[j] = NULL;

			if (nd2->GetFaction() != FT_MISSILE_GREEN && nd2->GetFaction() != FT_MISSILE_RED)
				delete nd2;
		        break;
	        }
		it++;
	}
}


Creamos los objetos misiles de la nueva facción

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

 

Añadimos también el control del tercer 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;
else
   return true; //Otherwise, return TRUE for other conditions

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;

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");