Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: L'utilisation de la vue après un getView provoque un crash  (Lu 2292 fois)

0 Membres et 1 Invité sur ce sujet

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
L'utilisation de la vue après un getView provoque un crash
« le: Décembre 03, 2013, 04:21:11 pm »
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;

}
 

« Modifié: Décembre 03, 2013, 04:29:49 pm par Lolilolight »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : L'utilisation de la vue après un getView provoque un crash
« Réponse #1 le: Décembre 03, 2013, 06:31:37 pm »
Comme d'hab :

- utilise ton debugger
- fournis un code complet minimal sorti du contexte de ton énorme truc
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : L'utilisation de la vue après un getView provoque un crash
« Réponse #2 le: Décembre 03, 2013, 10:21:29 pm »
Bah sans le context ça marche donc le problème vient du context, foudrait que je compile la librairie en mode débug pour voir mais là comme je suis entrain d'essayer de faire fonctionné le compilateur TDM avec code::blocks et que j'ai un petit problème avec le sjlj, se ne sera pas possible tout de suite.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : L'utilisation de la vue après un getView provoque un crash
« Réponse #3 le: Décembre 04, 2013, 07:39:12 am »
Dans ce cas règle d'abord tes problèmes d'environnement avant de demander de l'aide sur le forum. Tu comprends bien qu'on ne va pas se casser le c** à essayer de déchiffrer un code compliqué et incomplet juste parce qu'en ce moment tu ne peux pas debugger correctement ;)

Et si hors contexte ça fonctionne, alors tu peux facilement trouver l'erreur : ajoute petit à petit du contexte au code qui fonctionne jusqu'à ce que l'erreur revienne (ou retire petit à petit du contexte au code original jusqu'à ce que l'erreur disparaisse -- à voir quel est le plus pratique).
Laurent Gomila - SFML developer

Lolilolight

  • Hero Member
  • *****
  • Messages: 1232
    • Voir le profil
Re : L'utilisation de la vue après un getView provoque un crash
« Réponse #4 le: Décembre 04, 2013, 09:11:19 am »
Oui je dois revoir se système de contexte, le problème vient certainement de là.

De plus il me renvoie une adresse plutôt bizarre sur la window du contexte.
« Modifié: Décembre 04, 2013, 09:15:47 am par Lolilolight »

 

anything