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.


Messages - Spekkio

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


2
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;
}



3
Général / Re: Basique : Afficher un Sf::Text
« le: Novembre 28, 2021, 08:45:39 pm »
J'ai réglé mon problème en ajoutant la sf::Font à ma classe, en tant qu'attribut donc.
Puis, j'ai initialisé cette sf::Font dans le constructeur de ma classe.
Enfin j'ai initialisé mon sf::Text  en utilisant cette sf::Font.


Dans la fonction draw() de ma classe, j'ai pu passer mon sf::Text à la fonction draw() du sf::RendererWindow


Edit>> En fait, mon problème venait effectivement des mes connaissances en C++.
Le constructeur d'un sf::Text demande une référence d'une sf::Font.
Or, dans mon cas, je créais une sf::Font, dans mon constructeur. La sf::Font était détruite à la fin de mon constructeur.

Dans ma fonction Draw(), je voulais utiliser mon sf:Text. Ce dernier était incapable de retrouver le sf::Font auquel il était lié, puisque celui-ci était détruit.

4
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]