【发布时间】:2017-08-18 15:54:00
【问题描述】:
我正在开发一个带有对话框的游戏,当您阅读它时会显示文本,就像在 RPG 中一样。我让它工作了,但我的一个问题是当我将它绘制到屏幕上时,有一个奇怪的符号我没有输入并且不在键盘上。我有一个下面的 gif 来演示。
这是我的代码:
TextRenderer.h
#ifndef TEXTRENDERER_H
#define TEXTRENDERER_H
#include <SFML/Graphics.hpp>
#include <iostream>
using namespace sf;
using namespace std;
class TextRenderer {
public:
Texture *t;
Sprite sprite;
string currentString, fullString, eBeforeString;
int currentWordNum, onTheLine;
vector<string> words;
Text drawableText;
Font font;
Clock charTime;
TextRenderer();
void update();
void newText(string nText);
};
#endif // TEXTRENDERER_H
TextRenderer.cpp
#include "TextRenderer.h"
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cstring>
using namespace sf;
using namespace std;
TextRenderer::TextRenderer() {
t = new Texture;
t->loadFromFile("data/images/talkScreen.png");
sprite.setTexture(*t);
sprite.setOrigin(sprite.getGlobalBounds().width/2, 0);
sprite.setScale(4, 4);
font.loadFromFile("data/fonts/VCR_OSD_MONO_1.001.ttf");
drawableText.setFont(font);
drawableText.setFillColor(Color::White);
drawableText.setCharacterSize(30);
currentWordNum = 0; /// Initializing variables
currentString = "";
eBeforeString = "";
}
void TextRenderer::update() {
/// If the current word number (spot in the words vector) is less than
/// the size of the words vector
if (currentWordNum < words.size()) {
if (currentString.length() < words.at(currentWordNum).length()) {
if (charTime.getElapsedTime().asSeconds() >= 0.02) {
currentString = words.at(currentWordNum).substr(0, currentString.length() + 1);
charTime.restart();
onTheLine += 1;
}
} else if (currentString == words.at(currentWordNum)) {
/// If you just finished typing a word
if (charTime.getElapsedTime().asSeconds() >= 0.02) {
eBeforeString += currentString + " ";
currentString = "";
currentWordNum += 1;
onTheLine += 1;
if (currentWordNum != words.size()) {
if (onTheLine + words.at(currentWordNum).length() >= 53) {
eBeforeString += "\n";
onTheLine = 0;
}
}
}
}
}
drawableText.setString(eBeforeString + currentString);
}
void TextRenderer::newText(string nText) {
fullString = nText;
/// Breaking the string into 'words' which I add to a vector
char eStr[fullString.length()];
for (unsigned i = 0; i < fullString.size(); i++) {
eStr[i] = fullString.at(i);
}
char *spt = strtok(eStr, " ");
while (spt != NULL) {
words.push_back(spt);
spt = strtok(NULL, " ");
}
currentString = "";
eBeforeString = "";
currentWordNum = 0;
onTheLine = 0;
drawableText.setString(currentString);
drawableText.setPosition(sprite.getPosition().x + 20 - sprite.getGlobalBounds().width/2, sprite.getPosition().y + 10);
charTime.restart();
}
而在 main.cpp 中,我只是调用
textScreen.newText("Look at the symbol at the very end of this string on the other side of this period .");
【问题讨论】:
-
strtok是老式的 C 代码,通常使用起来很烦人。您是否考虑过使用std::istringstream代替? en.cppreference.com/w/cpp/io/basic_istringstream当你从中读取一个字符串时,它将被空格分隔。 -
可能是这样的:pastebin.com/fF1GZAJ2
-
@quetzalcoatl
cout行只写“成功!”因为算法完成后什么都没有发生。我检查了我刚才写的Node相等运算符,没有任何明显的错误,它只是返回position == otherNode.position -
好吧..所以假设
while永远不会中断并且 if(end) 中的return永远不会返回,那么您怎么知道算法有效并且找到了解决方案?或者您实际上在控制台输出中看到了“成功”? -
@quetzalcoatl 是的,我知道它完成的唯一方法是它是否输出“成功”,如果没有,它会无限期地继续。我也做了它,所以它不可能找到它正在寻找的东西,因为算法穿过墙壁。