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

Auteur Sujet: Crash à la fermeture de du renderWindow ou lors de l'appel de la fonction draw  (Lu 3198 fois)

0 Membres et 1 Invité sur ce sujet

Spekkio

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Bonjour,

je viens vers vous pour un soucis que je ne vois comment débugger.
Je programme un Tetris pour me faire la main, tant avec le C++ qu'avec la SFML.

Mon problème apparait  à deux moment différents et je suppose que l'origine est commune, sans pourvoir l'affirmer :
1 ) En quittant avec la croix
2 ) Lors de l'affichage des composants sf::Text de l'objet scene_Game_data

1 ) En quittant avec la croix
Le message d'erreur est le suivant "....exe has triggered a break point", puis "Unhandled expecption at .... Un segment de mémoire a été endommagé..."
voir windowClose_1_2.PNG et windowClose_2_2.PNG en pièces jointes

Mon jeu est composé de deux "scènes", le menu et l'espace où je joue.
Quand je quitte avec la croix depuis le menu, le bug n'apparait jamais.
En revanche si je fais "Play", j'entre dans la nouvelle "scène". Puis si j’appuie sur la croix, l'erreur apparait. Pas toujours mais 'mettons tout le temps (9 fois sur 10).

2) Lors de l'affichage des composants sf::Text de l'objet scene_Game_data
voir window_draw_itr_1_1.PNG
Lorsque je fais un mouvement avec ma pièce, que ce soit sur la gauche ou la droite. J'ai l'impression que le
problème n’existe qu'avec la première pièce qui chute. Pas celle d'après.

Au démarrage de mon programme je créé deux objets :
Scene_Menu
Scene_Game
Ensuite, selon un enum de type "Scene", j'indique si je dois  "update" et "draw" telle ou telle scene.

Scene_Game est lui même composé de deux objets:
- Scene_Game_Data
- Scene_Game_PlayingSpace
(pour essayer de mieux visualiser j'ai faire un petit dessin "Explications_1_X.png"

Ma partie de Tetris commence dès que j’appuie sur le bouton Play.
A ce moment la pièce commence à descendre seule, ou lorsque j’appuie sur le bas. Je peux la déplacer latéralement, c'est là que je provoque l'erreur 2.


Je sais pertinemment qu'il manque des explications. N'hésitez pas à me demander plus d'info.

Pour le code, je n'ai aucune idée de ce qui pourrait vous interesser.
Voici mon main pour vous mettre des choses sous la dent en attendant :

int main(){

    RenderWindow window;
    window.create(VideoMode(WIN_WIDTH, WIN_HEIGHT, 32), "Un titre", sf::Style::Default);
    window.setVerticalSyncEnabled(true);

    Event event;
    State currentState(State::Menu);

    SharedContext* sharedContext= SharedContext::GetInstance(window, event, currentState);
 
    Scene_Menu scene_menu;
    Scene_Game scene_game(sharedContext->getWindow());    

    while (sharedContext->getWindow().isOpen()) {
        sharedContext->getWindow().pollEvent(event);
        switch (event.type) {
            case Event::Closed:              
                sharedContext->getWindow().close();                
            break;

            default:
            break;
        }        
     


        sharedContext->getWindow().clear(Color::Black);

        switch (currentState) {
            case State::Menu:
                scene_menu.update();
                scene_menu.draw();
                if (scene_menu.getToQuit())
                    currentState = State::Quit;

                if (scene_menu.getToGame())
                    currentState = State::Game;
            break;

            case State::Game:
                scene_game.update();
                scene_game.draw();
            break;

            case State::Options:
            break;

            case State::Credits:
            break;

            case State::Quit:
                std::cout << "3" << std::endl;
                sharedContext->getWindow().close();
                std::cout << "4" << std::endl;
            break;

            default:
            break;
        }

        sharedContext->getWindow().display();    
    }
   
    return 0;
}


« Modifié: Janvier 11, 2022, 07:42:53 pm par Spekkio »

Spekkio

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Je pense avoir finalement résolu mon problème qui à première vue, n'avait RIEN à voir avec une référence qui pointait vers un espace vide, comme je l'avais imaginé.
Mais d'une boucle for que je parcourais à l'envers, avec des entiers non signés :
Par exemple :

Je faisais :
for (unsigned int i = 10; i>0 ; i--){
montableau[i]= truck();
if (i ==0 ) break;
}

Puis j'ai corrigé parpar :
int imax = montableau.size()-1;
for (unsigned int i = 0; i<=imax ; i){
montableau[imax -i]= truck();

if (i ==0 ) break;
}

J'ai redémarré mon soft à plusieurs reprises, j'ai été incapable de reproduire le bug jusque là.
J'avoue ne pas voir le lien entre bug et ma correction