So what I'm trying to make is a clone of Galaxian to learn more C++. The problem is that I'm not quite getting what I want. What I'm trying to do is make only one enemy arc and the others just move. I've been trying several things, but it is either that they all arc, or one keeps on arcing and doesn't fall down, or they all fall down. So if someone could give me some suggestions on how to solve my problem, that would make me one happy person Also a strange thing is that my bullet of my enemy does not seem to update. So I guess I have problems passing arrays as parameters and making the right updates.
So what I have done now is that I made an Invader class where I try to handle all the logic movement of the invader so that I can add it in my game.cpp class. I tried to make the functions this way that I can use it on multiple enemies. So i.e. a blue drone, and a yellow drone and a purple drone. Because the original galaxian also had this.
So this is what I did:
Invader.cpp
Invader::Invader()
{
enemyState = MOVING;
enemyBullet = new Bullet();
enemyBullet->isFired = false;
enemyBullet->yPos = 0;
isAlive = true;
countTimer = 10;
countArc = 0;
}
Invader::~Invader()
{}
void Invader::EnemyMovement(Invader invader[], int length)
{
for(int i =0; i< length; i++)
{
switch (enemyState)
{
case MOVING:
{
invader.EnemyMoving(invader, length);
break;
}
case ARCING:
{
invader->EnemyArcing(invader, length);
break;
}
case FALLING:
{
invader->EnemyFalling();
break;
}
case REJOINING:
{
invader->EnemyRejoinging();
break;
}
default:
NONE;
} // switch
}
}
void Invader::EnemyMoving(Invader invader[], int length)
{
//std::cout << "moving"<< std::endl;
for(int i =0; i< length; i++)
{
if(moveLeft)
{
invader.Xpos -= 1;
}
else
{
invader.Xpos += 1;
}
if(invader.countTimer >= 0)
{
invader.countTimer--;
if(invader.countTimer <= 0)
{
invader.countTimer = 0;
enemyState = ARCING;
}
}
}
}
void Invader::EnemyArcing(Invader invader[], int length)
{
std::cout << "arcing"<< std::endl;
for(int i =0; i <length; i++)
{
int radius = 80;
if(invader.countArc == 0)
{
PivotX = invader.Xpos + radius;
PivotY = invader.Ypos;
invader.countArc++;
}
// start arcing
if (countArc != 0)
{
invader.Xpos = PivotX + (radius * cosf(countArc * 2 * PI/360 + PI));
invader.Ypos = PivotY + (radius * sinf(countArc * 2 * PI/360 + PI));
invader.countArc++;
}
// change state
if(invader.countArc == 180)
{
invader.enemyState = FALLING;
invader.countArc = 0; // ready for next time.
}
}
}
void Invader::EnemyFalling()
{
std::cout << "falling"<< std::endl;
countTimer = 10;
Ypos += 1;
UpdateEnemyBullet();
if(Ypos > SCRHEIGHT)
{
enemyState = REJOINING;
}
}
void Invader::EnemyRejoinging()
{
std::cout << "rejoining"<< std::endl;
}
void Invader::ChecksEnemyBorder(Invader invader[], int length)
{
for(int i = 0; i< length; i++)
{
if(invader.isAlive && invader.Xpos > SCRWIDTH - 50)
{
moveLeft = true;
}
else if(invader.isAlive && invader.Xpos < 0)
{
moveLeft = false;
}
}
}
//Updates the bullet movement and sets bullet draw to false if out of screen
void Invader::UpdateEnemyBullet()
{
if(!enemyBullet->isFired && isAlive)
{
enemyBullet->isFired = true;
enemyBullet->xPos = xpos + 16;
enemyBullet->yPos = ypos;
enemyBullet->yPos += 3;
std::cout << "xpos = " << Xpos << "ypos = " << Ypos << std::endl;
std::cout << "enemybullet ypos = " << enemyBullet->yPos << std::endl;
if(enemyBullet->yPos > SCRHEIGHT)
{
enemyBullet->isFired = false;
}
}
}
game.cpp
Invader blueDrones[BLUEDRONES];
bool Invader::moveLeft = false;
void Game::Init()
{
int counter = 0;
for(int j = 0; j< 2; j++)//colum
{
for(int i =0; i < 2; i++)// row
{
blueDrones[counter].Xpos = 100 + ( i * 60);
blueDrones[counter].Ypos = 50 + (j * 50);
blueDrones[counter].Graphic = blueDroneSpr ;
counter++;
}
}
}
void Game::Tick( float a_DT )
{
for(int t = 0; t < BLUEDRONES; t++)
{
blueDrones[t].ChecksEnemyBorder(blueDrones, BLUEDRONES);
blueDrones[t].EnemyMovement(blueDrones, BLUEDRONES);
blueDrones[t].EnemyMoving(blueDrones, BLUEDRONES);
}
Draw();
}
void Game::Draw()
{
//Draw blue drones
int counter = 0;
for(int i = 0; i < BLUEDRONES; i++)// row
{
if(blueDrones.isAlive)
{blueDroneSpr->CopyTo(m_Screen, blueDrones.Xpos, blueDrones.Ypos);}
if(blueDrones.enemyBullet->isFired)
{bulletSpr->CopyTo( m_Screen, blueDrones.enemyBullet->xPos, blueDrones.enemyBullet->yPos);}
counter++;
}
}