【发布时间】:2019-01-19 22:29:18
【问题描述】:
在 MFC 中制作我的 Breakout 游戏时,我选择序列化我的 CBlock 对象,以便玩家可以在我制作的关卡编辑器上制作自己的“地图”,保存时一切都很好;我所做的一切就是用for 序列化我所有的CBlock 对象,因为我的所有CBlock 对象都在vector<CBlock*> 上。读取文件时出现问题。主要问题是我的程序不知道如何在文件末尾结束时停止读取。我已经尝试了来自CArchive 的大部分bool 方法。唯一有效的是CArchive::IsLoading(),但问题是尽管已到达文件末尾,它仍继续从文件中读取。
CString m_filter = TEXT("Super Breakout Maker Files (*.sbm)|*.sbm|All Files (*.*)|*.*||");
CFile m_loadFile;
CFileDialog m_fileDlg(TRUE, TEXT(".sbm"), TEXT("mylayout"), OFN_HIDEREADONLY, m_filter, NULL, 0, TRUE);
//CFileDialog m_fileDlg(FALSE, TEXT(".sbm"), TEXT("mylayout"), 0, m_filter);
if (m_fileDlg.DoModal() == IDOK)
{
if (m_blockLayout.size() > 0)
{
for (int i = 0; i < m_blockLayout.size(); i++)
{
delete(m_blockLayout[i]);
}
m_blockLayout.clear();
}
m_loadFile.Open(m_fileDlg.GetFileName(), CFile::modeRead);
CArchive m_loadArchive(&m_loadFile, CArchive::load);
while (m_loadArchive.IsLoading()==true)
{
CBlock* block = new CBlock;
block->Serialize(m_loadArchive);
block->AssignBlockType();
block->m_blockState.CreateCompatibleDC(pDC);
LoadBlock(block->m_blockState, m_blockStateArray, block->GetBlockType(), block->GetHits());
m_blockLayout.push_back(block);
}
m_loadArchive.Close();
if (m_blockLayout.size() > 0)
{
MessageBox(TEXT("Your layout was successfully loaded! Resume game to play."), TEXT("Notification"), MB_ICONINFORMATION);
m_pBall->SetInitialPosition(m_ballBMP, m_pBar, m_barBMP);
}
else
{
MessageBox(TEXT("Unable to read file. Corrupted or incompatible data."), TEXT("Notification"), MB_ICONERROR);
}
}
else
{
return;
}
m_loadFile.Close();
这是我的加载方式,但正如我提到的,迭代不知道从哪里结束阅读。
【问题讨论】:
标签: c++ serialization mfc