Hi I am using SFML to develop a game and I am having problems with a function.
this is the code:
enemy.h:
#ifndef ENEMY_H
#define ENEMY_H
#include<SFML/Graphics.hpp>
class Enemy {
private:
sf::Texture texture;
sf::Sprite enemySprite;
float enemySpeed;
int maxY, maxX;
public:
Enemy(int _maxY, int _maxX);
void render(sf::RenderWindow *wnd);
void update(sf::Time deltaTime);
void reset(float speed);
};
#endif
Enemy.cpp:
#include <ctime>
Enemy::Enemy(int _maxY, int _maxX) {
texture.loadFromFile("SFML-Game-Development-Book-
master/03_World/Media/Textures/Raptor.png");
enemySprite.setTexture(texture);
enemySprite.rotate(180);
maxY = _maxY;
maxX = _maxX;
}
void Enemy::render(sf::RenderWindow *wnd){
wnd->draw(enemySprite);
}
void Enemy::reset(float speed){
srand(time(NULL));
int num = rand();
enemySpeed = speed;
enemySprite.setPosition(num%maxX, maxY);
}
void Enemy::update(sf::Time deltaTime){
enemySprite.move(0.0f, enemySpeed * deltaTime.asSeconds());
if (enemySprite.getPosition().y > 600){
reset(enemySpeed);
}
}
Game.h:
class Game {
private:
sf::RenderWindow *mWindow;
Aircraft aircraft;
std::vector<Enemy> enemies;
void reset();
private:
void proccesEvent();
void update(sf::Time deltaTime);
void render();
public:
Game();
void run();
};
Game.cpp:
Game::Game(){
mWindow = new sf::RenderWindow(sf::VideoMode(800,600), "ventana SFML");
for (int i=0; i<5; i++){
enemies.push_back(Enemy(800, 600));
}
}
void Game::proccesEvent(){
sf::Event event;
while(mWindow->pollEvent(event)){
if(event.type == sf::Event::Closed){
mWindow->close();
}
}
}
void Game::reset(){
for (int i=0; enemies.size(); i++){
enemies[i].reset(100.0f);
}
}
void Game::update(sf::Time deltaTime){
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)){
aircraft.Up();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)){
aircraft.Down();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A)){
aircraft.Left();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D)){
aircraft.Right();
}
aircraft.update(deltaTime);
for (int i=0; i<enemies.size(); i++){
enemies[i].update(deltaTime);
}
}
void Game::render(){
mWindow->clear();
aircraft.Render(mWindow);
for (int i=0; i<enemies.size(); i++){
enemies[i].render(mWindow);
}
mWindow->display();
}
void Game::run(){
sf::Clock clock;
while(mWindow->isOpen()){
sf::Time deltaTime = clock.restart();
proccesEvent();
reset();
update(deltaTime);
render();
}
}
I think the problem is in the function reset that is in the class Enemy, because when I use the debugger it stop in that function.
What is the problem and how can I solve it?
The idea is that Enemy is a ship that moves in the Y-axis always down
Here's the problem. You forgot to use an inequality. enimies.size() will always return true (if there are any). But you really want i < enemies.size().
void Game::reset(){
for (int i=0; i < enemies.size(); i++){
enemies[i].reset(100.0f);
}
}