Salut, la fonction getView() de renderWindow me provoque un crash, voici le code source :
GameStates, contient juste la fenêtre de rendu et le contexte de rendu du jeux.
#define GAME_STATES
#include <SFML/Graphics.hpp>
namespace sfgl {
class GameStates
{
public:
struct Context
{
explicit Context(sf::RenderWindow& window, int lightQuality, bool renderLights, bool renderShadow, bool displayMiniMap/*, FontManager& fonts, Cursor& cursor, Player& player*/)
: window(window), renderLights (renderLights), renderShadows(renderShadows), lightQuality(lightQuality), displayMiniMap(displayMiniMap)/*, fonts(&fonts), cursor(&cursor), player(&player)*/{}
sf::RenderWindow& window;
bool renderShadows;
bool renderLights;
int lightQuality;
bool displayMiniMap;
};
public:
GameStates(Context context);
virtual ~GameStates();
virtual void render() = 0;
protected:
void requestStackPush(unsigned int id);
void requestStackPop();
void requestStateClear();
Context& getContext() const;
protected:
Context& mContext;
};
}
#endif // GAME_STATES
Game : rend la frame courante de la game dans la renderwindow :
#include "../../include/SFGL/game.h"
namespace sfgl {
using namespace sf;
using namespace std;
Game::Game (Context context) : GameStates (context) {
View view = getContext().window.getView();
renderTextShadows.create(view.getSize().x, view.getSize().y);
renderTextLights.create(view.getSize().x, view.getSize().y);
}
void Game::render () {
Map *currentMap = World::getCurrentMap();
View view = getContext().window.getView();
Vector2f v2 (view.getCenter().x - view.getSize().x * 0.5f, view.getCenter().y - view.getSize().y * 0.5f);
if (getContext().renderShadows) {
renderTextShadows.setView(view);
renderTextShadows.clear(Color::White);
RectangleShape rect;
rect.setPosition(Vector2f(v2.x, v2.y));
rect.setFillColor((Color(100, 100, 100, 128)));
rect.setSize(Vector2f (view.getSize().x, view.getSize().y));
vector<Shadow*> visibleShadows = currentMap->getVisibleShadows();
for (unsigned int i = 0; i < visibleShadows.size(); i++) {
renderTextShadows.draw(*visibleShadows[i]);
}
renderTextShadows.draw(rect, RenderStates(BlendAdd));
renderTextShadows.display();
}
if (getContext().renderLights) {
vector<DrawableEntity*> visibleLights = currentMap->getVisibleEntities("E_LIGHT");
for (unsigned int i = 0; i < visibleLights.size(); i++) {
renderTextLights.draw(*visibleLights[i], RenderStates(BlendAdd));
}
renderTextLights.display();
}
vector<DrawableEntity*> visibleTilesGround = currentMap->getVisibleEntities("E_GROUND");
for (unsigned int i = 0; i < visibleTilesGround.size(); i++) {
getContext().window.draw(*visibleTilesGround[i]);
}
if (getContext().renderShadows) {
Sprite shadows (renderTextShadows.getTexture());
shadows.setPosition(v2.x, v2.y);
getContext().window.draw (shadows, RenderStates(BlendMultiply));
}
vector<DrawableEntity*> visibleTilesDecor = currentMap->getVisibleEntities("E_DECOR");
for (unsigned int i = 0; i < visibleTilesGround.size(); i++) {
getContext().window.draw(*visibleTilesGround[i]);
}
if (getContext().renderLights) {
Sprite lights (renderTextLights.getTexture());
lights.setPosition(v2.x, v2.y);
getContext().window.draw (lights, RenderStates(BlendMultiply));
}
}
void Game::update() {
Map *currentMap = World::getCurrentMap();
View currentView = getContext().window.getView();
Vector2f viewPos (currentView.getCenter().x - currentView.getSize().x * 0.5f, currentView.getCenter().y - currentView.getSize().y * 0.5f);
Vector2f viewSize (currentView.getSize().x, currentView.getSize().y);
BoundingRectangle viewRect (viewPos.x, viewPos.y, viewSize.x, viewSize.y);
currentMap->checkVisibleEntities(viewRect);
if (getContext().renderLights)
World::getLightManager().computeIntersectionsWithWall();
}
}
J'ai un crash à cette ligne lorsque j'essaye d'accéder à une fonction de la classe view :
Vector2f viewPos (currentView.getCenter().x - currentView.getSize().x * 0.5f, currentView.getCenter().y - currentView.getSize().y * 0.5f);
Voici le main :
#include <SFGL/utilities.h>
#include <vector>
#include <iostream>
#include <SFGL/World/2D/world.h>
#include <SFGL/World/2D/tGround.h>
#include <SFGL/Graphics/2D/tile.h>
#include <SFGL/BoundingAreas/boundingRectangle.h>
#include <SFGL/Game.h>
using namespace sfgl;
using namespace std;
int main () {
// création de la fenêtre
sf::RenderWindow window(sf::VideoMode(800, 600), "My window");
//On récupère le gestionnaire de texture et on charge les textures du jeux.
TextureManager &tm = World::getTextureManager();
if (!tm.loadTexture("tilesets/herbe.png"))
cerr<<"Error : file not found"<<endl;
//Crée une nouvelle carte et l'affecte au monde. (Le monde peut être composé de plusieurs cartes.
Map *currentMap = new Map(100, 50, 30);
World::addMap(currentMap);
currentMap->setName("Map test");
World::setCurrentMap("Map test");
//On ajoute créer une tile et on l'ajoute au sol.
Tile *t = new Tile(*tm.getTexture("tilesets/herbe.png"), Vec2f(0, 0), Vec2f(100, 50), sf::IntRect(0, 0, 100, 50), "E_GROUND");
TileGround *tg = new TileGround(t);
//On ajoute le sol à la carte.
currentMap->addEntity(tg);
/*On définit le contexte de rendu du jeux en passant les paramètre suivants :
*(Fenêtre de rendu, qualité des lumières (ici 0 vu qu'on en a pas), si on veut afficher les lumière,
si on veut afficher les ombres et si on veut afficher la mini carte, on met tout à false ici vu que
on a pas de lumières ni de bâtiments*/
Game game (GameStates::Context(window, 0, false, false, false));
game.update();
// on fait tourner le programme tant que la fenêtre n'a pas été fermée
while (window.isOpen())
{
// on traite tous les évènements de la fenêtre qui ont été générés depuis la dernière itération de la boucle
sf::Event event;
while (window.pollEvent(event))
{
// fermeture de la fenêtre lorsque l'utilisateur le souhaite
if (event.type == sf::Event::Closed)
window.close();
}
//On affiche la frame courante du jeux
//game.render();
// fin de la frame courante, affichage de tout ce qu'on a dessiné
window.display();
}
//On libère notre texture de la mémoire car on en a plus besoin.
tm.deleteTexture("tilesets/herbe.png");
return 0;
}