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 - Phounet

Pages: [1]
1
Général / Debug - SIGSEGV
« le: Mai 22, 2018, 06:50:07 pm »
Chers programmeurs,

Je me tourne vers vous pour une question théorique relative au débugage de mon code.

Ce code est basé sur le livre "SFML Game development by Example". En apparence, il fonctionne parfaitement, je n'ai aucun souci pour le compiler ou le faire tourner.

Toutefois, lorsque j'utilise le débug de Code::Blocks, il apparaît que j'ai deux erreurs "SIGSEGV - Segmentation fault" lorsque je ferme l'application. D'après mes renseignements, ces erreurs se produisent lorsqu'on déférence un pointeur null ou non alloué. Le débuger m'indique les méthodes générant ces erreurs, mais j'avoue cependant avoir du mal à les corriger.

Ma question est donc la suivante: Est-il essentiel de les corriger? Le programme est-il "viable" malgré ces deux erreurs détectées par le débuger?

Je vous remercie par avance pour votre aide.

Cordialement,

Phounet

2
Général / Dimension variable d'une texture
« le: Octobre 23, 2017, 07:59:28 pm »
Amis programmeurs,

Je sollicite votre aide pour le point suivant:

Comment gérer efficacement les textures d'une entité dont la taille n'est pas connue à l'avance?

Je m'explique: je souhaite créer une barre de défilement (i.e. Scrollbar) similaire à toutes celles que nous rencontrons habituellement. La taille de cette Scrollbar dépend de la longueur du contenu à afficher. Dès lors, comment puis-je efficacement gérer son apparence à l'écran?

Imaginons qu'au niveau de la texture, j'ai 3 tuiles:

|->

Si je dois créer une barre de dimension égale à 5, je vais avoir ceci:

|--->

On constate donc que j'ai tjs la tuile de "début" (i.e. | ) et la tuile de "fin" (i.e. > ). En fonction de la longueur, je rajoute le nombre de tuiles intermédiaires requis (i.e. - ).

Actuellement, dans mon code, ça fonctionne comme suit:

Je charge la tilesheet qui contient les 3 tuiles.
Je crée 3 sf::RectangleShape (i.e. un pour le début, un pour la fin, et un pour la partie intermédiaire variable). J'applique une tuile par RectangleShape, en m'assurant que ma texture peut se répéter pour la tuile du milieu. Ainsi, la tuile intermédiaire qui mesure 1 se répètera 3 fois dans un RectangleShape de taille 3.

Cela fonctionne, mais ça me semble affreusement lourd, voire tirer par les cheveux. Je voudrais donc savoir si l'un de vous à un meilleur moyen de gérer cela?

PS: Je ne souhaite pas utiliser la méthode "setScale" car si je ne dis pas de bêtise, cela va "étirer" ma texture de base et je risque donc de perdre en qualité de rendu (i.e. les pixels seront plus grossiers).

PS 2: Voici le code, au cas ce serait utile (ne prêtez pas attention aux constantes de taille et de positionnement, elles sont juste là temporairement)


    /* Texture */

    sf::IntRect topText(0, 0, 17, 4);
    sf::IntRect midText(0, 4, 17, 4);
    sf::IntRect lowText(0, 8, 17, 6);

    sf::Texture texture;
    if(!texture.loadFromFile("ScrollbarTexture.png"))
    {
        std::cout << "Erreur de chargement de l'image" << std::endl;
    }

    sf::FloatRect barSize(0.f, 0.f, 17.f, 100.f);
    sf::IntRect textureRect(barSize);
    texture.setRepeated(true);

    /* Sprite de Scrollbar */

    sf::Sprite barSprite;
    barSprite.setPosition(30.f, 30.f);

    /* RenderTexture */

    sf::RenderTexture renderTexture;
    renderTexture.create(barSize.width, barSize.height);

        renderTexture.clear(sf::Color(0, 0, 0, 0));

    sf::RectangleShape topRect;
    topRect.setSize(sf::Vector2f(barSize.width, 4.f));
    topRect.setTexture(&texture);
    topRect.setTextureRect(topText);

    sf::RectangleShape lowRect;
    lowRect.setSize(sf::Vector2f(barSize.width, 6.f));
    lowRect.setTexture(&texture);
    lowRect.setTextureRect(lowText);
    lowRect.setPosition(topRect.getPosition().x, topRect.getPosition().y + 91.f);

    sf::RectangleShape midRect;
    midRect.setSize(sf::Vector2f(barSize.width, barSize.height - topRect.getGlobalBounds().height - lowRect.getGlobalBounds().height));
    midRect.setTexture(&texture);
    midRect.setTextureRect(midText);
    midRect.setPosition(topRect.getPosition().x, topRect.getPosition().y + topRect.getGlobalBounds().height);

    renderTexture.draw(topRect);
    renderTexture.draw(midRect);
    renderTexture.draw(lowRect);

        renderTexture.display();

        /* Application de la RenderTexture au Sprite de Scrollbar */

        barSprite.setTexture(renderTexture.getTexture());
        barSprite.setTextureRect(textureRect);

3
Fenêtrage / [Resolu] SFML cesse de fonctionner en fullscreen
« le: Mai 11, 2017, 09:44:13 pm »
Amis programmeurs,

Pourriez-vous svp m'aider à résoudre le problème suivant:

Je développe un petit jeu en 2D, dont l'architecture globale est basée sur celle du livre SFML Game Development (celui dans lequel au final, on code un shooter 2D avec un petit avion ^^).

Tout fonctionne très bien, sauf lorsque j'utilise sf::Style::Fullscreen. C'est-à-dire que le jeu se lance, je peux voyager dans mes menus, etc. Mais lorsque je joue à proprement parler (i.e. lorsque je suis dans le "StatutJeuLive", qui utilise une classe "World" pour tout ce qui concerne la logique propre au jeu, exactement comme dans le livre cité ci-dessus), et que je dois vider le stack de statuts en fin de partie, le programme cesse de fonctionner.

Si je n'utilise pas le sf::Style::Fullscreen mais sf::Style::Close par exemple, tout fonctionne parfaitement sans problème.

Pensant que le problème venait de mon code, j'ai testé avec le code source fourni lorsqu'on achète le livre SFML, et j'ai exactement le même problème ! Je suis donc un peu perdu et souhaiterais obtenir vos lumières.

Je vous remercie d'avance.

Bien à vous,

Phounet

4
Général / SFML et Qt
« le: Décembre 18, 2015, 09:45:06 pm »
Bonjour à tous,

Je galère depuis un bon moment à essayer d'utiliser SFML et Qt ensemble. N'y parvenant pas, je fais appel à vous.

Du coup, est-ce que quelqu'un de très aimable pourrait me prendre par la main et me dire précisément chaque étape nécessaire (depuis le début) pour arriver à les utiliser ensemble?

Pour info, je suis sur Windows, j'utilise SFML 2.3.2 et Qt Creator 5.5 (minGW 4.9.2).

Merci d'avance au courageux qui acceptera de m'aider !

Phounet

5
Général / Le processeur tourne à fond
« le: Septembre 06, 2015, 04:43:31 pm »
Bonjour tout le monde,

Pourriez-vous svp m'aider à solutionner le problème suivant:

Je suis au début de la création d'un petit casse-brique (je débute en programmation). Pour l'instant, j'ai une fenêtre, une balle, et une barre qui se déplace. Autant dire qu'il n'y a pas grand chose.

Le souci est que lorsque je compile le programme pour le tester, le processeur se met à tourner à fond. Le premier coeur est utilisé à 100%, ce qui génère pas mal de bruit et vide la batterie du laptop.

Du coup, je souhaite connaître la manière la plus propre de réduire l'utilisation du processeur sans altérer la fluidité du programme.

Pour info, j'ai essayé sf::sleep() et window.setFramerateLimit() [sans FPS limit, le "jeu" tourne à plus de 2000 FPS, d'où l'utilisation extrême du processeur].

Ces deux solutions ne me donnent pas satisfaction car les déplacements de la barre ne sont plus fluides (même lorsque le FPS est limité à 100, ce qui devait en principe être suffisant pour avoir un mouvement fluide). Etant à court de solution, je fais appel à vous.

Merci d'avance à tous,

Phounet

Main.cpp

#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <iostream>
#include <cstdlib>
#include "Moteur.h"

using namespace std;
using namespace sf;

int main()
{
    Moteur moteur;
    FenPrincipale window;
    Balle balle(window);
    Barre barre(window);

    moteur.setPositionBarre(window, barre);

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                window.close();
            }
        }

        moteur.deplacerBarre(window, barre);

        window.clear();
        window.draw(balle);
        window.draw(barre);
        window.display();

    }

    return 0;
}
 

Moteur.h

#ifndef MOTEUR_H_INCLUDED
#define MOTEUR_H_INCLUDED

#include <SFML/Graphics.hpp>
#include <iostream>
#include "FenPrincipale.h"
#include "Balle.h"
#include "Barre.h"

class Moteur
{
    public:

    Moteur();
    ~Moteur();

    void restartHorlogeBarre();
    void setPositionBarre(FenPrincipale&, Barre&);
    void deplacerBarre(FenPrincipale&, Barre&);

    private:

    sf::Time m_tempsBarre;
    sf::Clock m_horlogeBarre;
};

#endif // MOTEUR_H_INCLUDED
 

Moteur.cpp

#include "Moteur.h"

using namespace std;
using namespace sf;

Moteur::Moteur()
{
    cout << "Construction du moteur." << endl;
}

Moteur::~Moteur()
{
    cout << "Destruction du moteur." << endl;
}

void Moteur::restartHorlogeBarre()
{
    m_horlogeBarre.restart().asSeconds();
}

void Moteur::setPositionBarre(FenPrincipale& window, Barre& barre)
{
    barre.setPosition(window.getLargeur()/2 - barre.getLargeur(), window.getHauteur() - barre.getHauteur());
}

void Moteur::deplacerBarre(FenPrincipale& window, Barre& barre)
{
    float vitesseBarre = barre.getVitesse();
    float largeurBarre = barre.getLargeur();
    float barrePosY = barre.getPositionY();
    float largeurFenetre = window.getLargeur();

    m_tempsBarre = m_horlogeBarre.restart();

    if(Keyboard::isKeyPressed(Keyboard::Left))
    {
        if(barre.getPosition().x > 0)
        {
            barre.move(Vector2f(-vitesseBarre * m_tempsBarre.asSeconds(), 0));
        }
        else
        {
            barre.setPosition(0, barrePosY);
        }
    }
    else if(Keyboard::isKeyPressed(Keyboard::Right))
    {
        if(barre.getPosition().x < largeurFenetre - largeurBarre)
        {
            barre.move(Vector2f(vitesseBarre * m_tempsBarre.asSeconds(), 0));
        }
        else
        {
            barre.setPosition(largeurFenetre - largeurBarre, barrePosY);
        }
    }
}
 

Pages: [1]