ずらずらっと書き並べさせて頂きます。
コンストラクタで指定されているのはFreeGameIniではなくTitleMenuでした。
すいません。
静的関数については
http://marupeke296.com/GDEV_No7_StateImpliment2.html
こちらのデザインの⑤あたりを真似させて頂きました。
正直「?」な所がありますが・・・
main.cpp
コード:
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
ChangeWindowMode(TRUE),SetGraphMode(X_WINDOW,Y_WINDOW,16),DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
Administrator* Admin = new Administrator();
while(ProcessLoop()==0){
if(!Admin->Refresh())break;
}
delete Admin;
DxLib_End(); // DXライブラリ終了処理
return 0;
}
宣言部
コード:
class Administrator{
private:
CDeviceInput DeviceInput;
CRoundScene* RoundScene;
//
//選択中のユニットキャラクター数
int UnitCharacterNum;
int GunNum;
int Select;
void TitleMenu();
void FreeGameIni();
void FreeGame();
void End();
//メソッドを指定します
void SetState(void( Administrator::*func )());
//Trueの場合このクラスはRefreshメソッドにより終了します
bool IsEnd;
//指定中のメソッドのアドレスを格納します
void (Administrator::*Func)(); //関数ポインタ
public:
Administrator();
~Administrator();
//指定中のメソッドを実行します
bool Refresh();
};
定義
コード:
void Administrator::TitleMenu(){
DrawFormatString(10,10,256000,"スペースキーでフリー\nエスケープキーで終了");
if(1==DeviceInput.InputKey(KEY_INPUT_SPACE)){
SetState(&Administrator::FreeGameIni);
}
if(1==DeviceInput.InputKey(KEY_INPUT_ESCAPE)){
SetState(&CGameAdministrator::End);
}
}
void Administrator::FreeGameIni(){
const int SelectPropertiesNum=2;
int* SelectProperties[SelectPropertiesNum]={&UnitCharacterNum,&GunNum};
DrawFormatString(10,10,256000,"スペースキーでスタートESCで戻る");
DrawFormatString(10,30,256000,"人数");
DrawFormatString(100,30,256000,"%d",UnitCharacterNum);
DrawFormatString(10,60,256000,"銃の数");
DrawFormatString(100,60,256000,"%d",GunNum);
if(1==DeviceInput.InputKey(KEY_INPUT_UP)){
Select+=SelectPropertiesNum-1;
}
if(1==DeviceInput.InputKey(KEY_INPUT_DOWN)){
Select++;
}
Select%=SelectPropertiesNum;
if(1==DeviceInput.InputKey(KEY_INPUT_RIGHT)){
*SelectProperties[Select]+=1;
}
if(1==DeviceInput.InputKey(KEY_INPUT_LEFT)){
*SelectProperties[Select]-=1;
}
//Round作成
if(1==DeviceInput.InputKey(KEY_INPUT_SPACE)){
RoundScene = new CRoundScene(UnitCharacterNum,GunNum);
SetState(&Administrator::FreeGame);
}
if(1==DeviceInput.InputKey(KEY_INPUT_ESCAPE)){
SetState(&Administrator::TitleMenu);
}
}
void Administrator::FreeGame(){
//きっとヌルポにはならない
if(FINISH==RoundScene->Refresh()){
delete RoundScene;
SetState(&Administrator::TitleMenu);
}
}
void Administrator::End(){
IsEnd=FINISH;
}
Administrator::Administrator():IsEnd(CONTINUE),Func(&Administrator::TitleMenu),UnitCharacterNum(0),GunNum(0),Select(0){}
Administrator::~Administrator(){}
void Administrator::SetState(void( Administrator::*func )()){
Func = func;
}
bool Administrator::Refresh(){
// メソッドポインタを実行
(this->*Func)();
//このクラスが終了するかどうか
//終了しない場合次のメソッドに移ります。
return IsEnd;
}