Bonsoir,
Je crée un jeu "tile mappé".
Je dispose d'une classe Block qui me permet de créer object Block et une classe World qui me permet de gérer mon monde (composé d'object Block).
Je m'explique, dans le constructeur de World je remplis une liste à deux dimensions d'object Block.Lors de leurs création, le constructeur de Block affecte à l'object créer un Sprite auquel il lui applique une texture. Ensuite à l'aide d'une méthode de World que j'appelle dans le Main, je draw les objects Block contenu dans World (dans la liste à deux dimensions) .. seulement j'obtiens le fameux carré blanc.
Donc le Sprite est bien là, c'est la texture qui n'existe plus. J'ai fais des recherches et j'en ai conclu que la texture était supprimé à la sortie de la classe dans laquelle elle a été crée (ce qui explique pourquoi cela marche quand je draw à partir de la classe Block). J'ai aussi cru comprendre que je devais utiliser des allocations dynamiques pour résoudre ce problème ... mais je n'y arrive pas .. vraiment .. ça fait 3 semaines que je suis dessus .. Quelqu'un pourrait il m'aider ?
Cordialement.
Voici mon code car je doute que mon explication soit suffisamment clair :
Block.hpp :
#ifndef Block_hpp
#define Block_hpp
#include <cstdio>
#include <string>
#include <SFML/Graphics.hpp>
class Block : public sf::Drawable
{
public:
Block(int type, int x, int y);
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
target.draw(block_sprite, states);
}
protected:
TextureManager texture;
sf::Sprite block_sprite;
sf::Texture *block_texture;
int type;
};
#endif
------------------------------------------------------
Block.cpp
#include "Block.hpp"
#include <cstdio>
#include <iostream>
#include <SFML/Graphics.hpp>
Block::Block(int type, int x, int y)
{
if (type == 0)
{
block_texture = &texture.getTexture(type);
}
else if (type == 1)
{
block_texture = &texture.getTexture(type);
}
this->type = type;
block_sprite.setTexture(*block_texture);
block_sprite.setPosition(x, y);
}
------------------------------------------------------
World.hpp :
#ifndef World_hpp
#define World_hpp
#include <cstdio>
#include <SFML/Graphics.hpp>
#include <string>
#include "Block.hpp"
class World
{
public:
World();
void render(sf::RenderWindow& window) const;
protected:
Block map[20][20];
};
#endif
------------------------------------------------------
World.cpp
#include "World.hpp"
#include "Block.hpp"
#include <SFML/Graphics.hpp>
#include <string>
#include <cstdio>
World::World()
{
map[0][0] = Block(0, 0, 0);
map[1][0] = Block(1, 32, 0);
}
void World::render(sf::RenderWindow& window) const
{
window.draw(map[0][0]);
window.draw(map[1][0]);
}
------------------------------------------------------
main.cpp
#include <SFML/Audio.hpp>
#include <SFML/Graphics.hpp>
#include <string>
#include <iostream>
#include <cstdio>
#include "World.hpp"
int main(int, char const**)
{
const int w = 800;
const int h = 450;
sf::RenderWindow window;
sf::View view;
World world;
sf::Event event;
window.create(sf::VideoMode(w, h), "SFML window",sf::Style::Default);
window.setVerticalSyncEnabled(true);
while (window.isOpen())
{
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.clear();
view.reset(sf::FloatRect(0,0,w,h));
world.render(window);
window.display();
}
return EXIT_SUCCESS;
}