In my current code the enemy ships fire each frame of the game. How can I make those shots to be every so often, 2 seconds for example?
My code:
Bullet.h:
class Bullet {
private:
sf::Sprite sprite;
sf::Vector2f speed;
int posX, posY;
Bullet(int _posX, int _posY, sf::Texture &_texture);
public:
friend class BulletFactory;
void update(sf::Time deltaTime);
void reset();
void setSpeed(float _speed);
sf::Sprite render();
sf::FloatRect bounds(){
return sprite.getGlobalBounds();
}
};
class BulletFactory{
private:
sf::Texture texture;
public:
BulletFactory(){
texture.loadFromFile("SFML-Game-Development-Book-master/10_Network/Media/Textures/misil2.png");
}
Bullet create(int _posX, int _posY){
return {_posX, _posY, texture};
}
};
Bullet.cpp:
Bullet::Bullet(int _posX, int _posY, sf::Texture &_texture) {
sprite.setTexture(_texture);
sprite.rotate(-90);
sprite.setScale(0.1f, 0.1f);
posX = _posX;
posY = _posY;
sprite.setPosition(posX, posY);
speed.y = -500.0f;
}
void Bullet::update(sf::Time deltaTime){
sprite.move(0, speed.y * deltaTime.asSeconds());
}
sf::Sprite Bullet::render(){
return sprite;
}
void Bullet::reset(){
speed.x = 0.0f;
speed.y = 0.0f;
}
void Bullet::setSpeed(float _speed){
speed.y = _speed;
}
enemy.h:
class Enemy {
private:
sf::Sprite sprite;
float speed = 200.0f ;
Enemy(int _maxX, int _maxY, sf::Texture &_texture);
public:
friend class EnemyFactory;
sf::FloatRect bounds(){
return sprite.getGlobalBounds();
}
sf::Vector2f getPosition(){
return sprite.getPosition();
}
sf::Sprite render();
void update(sf::Time deltaTime);
void reset();
};
class EnemyFactory{
private:
sf::Texture texture;
public:
EnemyFactory(){
texture.loadFromFile("SFML-Game-Development-Book-master/03_World/Media/Textures/Raptor.png");
}
Enemy create(int _maxX, int _maxY){
return {_maxX, _maxY, texture};
}
};
Enemy.cpp:
Enemy::Enemy(int _maxX, int _maxY, sf::Texture &_texture) {
sprite.setTexture(_texture);
sprite.rotate(180);
sprite.setScale(0.8f, 0.8f);
sprite.setPosition(1+rand()%640,rand() % 400 - 500);
}
sf::Sprite Enemy::render(){
return sprite;
}
void Enemy::update(sf::Time deltaTime){
sprite.move(0.0f, speed * deltaTime.asSeconds());
if (sprite.getPosition().y > 480+51.2){
sprite.setPosition(1+rand()%640,rand() % 400 - 500);
}
}
void Enemy::reset(){
speed = 0;
}
game.h:
class Game {
private:
sf::RenderWindow *mWindow;
ScrollingBackground background;
Aircraft aircraft;
std::vector<Enemy> enemies;
EnemyFactory enemy;
std::vector<Bullet> bullets;
std::vector<Bullet> enemybullets;
BulletFactory bullet;
private:
void proccesEvent();
void update(sf::Time deltaTime);
void proccesCollisions();
void render();
public:
Game();
void run();
};
game.cpp:
Game::Game(){
mWindow = new sf::RenderWindow(sf::VideoMode(640,480), "ventana SFML");
mWindow->setKeyRepeatEnabled(false);
for (int i=0; i<7; i++){
enemies.push_back(enemy.create(640,480));
}
}
void Game::proccesEvent(){
sf::Event event;
while(mWindow->pollEvent(event)){
if(event.type == sf::Event::Closed){
mWindow->close();
}
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Space){
bullets.push_back(bullet.create((aircraft.getPosition().x+15), (aircraft.getPosition().y+40)));
}
}
}
void Game::update(sf::Time deltaTime){
background.update(mWindow, deltaTime);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)){
aircraft.Up();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)){
aircraft.Down(mWindow);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)){
aircraft.Left();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)){
aircraft.Right(mWindow);
}
for (int j=0; j<enemies.size(); j++){
enemies[j].update(deltaTime);
enemybullets.push_back(bullet.create((enemies[j].getPosition().x), (enemies[j].getPosition().y)));
}
for (int j=0; j<enemybullets.size(); j++){
enemybullets[j].setSpeed(500.0f);
enemybullets[j].update(deltaTime);
}
for (int i=0; i<bullets.size(); i++){
bullets[i].update(deltaTime);
}
aircraft.update(deltaTime);
}
void Game::render(){
mWindow->clear();
mWindow->draw(background.render());
for (int j=0; j<enemies.size(); j++){
mWindow->draw(enemies[j].render());
}
for (int i=0; i<enemybullets.size(); i++){
mWindow->draw(enemybullets[i].render());
}
for (int i=0; i<bullets.size(); i++){
mWindow->draw(bullets[i].render());
}
mWindow->draw(aircraft.Render());
mWindow->display();
}
void Game::run(){
sf::Clock clock;
while(mWindow->isOpen()){
sf::Time deltaTime = clock.restart();
proccesEvent();
proccesCollisions();
update(deltaTime);
render();
}
}
Do not add the proccesCollisions function in game.cpp to not extend the code unnecessarily.