2016-11-25 5 views
0

Je suis en train de faire un démineur en utilisant SDL et je dois donc utiliser du texte pour étiqueter chaque tuile avec un nombre représentant le nombre de mines autour de cette tuile. Je vais utiliser les chiffres 1-4 pour l'instant, et la façon dont chaque nombre est affiché est constante, car chaque nombre a toujours le même texte, la même police, la même taille et la même couleur. La couleur diffère entre chacun des nombres 1-4, mais le nombre 1, par exemple, sera toujours bleu, et le nombre 2 sera toujours vert. Je voudrais avoir une variable statique pour chacun des nombres 1-4, de sorte que je puisse facilement définir la valeur d'une tuile. Voici ce que je l'ai fait:SDL: Création de variables de texte statiques

std::map<std::string, Text> Text::numbers; // statically defined 

Text::Text(...) { 
    ... 
    initNumbers(); 
} 

void Text::initNumbers() { 
    numbers["1"] = Text("res/arial.ttf", 20, "1", { 0, 0, 255, 255 }); 
    numbers["2"] = Text("res/arial.ttf", 20, "2", { 0, 255, 0, 255 }); 
    numbers["3"] = Text("res/arial.ttf", 20, "3", { 255, 0, 0, 255 }); 
    numbers["4"] = Text("res/arial.ttf", 20, "4", { 0, 0, 150, 255 }); 
} 

La classe Text est juste pour faire du texte et de le mettre à l'écran. Quoi qu'il en soit, j'ai fait un std::map appelé numbers auquel je peux accéder comme suit: Text::numbers["2"] et cela retournera un objet Text qui s'affichera sous le numéro 2 dans ce cas. J'initialise la carte en appelant initNumbers() dans le constructeur de la classe Text.

Dans la classe de tuile, il y a une variable de membre Text number, qui est utilisée pour afficher le nombre (1-4) de mines qui entourent cet objet de tuile. Lorsque je l'initialise à Text::numbers["2"], par exemple, le nombre ne s'affiche pas sur l'écran. Lorsque je l'initialise manuellement à Text("res/arial.ttf", 20, "2", { 0, 255, 0, 255 }), le nombre s'affiche.

Je ne peux pas comprendre quel est le problème ou comment résoudre ce problème. Peut-être que cela a à voir avec quand TTF_Init() est appelé; c'est-à-dire qu'il est appelé après l'initialisation de std::map<...> numbers (ce qui serait mauvais car le texte doit être initialisé après l'initialisation de la bibliothèque). Bien que j'appelle essentiellement TTF_Init() au début de main et je commence seulement à fabriquer des objets de tuile par la suite. Aucune suggestion? Merci.

Répondre

1

initNumbers est appelée lorsqu'un objet Text est construit. Si vous ne créez jamais un objet Text qui utilise ce constructeur, votre initialisation de numbers ne se produira pas.

Text::initNumbers doit être appelée à partir d'ailleurs, à côté d'un autre code d'initialisation d'application.

+0

Ahh, merci. Je l'ai appelé dans 'main' à la place et ça marche bien maintenant. –