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

Auteur Sujet: [Résolu] Problème étrange sf::Color  (Lu 2663 fois)

0 Membres et 1 Invité sur ce sujet

Eraac

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
[Résolu] Problème étrange sf::Color
« le: Avril 16, 2014, 09:42:56 am »
Bonjour,

J'ai un problème très étrange sur la SFML (2.1) avec sf::Color et particulièrement avec les couleurs pré-définis (Cyan, Red, Yellow, etc). Voilà le code :

Const.hpp
#pragma once

const sf::Color selectState      = sf::Color::Blue; // Ne fonctionne pas (couleur noir)
const sf::Color test = sf::Color(125, 125, 125); // Fonctionne (couleur marron)
const sf::Color unknowState = sf::Color::Cyan;  // Ne fonctionne pas (couleur noir)
const sf::Color alreadyTouchState = sf::Color::Black;
const sf::Color emptyState      = sf::Color::Yellow;  // Ne fonctionne pas (couleur noir)
const sf::Color boatTouchState = sf::Color::Red;  // Ne fonctionne pas (couleur noir)

 

Case.hpp
#include <SFML\Graphics.hpp>
#include "const.hpp"

class Case
{
        public:
                                                Case(void);
                                                ~Case(void);           

                void                            setPosition(int p_X, int p_Y);
                void                            select();
                void                            unselect();
                StateLastHit            fire();
                sf::RectangleShape const& getSprite() const;

        private:
                Case::Status            _status;
                sf::RectangleShape      _case;

};
 

Case.cpp (Les zones avec les sf::Color sont normalement supposé avoir les const défini dans const.hpp)
#include "Case.hpp"

Case::Case(void) : _status(Status::Empty), _case(sf::Vector2f(SIZE_CASE, SIZE_CASE)) {
        _case.setFillColor(sf::Color::Cyan);     // unknowState
}


Case::~Case(void) {
}


void Case::setPosition(int p_X, int p_Y)
{
        _case.setPosition(p_X, p_Y);
}


void Case::select()
{
        if(_status == Status::Empty)
                _case.setFillColor(sf::Color::Blue); // selectState
        else
                _case.setFillColor(sf::Color::Black); // alreadyTouchState
}


void Case::unselect()
{
        if(_status == Status::Empty)
                _case.setFillColor(sf::Color::Cyan); // unknowState
        else if(_status == Status::EmptyTouch) // Touch but nothing
                _case.setFillColor(emptyState); // emptyState
        else // Touch a boat
                _case.setFillColor(sf::Color::Red); // boatTouchState

}


StateLastHit Case::fire() {
       
        // Server request here

        if(_status == Status::Empty) {
                _status = Status::EmptyTouch;
                _case.setFillColor(emptyState);
        }

        return StateLastHit::onSea;
}


sf::RectangleShape const& Case::getSprite() const
{
        return _case;
}
 

En step-by-step le compilateur m'annonce que les const sf::Color sont égales à r = 0, g = 0, b = 0 (donc noir)

PS : Je suis sous Visual Studio 2012
« Modifié: Avril 16, 2014, 01:54:51 pm par Eraac »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème étrange sf::Color
« Réponse #1 le: Avril 16, 2014, 10:36:37 am »
Tes variables globales peuvent très bien être initialisées avant celles de SFML (le standard C++ ne fixe pas d'ordre pour l'initialisation des variables globales entre différents fichiers), du coup si c'est le cas tu n'auras effectivement pas les bonnes valeurs.

D'autant plus que définir des variables globales dans un en-tête, ça finit rapidement en erreur d'édition de liens (il suffit d'inclure cet en-tête dans deux fichiers .cpp différents).
Laurent Gomila - SFML developer

Eraac

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Problème étrange sf::Color
« Réponse #2 le: Avril 16, 2014, 10:43:47 am »
Quel serait donc la meilleur solution ? Mettre les couleurs directement dans Case.hpp (en attribut static) ? Dans la mesure où ces variables sont uniquement utilisées dans cette classe.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème étrange sf::Color
« Réponse #3 le: Avril 16, 2014, 12:38:59 pm »
Les attributs statiques sont des variables globales, ça ne changerait rien.

Il faut se débrouiller pour que les variables sf::Color::Xxx ne soient pas lues avant d'entrer dans ton main(). Après il y a plein de façons de faire : tu peux remplacer tes variables par des fonctions ou des macros, ou alors garder tes variables globales mais les initialiser plus tard, ... à toi de voir ce qui te plaît le plus.
Laurent Gomila - SFML developer

Eraac

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Problème étrange sf::Color
« Réponse #4 le: Avril 16, 2014, 01:54:39 pm »
Merci Laurent. Je vais certainement utilisé des macros

kimci86

  • Full Member
  • ***
  • Messages: 128
    • Voir le profil
Re : [Résolu] Problème étrange sf::Color
« Réponse #5 le: Avril 16, 2014, 07:57:50 pm »
Pourquoi ne pas utiliser des références ?

const sf::Color& selectState = sf::Color::Blue;