ページ 11

C++でのメニュー画面

Posted: 2016年4月10日(日) 22:38
by 夢幻ノ月夜
ゲームプログラミングの館にあるC++でのメニューの作り方を読んでみたのですが
あそこに書いてあった方法で「項目の数を可変」にすることは出来るのでしょうか?
条件を満たすとステージが開放されるという形にしたいのですが、
どうしたら実現できるでしょうか?

Re: C++でのメニュー画面

Posted: 2016年4月11日(月) 04:20
by DVDM
>> 夢幻ノ月夜さん
http://dixq.net/g/sp_06.html
こちらのページのこと宜しいでしょうか。
上から流し読みしたので間違ってるところもあるかもしれませんが。

例えば class Secret : public BaseScene{ ... };
というような BaseScene クラスを派生した解放画面用のシーンクラスを用意。

各シーンの状態が enum 列挙された部分に
eScene_Secret を追加。

Menu::Update() 内に、解放画面用の処理を追加

コード:

//更新
void Menu::Update(){

    ・・・

    if(解放条件フラグがON && 決定キーが押されたら){
        mSceneChanger->ChangeScene(eScene_Secret); //シーンを解放画面に変更
    }
}
メニュー項目を描画してるところの処理も同じように解放条件が整うまでは描画しないなどに変更

コード:

//描画
void Menu::Draw(){
    BaseScene::Draw();//親クラスの描画メソッドを呼ぶ
    DrawString(0, 0,"メニュー画面です。",GetColor(255,255,255));
    DrawString(0,20,"Gキーを押すとゲーム画面に進みます。",GetColor(255,255,255));
    DrawString(0,40,"Cキーを押すと 設定画面に進みます。",GetColor(255,255,255));

    if(解放条件フラグが ON)
        DrawString(0,40,"決定キーを押すと 解放画面に進みます。",GetColor(255,255,255));
}
SceneMgr::Update 内に解放画面を実行するための準備を行う。

コード:

void SceneMgr::Update(){
    if(mNextScene != eScene_None){    //次のシーンがセットされていたら
        mScene->Finalize();//現在のシーンの終了処理を実行
        delete mScene;

        ・・・

        switch(mNextScene){       //シーンによって処理を分岐
        case eScene_Secret:        //次の画面が解放画面なら
            mScene = (BaseScene*) new Secret(this);   //解放画面のインスタンスを生成する
            break;//以下略
        }
        mNextScene = eScene_None;    //次のシーン情報をクリア
        mScene->Initialize();    //シーンを初期化
    }

    mScene->Update(); //シーンの更新
}
このような形で処理を追加・分岐するようにしておけば可変する項目はとりあえず出来るように思いました。

Re: C++でのメニュー画面

Posted: 2016年4月11日(月) 21:24
by 夢幻ノ月夜
DVDM さんが書きました:>> 夢幻ノ月夜さん
http://dixq.net/g/sp_06.html
こちらのページのこと宜しいでしょうか。
上から流し読みしたので間違ってるところもあるかもしれませんが。

例えば class Secret : public BaseScene{ ... };
というような BaseScene クラスを派生した解放画面用のシーンクラスを用意。

各シーンの状態が enum 列挙された部分に
eScene_Secret を追加。

Menu::Update() 内に、解放画面用の処理を追加

コード:

//更新
void Menu::Update(){

    ・・・

    if(解放条件フラグがON && 決定キーが押されたら){
        mSceneChanger->ChangeScene(eScene_Secret); //シーンを解放画面に変更
    }
}
メニュー項目を描画してるところの処理も同じように解放条件が整うまでは描画しないなどに変更

コード:

//描画
void Menu::Draw(){
    BaseScene::Draw();//親クラスの描画メソッドを呼ぶ
    DrawString(0, 0,"メニュー画面です。",GetColor(255,255,255));
    DrawString(0,20,"Gキーを押すとゲーム画面に進みます。",GetColor(255,255,255));
    DrawString(0,40,"Cキーを押すと 設定画面に進みます。",GetColor(255,255,255));

    if(解放条件フラグが ON)
        DrawString(0,40,"決定キーを押すと 解放画面に進みます。",GetColor(255,255,255));
}
SceneMgr::Update 内に解放画面を実行するための準備を行う。

コード:

void SceneMgr::Update(){
    if(mNextScene != eScene_None){    //次のシーンがセットされていたら
        mScene->Finalize();//現在のシーンの終了処理を実行
        delete mScene;

        ・・・

        switch(mNextScene){       //シーンによって処理を分岐
        case eScene_Secret:        //次の画面が解放画面なら
            mScene = (BaseScene*) new Secret(this);   //解放画面のインスタンスを生成する
            break;//以下略
        }
        mNextScene = eScene_None;    //次のシーン情報をクリア
        mScene->Initialize();    //シーンを初期化
    }

    mScene->Update(); //シーンの更新
}
このような形で処理を追加・分岐するようにしておけば可変する項目はとりあえず出来るように思いました。
やはり開放しているステージにフラグを立てることで実現しようと思います
ありがとうございます