16
Graphique / Ecran NOIR & loadFromMemory
« le: Octobre 23, 2012, 01:16:11 am »
Petit changement.... Maintenant j'ai un écran noir :/
Voici, la boucle principale:
La fonction m_game.runPreloader(); va precharger les images dans l'instance de m_game.getMemory().
Ensuite, voici le header de la classe Memory:
Le chargement se passe bien.
En tout cas, voici le debug...:
Le truc vraiment etrange, c'est que c'est la meme adresse apres chargement, et quand je tente d'y acceder.
De plus, la taille affichée sur la console est la bonne.
Une idée d'où vient le probleme ?
merci, nico
Voici, la boucle principale:
short SplashScreen::Run()
{
sf::Sprite splash_screen;
bool connect_attempt = false, splash_load = false;
/// Running loading thread
m_game.runPreloader();
/// Rendering loop
while(m_game.getRenderer().getApp().isOpen() && m_game.isRunning())
{
/// Clearing the window
m_game.getRenderer().getApp().clear();
sf::Event event;
while(m_game.getRenderer().getApp().pollEvent(event))
{
/// Event handling
/// SFGUI
m_desktop.HandleEvent(event);
/// SFML
if(event.type == sf::Event::Closed)
{
/// This will automatically terminate the networker thread & nicely exit the game
m_game.crash();
}
}
if(!splash_load)
{
try
{
Memory& memory(m_game.getMemory());
splash_screen.setTexture(memory.getTexture(static_cast<long>(5)));
splash_load = true;
std::cout << "Set Texture!"<<std::endl;
}
catch(bool)
{
std::cout << "Failed to set texture"<<std::endl;
}
}
/// Drawings (SFML)
/// The sprite (background)
if(splash_load)
{
m_game.getRenderer().getApp().draw(splash_screen);
}
m_game.getRenderer().getApp().resetGLStates();
/// Displayings
m_desktop.Update(0.f);
m_game.getRenderer().display(m_game.getRenderer().getApp());
m_game.getRenderer().getApp().display();
}
return -1;
}
{
sf::Sprite splash_screen;
bool connect_attempt = false, splash_load = false;
/// Running loading thread
m_game.runPreloader();
/// Rendering loop
while(m_game.getRenderer().getApp().isOpen() && m_game.isRunning())
{
/// Clearing the window
m_game.getRenderer().getApp().clear();
sf::Event event;
while(m_game.getRenderer().getApp().pollEvent(event))
{
/// Event handling
/// SFGUI
m_desktop.HandleEvent(event);
/// SFML
if(event.type == sf::Event::Closed)
{
/// This will automatically terminate the networker thread & nicely exit the game
m_game.crash();
}
}
if(!splash_load)
{
try
{
Memory& memory(m_game.getMemory());
splash_screen.setTexture(memory.getTexture(static_cast<long>(5)));
splash_load = true;
std::cout << "Set Texture!"<<std::endl;
}
catch(bool)
{
std::cout << "Failed to set texture"<<std::endl;
}
}
/// Drawings (SFML)
/// The sprite (background)
if(splash_load)
{
m_game.getRenderer().getApp().draw(splash_screen);
}
m_game.getRenderer().getApp().resetGLStates();
/// Displayings
m_desktop.Update(0.f);
m_game.getRenderer().display(m_game.getRenderer().getApp());
m_game.getRenderer().getApp().display();
}
return -1;
}
La fonction m_game.runPreloader(); va precharger les images dans l'instance de m_game.getMemory().
Ensuite, voici le header de la classe Memory:
typedef std::pair<long, long> MemoryKey;
// ID, Offset
template<class S>
class MemoryRessource
{
public:
MemoryRessource() {}
MemoryRessource(const std::vector<char>& bytes) :
m_buffer()
{
if(!m_buffer.loadFromMemory(&bytes[0], bytes.size()))
{
std::cout << "Failed to load from memory ! " << std::endl;
throw false;
}
else
{
std::cout << "loadFromMemory: OK. @ address: " << &m_buffer << std::endl;
}
}
~MemoryRessource()
{
std::cout << "Destroying !"<<std::endl;
}
inline S& get() {
std::cout << "Get texture (width=" << m_buffer.getSize().x << "; height=" << m_buffer.getSize().y << ")" << std::endl;
return m_buffer;
}
private:
S m_buffer;
};
class Memory
{
public:
Memory() :
m_nodes(),
m_loaded_gfx(),
m_mtx_loader(PTHREAD_MUTEX_INITIALIZER),
m_percent(0)
{}
~Memory()
{
std::cout << "Call ~Memory() " << std::endl;
}
void loadPackage(const std::string& pack)
{
Reader* own_reader = new Reader();
Node* child = own_reader->Read(pack);
m_nodes.insert(std::make_pair(Filesystem::extractFilename(pack),
std::make_pair(own_reader, child)));
}
void loadGraphic(const long id)
{
try
{
Node& node(m_nodes[m_graphicPackage].second->find(id));
MemoryRessource<sf::Texture>* res = new MemoryRessource<sf::Texture>(node.get(m_nodes[m_graphicPackage].first->stream()));
m_loaded_gfx.insert(std::make_pair(MemoryKey(node.getId(), node.getOffset()), res));
}
catch(bool)
{
throw false;
}
}
Node& operator[] (const std::string& key) { return *(m_nodes[key].second); }
inline sf::Texture& getTexture(const MemoryKey& key) { return m_loaded_gfx[key]->get(); }
inline sf::Texture& getTexture(const long key)
{
for(auto& res : m_loaded_gfx)
{
if(res.first.first == key)
{
return res.second->get();
}
}
/// In case we didn't found id... !
throw false;
}
inline bool isLoaded(const MemoryKey& key) { return m_loaded_gfx.find(key) != m_loaded_gfx.end(); }
inline pthread_mutex_t* getMutex() { return &m_mtx_loader; }
inline long& getPercent() { return m_percent; }
private:
std::map<std::string, std::pair<Reader*, Node*>> m_nodes;
std::map<MemoryKey, MemoryRessource<sf::Texture>*> m_loaded_gfx;
pthread_mutex_t m_mtx_loader;
long m_percent;
const std::string m_graphicPackage = "Graphics";
};
// ID, Offset
template<class S>
class MemoryRessource
{
public:
MemoryRessource() {}
MemoryRessource(const std::vector<char>& bytes) :
m_buffer()
{
if(!m_buffer.loadFromMemory(&bytes[0], bytes.size()))
{
std::cout << "Failed to load from memory ! " << std::endl;
throw false;
}
else
{
std::cout << "loadFromMemory: OK. @ address: " << &m_buffer << std::endl;
}
}
~MemoryRessource()
{
std::cout << "Destroying !"<<std::endl;
}
inline S& get() {
std::cout << "Get texture (width=" << m_buffer.getSize().x << "; height=" << m_buffer.getSize().y << ")" << std::endl;
return m_buffer;
}
private:
S m_buffer;
};
class Memory
{
public:
Memory() :
m_nodes(),
m_loaded_gfx(),
m_mtx_loader(PTHREAD_MUTEX_INITIALIZER),
m_percent(0)
{}
~Memory()
{
std::cout << "Call ~Memory() " << std::endl;
}
void loadPackage(const std::string& pack)
{
Reader* own_reader = new Reader();
Node* child = own_reader->Read(pack);
m_nodes.insert(std::make_pair(Filesystem::extractFilename(pack),
std::make_pair(own_reader, child)));
}
void loadGraphic(const long id)
{
try
{
Node& node(m_nodes[m_graphicPackage].second->find(id));
MemoryRessource<sf::Texture>* res = new MemoryRessource<sf::Texture>(node.get(m_nodes[m_graphicPackage].first->stream()));
m_loaded_gfx.insert(std::make_pair(MemoryKey(node.getId(), node.getOffset()), res));
}
catch(bool)
{
throw false;
}
}
Node& operator[] (const std::string& key) { return *(m_nodes[key].second); }
inline sf::Texture& getTexture(const MemoryKey& key) { return m_loaded_gfx[key]->get(); }
inline sf::Texture& getTexture(const long key)
{
for(auto& res : m_loaded_gfx)
{
if(res.first.first == key)
{
return res.second->get();
}
}
/// In case we didn't found id... !
throw false;
}
inline bool isLoaded(const MemoryKey& key) { return m_loaded_gfx.find(key) != m_loaded_gfx.end(); }
inline pthread_mutex_t* getMutex() { return &m_mtx_loader; }
inline long& getPercent() { return m_percent; }
private:
std::map<std::string, std::pair<Reader*, Node*>> m_nodes;
std::map<MemoryKey, MemoryRessource<sf::Texture>*> m_loaded_gfx;
pthread_mutex_t m_mtx_loader;
long m_percent;
const std::string m_graphicPackage = "Graphics";
};
Le chargement se passe bien.
En tout cas, voici le debug...:
Le truc vraiment etrange, c'est que c'est la meme adresse apres chargement, et quand je tente d'y acceder.
De plus, la taille affichée sur la console est la bonne.
Une idée d'où vient le probleme ?
merci, nico