所谓存档,实际上就是事先将物体状态暂时保存为一个副本,然后在必要的时候利用副本进行恢复,例如在仙剑里,我们在与厉害的boss过招时,一定会先存档,如果一旦不幸牺牲,就可以利用存档来重新开始,这里的存档,就涉及人物状态,场景状态等.
以人物状态的恢复为例,如果使用memento模式来实现,我们需要三个对象:人物类,状态存储箱,存储箱管理者,这里对于什么是memento模式就不细说了,给出简单的实现例子,针对场景类等也适用,因此完整的存档读档需要多个备忘录共同工作完成.
人物备忘录的实现(简单例子):
#include <iostream>
using namespace std;
class ObjDetailMemento{
public:
virtual GetState( const int hp ){
m_tempHp = hp;
}
virtual SetState( int& hp ){
hp = m_tempHp;
}
protected:
int m_tempHp;
};
//----------------obj----------------------
class GameObj{
public:
GameObj(){}
GameObj( int hp, int mp ) : m_hp( hp ), m_mp( mp ){}
void GameObjNowState(){
void GameObjNowState(){
cout<<"Hp is:"<<m_hp<<endl;
cout<<"Mp is:"<<m_mp<<endl;
if( m_hp > 0 )
cout<<"人物活蹦乱跳"<<endl;
else
cout<<"人物革屁"<<endl;
} }
void BloodFight(){
this->m_hp = 0;
this->m_mp = 0;
}
ObjDetailMemento* GetStateCopy(){
ObjDetailMemento* memPtr = new ObjDetailMemento();
memPtr->GetState( m_hp );
return memPtr;
}
void RestoreState( ObjDetailMemento* memPtr ){
memPtr->SetState( m_hp );
}
private:
int m_hp;
int m_mp;
};
//-----------------CareTaker
class CareTaker{
public:
CareTaker( ObjDetailMemento* mineToCare ) : m_mementoPtr( mineToCare ){};
~CareTaker(){
if( m_mementoPtr )
delete m_mementoPtr;
}
ObjDetailMemento* GetMemento(){
return m_mementoPtr;
}
private:
ObjDetailMemento* m_mementoPtr;
};
int main(){
//开始游戏
cout<<"开始游戏"<<endl;
GameObj obj( 100, 100 );
obj.GameObjNowState();
//战前存储
cout<<"存档"<<endl;
CareTaker c( obj.GetStateCopy() );
//大战失败
cout<<"一场血战之后"<<endl;
obj.BloodFight();
obj.GameObjNowState();
//读取存档
cout<<"读档"<<endl;
obj.RestoreState( c.GetMemento() );
obj.GameObjNowState();
return 0;
}