我做了一个应该重现那个游戏的程序,“MonkeyType”,你必须在其中写一个特定的文本,如果你犯了一个错误,这个字母变成红色,如果它是好的,这个字母是白色的。
我使用 sfml 制作了一个 sf::Text 对象,它是白色的,如果它是好的,我拿走字母,如果它是错误的,我拿一个空格,我用红色的文本做同样的事情,使相反的.
我用相同的坐标绘制它们。
我使用的是等宽字体,所以字母大小应该不是问题,但随着文本变大,红色文本似乎向左移动。所以字母最终被叠加了。
我有一个类 Mot,它有一个字符串字段和一个用于向该字符串添加字母的方法 ajouterLettre。和一个返回字符串 getMot() 的方法。
class Mot
{
string orthographe_;
public:
...
void ajouterLettre(char lettre) { orthographe_.push_back(lettre); }
string getMot() { return orthographe_; }
};
class Phrase
{
vector<Mot> tabMots_;
public:
...
void ajouterLettre(char lettre);
};
该方法向列表的最后一个单词添加一个字母。
void Phrase::ajouterMot(const Mot& mot) {
tabMots_.push_back(mot);
}
我正在使用 Monospace 字体。 在 main 函数中,我创建了两个文本,一个是红色的,一个是白色的。 和两个对象短语,构成这些 sf::Text 对象的文本。 (1, false) 参数表示该短语只有一个空词 (Mot)。
sf::Text textecrit1(phraseecrite.tiers(0), font, 24);
textecrit1.setFillColor(sf::Color::White);
textecrit1.setPosition(10, 10);
Phrase phraseecrite(1,false);
sf::Text texterreur1("", font, 24);
texterreur1.setFillColor(sf::Color(255, 0, 0));
texterreur1.setPosition(10, 10);
Phrase phraserreur(1, false);
phrase 对象有一个文本方法,它返回一个字符串,该字符串对应于由空格分隔的单词列表。
string Phrase::Text() {
string texte;
if (tabMots_.size() == 1) {
texte = tabMots_[0].getMot();
}
else{
int i;
texte = tabMots_[0].getMot();
for (i = 1; i < tabMots_.size(); i++) {
texte = texte + " " + tabMots_[i].getMot();
}
}
return texte;
}
我有一个 isCorrect 函数,可以判断两个句子(短语)的最后一个字母是否相同。
当用户在键盘上键入一个字母时,短语“phrasecrite”接受该字母,如果正确则使用空格,否则使用字母。 我还更新了渲染 sf::Text
我把它们一个一个地画在另一个上面,这样红色的就覆盖了白色的。 phraseaecrire 是玩家必须匹配的句子。
if (event.text.unicode >= 'a' && event.text.unicode <= 'z') {
phraseecrite.ajouterLettre( event.text.unicode );
textecrit1.setString(phraseecrite.Text());
if (phraseecrite.isCorrect(phraseaecrire1)) {
phraserreur.ajouterLettre(' ');
}
else
{
phraserreur.ajouterLettre(event.text.unicode);
}
即使我在 phraseerreur 中添加一个空格,使它们在字母不正确时处于相同的位置。当文本变大时它会逐渐移动,开始时只是一点点,但当文本很长时它会变大。