这么长的故事,我正在为我的游戏编写代码而无法让它发挥作用。我正在初始化一些指针然后决定不删除我正在分配的指针,然后神奇地开始工作。到底是怎么回事?我非常困惑。
我决定摆脱指针的原因是因为我在这个链接上找到的代码。
Game State Machine - GameDevGeek
GameStatesMachine.h
#ifndef __GAMESTATESMACHINE_H__
#define __GAMESTATESMACHINE_H__
#include <vector>
#include <stdio.h>
#include "GameStates.h"
class GameStatesMachine
{
private:
std::vector<GameStates *> data;
GameStatesMachine() {};
GameStatesMachine(GameStatesMachine const&);
void operator=(GameStatesMachine const&);
// you do not delete it this is for cleaning purposes
~GameStatesMachine()
{
while (!data.empty())
pop_back();
printf("GameEngine cleanup\n");
}
public:
static GameStatesMachine& Instance()
{
static GameStatesMachine g_instance;
return g_instance;
}
void push_back(GameStates * state);
void pop_back();
void changeState(GameStates * state);
void render();
void process();
void update();
};
#endif
GameStatesMachine.cpp
#include "GameStatesMachine.h"
void GameStatesMachine::push_back(GameStates * state)
{
if (!data.empty())
data.back()->pause();
data.push_back(state);
data.back()->onEnter();
}
void GameStatesMachine::pop_back()
{
if (!data.empty()) {
data.back()->onExit();
data.pop_back();
}
if (!data.empty())
data.back()->resume();
}
void GameStatesMachine::changeState(GameStates * state)
{
if (!data.empty())
pop_back();
push_back(state);
}
void GameStatesMachine::render()
{
data.back()->render();
}
void GameStatesMachine::process()
{
data.back()->process();
}
void GameStatesMachine::update()
{
data.back()->update();
}
答案 0 :(得分:3)
我看了一下链接中的示例代码。基本上我认为这可归结为对何时需要调用删除的误解。
基本上,您只需在使用new时调用delete。链接中的示例代码都不使用new,而是引擎推送并弹出静态状态:
class CPlayState : public CGameState
{
static CPlayState* Instance() {
return &m_PlayState;
}
// other code
private:
static CPlayState m_PlayState;
}
如何使用CPlayState:
void CIntroState::HandleEvents(CGameEngine* game)
{
// other code.
game->ChangeState( CPlayState::Instance() );
}
基本上,游戏引擎推送并弹出这些静态状态,而不是调用new来实例化它们。由于该对象未使用new创建,因此您不能在其上调用delete。由于它们是静态的,因此在您的流程退出时会清除它们。
有更好的资源来学习C ++范围逻辑和对象生命周期,我建议去Google查找它们。