我一直在关注快板5平台和他的文件管理器使用的教程!openFile.eof(),我听说它不好,我很确定它是什么让我的矢量下标超出范围错误。除了它,还有什么我可以使用的吗?另外,你能检查一下我的图层类,以防我的矢量下标超出范围错误吗?我想不出来,我很确定它来自文件管理器,但我不知道。
它仅输出地图的第一行。当我把它改成“而”(标准:::getline(打开文件,行))时,我甚至从未去过标准::cout
当我把它改为while(std::getline(openFile,line))时,属性和内容各只有8个。
仍然需要帮助=\
文件管理器。卡片打印处理机(Card Print Processor的缩写)
#include "FileManager.h"
FileManager::FileManager()
{
identifierFound = false;
}
FileManager::~FileManager()
{
}
void FileManager::LoadContent(const char *filename, std::vector<std::vector<std::string>> &attributes, std::vector<std::vector<std::string>> &contents)
{
std::ifstream openFile(filename);
std::string line, newLine;
if(openFile.is_open())
{
while(std::getline(openFile, line))
{
std::stringstream str;
if(line.find("Load=") != std::string::npos)
{
type = LoadType::Attributes;
line = line.erase(0, line.find("=") + 1);
tempAttributes.clear();
}
else
{
type = LoadType::Contents;
tempContents.clear();
}
str << line;
while(std::getline(str, newLine, ']'))
{
newLine.erase(std::remove(newLine.begin(), newLine.end(), '['), newLine.end());
std::string erase = " \t\n\r";
newLine.erase(newLine.find_last_not_of(erase) + 1);
if(type == LoadType::Attributes)
tempAttributes.push_back(newLine);
else
tempContents.push_back(newLine);
std::cout << newLine << std::endl;
}
if(type == LoadType::Contents && tempContents.size() > 0)
{
attributes.push_back(tempAttributes);
contents.push_back(tempContents);
}
}
}
else
{
}
}
void FileManager::LoadContent(const char *filename, std::vector<std::vector<std::string>> &attributes, std::vector<std::vector<std::string>> &contents, std::string identifier)
{
std::ifstream openFile(filename);
std::string line, newLine;
if(openFile.is_open())
{
while(!openFile.eof())
{
std::stringstream str;
std::getline(openFile, line);
if(line.find("EndLoad=") != std::string::npos && line.find(identifier) != std::string::npos)
{
identifierFound = false;
break;
}
else if(line.find("Load=") != std::string::npos && line.find(identifier) != std::string::npos)
{
identifierFound = true;
continue;
}
if(identifierFound)
{
if(line.find("Load=") != std::string::npos)
{
type = LoadType::Attributes;
line = line.erase(0, line.find("=") + 1);
tempAttributes.clear();
}
else
{
type = LoadType::Contents;
tempContents.clear();
}
str << line;
while(std::getline(str, newLine, ']'))
{
newLine.erase(std::remove(newLine.begin(), newLine.end(), '['), newLine.end());
std::string erase = " \t\n\r";
newLine.erase(newLine.find_last_not_of(erase) + 1);
if(type == LoadType::Attributes)
tempAttributes.push_back(newLine);
else
tempContents.push_back(newLine);
std::cout << newLine << std::endl;
}
if(type == LoadType::Contents && tempContents.size() > 0)
{
attributes.push_back(tempAttributes);
contents.push_back(tempContents);
}
}
}
}
else
{
}
}
层.CPP
#include "Layer.h"
Layer::Layer(void)
{
}
Layer::~Layer(void)
{
}
std::pair<int, int> Layer::SetTiles(std::string tileString)
{
std::pair<int, int> tile;
tile.first = atoi(tileString.substr(0, tileString.find(',')).c_str());
tile.second = atoi(tileString.substr(tileString.find(',') + 1).c_str());
return tile;
}
void Layer::LoadContent(std::string layerID, std::string mapID)
{
std::string fileName = "Maps/"+mapID+".txt";
fileManager.LoadContent(fileName.c_str(), attributes, contents, layerID);
int indexY = 0;
for(int i = 0; i < attributes.size(); i++)
{
for(int j = 0; j < contents[i].size(); j++)
{
if(attributes[i][j] == "SolidTiles")
{
solidTiles.push_back(SetTiles(contents[i][j]));
std::cout << contents[i][j] << std::endl << std::endl;
}
else if(attributes[i][j] == "TileSheet")
{
std::cout << contents[i][j] << std::endl << std::endl;
tileSheet = al_load_bitmap(contents[i][j].c_str());
}
else if(attributes[i][j] == "StartLayer")
{
for(int k = 0; k < contents[i].size(); k++)
{
std::cout << contents[i][k] << " k: " << k << " contents: " << contents[i].size() << std::endl << std::endl;
if(contents[i][k] != "---")
{
std::cout << contents[i][k] << std::endl << std::endl;
ALLEGRO_BITMAP *tileImage;
Tile::State tempState = Tile::State::Passive;
std::pair<int, int> tile = SetTiles(contents[i][k]);
if(std::find(solidTiles.begin(), solidTiles.end(), tile) != solidTiles.end())
{
tempState = Tile::State::Solid;
}
tileImage = al_create_sub_bitmap(tileSheet, tile.first * 32, tile.second * 32, 32, 32);
std::pair<float, float> position(k * 32, indexY * 32);
Tile tileInstance;
tiles.push_back(tileInstance);
tiles[tiles.size()-1].SetContent(tileImage, tempState, position);
std::cout << tiles.size() << std::endl;
}
}
indexY++;
}
}
}
}
void Layer::UnloadContent()
{
for(int i = 0; i < tiles.size(); i++)
tiles[i].UnloadContent();
al_destroy_bitmap(tileSheet);
}
void Layer::Update()
{
}
void Layer::Draw(ALLEGRO_DISPLAY *display)
{
for(int i = 0; i < tiles.size(); i++)
tiles[i].Draw(display);
}
map1.txt
Load=[MapProperties]
Load=[TileDimensions]
[32,32]
EndLoad=[MapProperties]
Load=[Layer1]
Load=[SolidTiles]
[2,0]
[1,0]
Load=[NullTile]
[---]
Load=[Motion]
[2,0:Static]
Load=[TileSheet]
[TileSheets/tilesheet1.png]
Load=[StartLayer]
[2,0][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---]
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---]
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---]
[---][---][---][---][---][---][---][---][2,0][2,0][2,0][---][---][---][---][---]
[---][---][---][---][---][---][---][2,0][---][---][---][---][---][---][---][---]
[---][---][---][---][---][---][2,0][---][---][---][---][---][---][---][---][---]
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---]
[---][---][2,0][2,0][2,0][---][---][---][---][---][---][---][---][---][---][---]
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---]
[---][---][---][---][---][---][---][---][---][---][---][---][---][---][---][---]
[1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0][1,0]
Load=[EndLayer]
[dummy]
EndLoad=[Layer1]
Load=[PlayerPosition]
[0,0]
首先,真正的问题不是使用文件。eof()
;有些情况下,它就是您想要的(尽管我想不出它在中的位置,而
中的情况是合适的,所有情况都是在您已经检测到输入失败之后)。真正的问题是,代码使用std::getline
读取的值,而没有验证它是否成功。由于这在代码中只出现一次,所以只需使用与其他循环相同的解决方案:while(std::getline(…))
。
问题内容: 我有类似 “&ampauml; s&amparing;”之 类的字符串 需要像这样的 “äså” 进行转换请在这里帮助我。 提前致谢 问题答案: 看一下Apache Commons库中的类。(具体方法)。
问题内容: 有什么办法可以反编译Linux .so? 问题答案: 有反编译器,但是反编译器可能不会以与原始程序所用语言相同的语言发出代码。 也有反汇编程序,可以将机器代码重新汇编为汇编程序。 反编译Wiki 可能是其他信息的良好来源。
问题内容: 有什么办法可以限制芹菜的工人数量?我的服务器很小,芹菜总是在1个核心处理器上创建10个进程。我想将此数目限制为3个进程。 问题答案: 我尝试在settings.py文件中将并发设置为1,将max_tasks_per_child设置为1,并同时运行3个任务。它只是以用户的身份生成1个进程,而以芹菜的形式生成其他2个进程。它应该只运行1个进程,然后等待其完成再运行另一个进程。 我正在使用d
问题内容: 是否可以在不设置/检查任何标志/信号灯/等的情况下终止正在运行的线程? 问题答案: 在Python和任何语言中,突然终止线程通常都是一种糟糕的模式。请考虑以下情况: 线程持有必须正确关闭的关键资源 该线程创建了其他几个必须同时终止的线程。 如果你负担得起的话(如果你要管理自己的线程),处理此问题的一种好方法是有一个标志,每个线程定期检查一次,以查看是否该退出。 例如: 在此代码中,你应
想要保持页面在edge浏览器里不被休眠,要如何弄呐。
问题内容: 我想从MySQL过程调用并执行PHP脚本。这可能吗? [编辑] 实际上,我正在尝试在满足条件时引发一个事件,例如,当我的表字段值与当前时间匹配时。然后,我想捕获事件并发送电子邮件。 问题答案: 有可能,请参见MySQL FAQ,以获取有关如何 触发器可以通过UDF调用外部应用程序吗? 但是,如果您不得不诉诸于此,那对您而言可能是不好的设计