Michael Morrison 编写的游戏编程入门第一版(2005)因为用的编辑器对于现在来说很古老,运行时与现在的vs2012有一些冲突,这里将其中的一些解决问题公布如下:
1、
TCHAR szText[64]
wprintf(szText,"You are won in %d g_iTries",Tries);
MessageBox(g_Game->GetWindow,szText,TEXT("123"),MB_OK);
改动如下:
wprintf((LPCSTR)L(szText),"You are won in %d g_iTries",Tries);
这里与wprintf函数有关
2、
对于播放音乐函数:
PlaySound((LPCSTR)IDW_TAUNT, g_hInstance, SND_ASYNC | SND_RESOURCE);
改动如下:
PlaySoundW((LPCWSTR)IDW_TAUNT, g_hInstance, SND_ASYNC | SND_RESOURCE);
3、
对于从第十章后出现的内存错误主要的罪魁祸首是vs2008以后的编译器安全审查更加严格,所以会报错。
并且其出现错误的主要原因是管理子画面的自画面列表vector有问题:
void GameEngine::UpdateSprites()
{
// Check to see if the sprite vector needs to grow
if (m_vSprites.size() >= (m_vSprites.capacity() / 2))
m_vSprites.reserve(m_vSprites.capacity() * 2);
// Update the sprites in the sprite vector
RECT rcOldSpritePos;
SPRITEACTION saSpriteAction;
vector<Sprite*>::iterator siSprite;
for (siSprite = m_vSprites.begin(); siSprite != m_vSprites.end(); siSprite++)
{
// Save the old sprite position in case we need to restore it
rcOldSpritePos = (*siSprite)->GetPosition();
// Update the sprite
saSpriteAction = (*siSprite)->Update();
// Handle the SA_KILL sprite action
if (saSpriteAction & SA_KILL)
{
delete (*siSprite);
m_vSprites.erase(siSprite);
siSprite--;
continue;
}
// See if the sprite collided with any others
if (CheckSpriteCollision(*siSprite))
// Restore the old sprite position
(*siSprite)->SetPosition(rcOldSpritePos);
}
}
改动如下:
void GameEngine::UpdateSprites()
{
// Check to see if the sprite vector needs to grow
if (m_vSprites.size() >= (m_vSprites.capacity() / 2))
m_vSprites.reserve(m_vSprites.capacity() * 2);
// Update the sprites in the sprite vector
RECT rcOldSpritePos;
SPRITEACTION saSpriteAction;
vector<Sprite*>::iterator siSprite;
for (siSprite = m_vSprites.begin(); siSprite != m_vSprites.end(); siSprite++)
{
// Save the old sprite position in case we need to restore it
rcOldSpritePos = (*siSprite)->GetPosition();
// Update the sprite
saSpriteAction = (*siSprite)->Update();
// Handle the SA_KILL sprite action
if (saSpriteAction & SA_KILL)
{
delete (*siSprite);
siSprite = m_vSprites.erase(siSprite); //!!!!!!
siSprite--;
continue;
}
// See if the sprite collided with any others
if (CheckSpriteCollision(*siSprite))
// Restore the old sprite position
(*siSprite)->SetPosition(rcOldSpritePos);
}
}
对于
void GameEngine::CleanupSprites()
{
// Delete and remove the sprites in the sprite vector
vector<Sprite*>::iterator siSprite;
for (siSprite = m_vSprites.begin(); siSprite != m_vSprites.end(); siSprite++)
{
delete (*siSprite);
m_vSprites.erase(siSprite);
siSprite--;
}
}
改动如下:
void GameEngine::CleanupSprites()
{
// Delete and remove the sprites in the sprite vector
vector<Sprite*>::iterator siSprite;
for (siSprite = m_vSprites.begin(); siSprite != m_vSprites.end();)
{
delete (*siSprite);
siSprite = m_vSprites.erase(siSprite);
// siSprite--;
}
}
这主要是与vector的迭代器失效问题有关。
你可以一本文为基础进行进一步学习。