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