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