Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Sujets - Spekkio

Pages: [1]
1
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;
}



2
Général / Basique : Afficher un Sf::Text
« le: Novembre 27, 2021, 01:36:08 am »
Bonjour,

pour commencer, je débute autant en C++ qu'en SFML. Ma question porte très probablement sur des bases de C++ qui m'échappent.

Je souhaite créer un mini programme me permettant de passer d'une "scène" à l'autre.
Comme passer du menu de démarrage, au jeu en lui même, au travers d'un clic sur un bouton du menu démarrage.

Je suis en train de concevoir le menu de démarrage. Je n'en suis qu'au début.
Ce menu est conçu avec ma class Scene_menu.
Cette class contient un sf::Text pour le nom du jeu, ainsi qu'un vector<sf::RectangleShape>, qui contient deux rectangles sf::RectangleShape, pour simuler des boutons. 

Dans mon main, je créé un objet scene_menu de la class Scene_menu.
Ensuite, dans une boucle while, j'appelle une fonction draw() de mon objet scene_menu

Cette fonction draw() me permet d'afficher sans problème mes deux rectangles  : je parcours avec un itérateur mon vecteur, et j'envoie mon itérateur à la fonction draw() d'un objet de type RenderWindow.
Par contre, si j'envoie mon sf::Text, j'ai une l'erreur "violation de mémoire"


(je n'arrive pas à afficher d'image ... normalement une capture est jointe au post)

Cette erreur apparait donc si je veux afficher le sf::Text de mon objet.

Mais si je créé un nouvel objet sf::Text dans la fonction draw(), et essai de l'afficher  : OK

Je ne comprend pas la différence entre ma variable locale l_title et mon attribut de class title. Qu'est ce qui fait que ces 2 objets instanciés avec les même valeurs (même string, même font), ne me donnent pas les mêmes résultats avec la méthode  sf::Renderwindow::draw() ?

voici une partie de mon code :

Mon main :

#include "main.h"

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

    SharedContext* sharedContext= SharedContext::GetInstance(window);
    Scene_Menu scene_menu;
    while (sharedContext->getWindow().isOpen()) {
        sharedContext->getWindow().clear(Color::Black);        
        scene_menu.draw();        
        sharedContext->getWindow().display();
    }
    return 0;
}

Scene_Menu.h

#pragma once
#include <vector>
#include <SFML/Graphics/RectangleShape.hpp>
#include <SFML/Graphics/Text.hpp>
#include "sharedContext.h"

class Scene_Menu {

public:
        Scene_Menu();
        ~Scene_Menu();

        void draw();
        void update();

        void setTitle(const sf::Text &l_txt);
        void setRectancle(const int &number,const sf::Vector2u &dimension, const sf::Vector2u &position);
        void pressButton(int button);

private:
        sf::Text title;
        std::vector<sf::RectangleShape> rectangleShapeList;
        SharedContext* sharedContext;
 };
 

Scene_Menu.cpp

#include "Scene_Menu.h"
#include <iostream>

Scene_Menu::Scene_Menu() {
    sharedContext = SharedContext::GetInstance();
    sf::Font font;
    font.loadFromFile("res/poppins.ttf");
    title = sf::Text("Menu", font);

    // Bouton jouer
    sf::RectangleShape rectangleShape(sf::Vector2f(120.f, 50.f));
    rectangleShape.setPosition(200, 300);
    rectangleShape.setFillColor(sf::Color(100, 115, 180, 200));
    rectangleShape.setSize(sf::Vector2f(180.f, 100.f));

    // Bouton quitter
    sf::RectangleShape rectangleShape2(sf::Vector2f(120.f, 50.f));
    rectangleShape2.setPosition(200, 400);
    rectangleShape2.setFillColor(sf::Color(175, 175, 175, 200));
    rectangleShape2.setSize(sf::Vector2f(180.f, 100.f));

    rectangleShapeList.push_back(rectangleShape);
    rectangleShapeList.push_back(rectangleShape2);

}

Scene_Menu::~Scene_Menu(){}

void Scene_Menu::draw(){
    sf::Font font;
    font.loadFromFile("res/poppins.ttf");
    sf::Text l_title = sf::Text("Menu", font);
    sharedContext->getWindow().draw(title); // ne marche pas
   // sharedContext->getWindow().draw(l_title); // marche très bien
    for (auto &itr : rectangleShapeList) {
        sharedContext->getWindow().draw(itr);
    }
   
}

void Scene_Menu::update(){}

void Scene_Menu::setTitle(const sf::Text& l_txt){}

void Scene_Menu::setRectancle(const int& number, const sf::Vector2u& dimension, const sf::Vector2u& position){}

void Scene_Menu::pressButton(int button){}

en espérant que vous saurez m'aider :-)

Merci par avance



Pages: [1]
anything