メニューの選択画面の応用

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
YUUKI

メニューの選択画面の応用

#1

投稿記事 by YUUKI » 10年前

こんばんは。
先日もお世話になったYUUKIと申します。
早速ですが、質問させていただきます。

以下に記すコード(出典は新ゲームプログラミングの館 様)で、
たとえば、ゲームスタートでエンターキーを押したら、WinMain関数は1を返し、
おまけでエンターキーをおしたら、WinMain関数は2を返す
というようなプログラムを作りたいと思い、C++のテキストを見ながら色々考えたのですが、どうすれば
よいのか分かりません。

ご指導いただければ幸いです。

コード:

#include "DxLib.h"

int Key[256]; // キーが押されているフレーム数を格納する

// キーの入力状態を更新する
int gpUpdateKey(){
	char tmpKey[256]; // 現在のキーの入力状態を格納する
	GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
	for( int i=0; i<256; i++ ){ 
		if( tmpKey[i] != 0 ){ // i番のキーコードに対応するキーが押されていたら
			Key[i]++;     // 加算
		} else {              // 押されていなければ
			Key[i] = 0;   // 0にする
		}
	}
	return 0;
}

// メニュー項目の表示に必要な構造体を用意する
typedef struct{
        int x, y;       // 座標格納用変数
        char name[128]; // 項目名格納用変数
} MenuElement_t ;

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

        // メニュー項目要素を5つ作る
        MenuElement_t MenuElement[5]={
                {  80, 100, "ゲームスタート" }, // タグの中身の順番で格納される。xに80が、yに100が、nameに"ゲームスタート"が
                { 100, 150, "おまけ" },
                { 100, 200, "ヘルプ" },
                { 100, 250, "コンフィグ" },
                { 100, 300, "ゲーム終了" },
        };
        int SelectNum = 0; // 現在の選択番号

        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){

                // 計算フェーズ 

                if( Key[ KEY_INPUT_DOWN ] == 1 ){ // 下キーが押された瞬間だけ処理

                        SelectNum = ( SelectNum + 1 ) % 5; // 現在の選択項目を一つ下にずらす(ループする)
                }

		if( Key[ KEY_INPUT_UP ] == 1 ){ // 上キーが押された瞬間だけ処理

			SelectNum = ( SelectNum + 4 ) % 5; // 現在の選択項目を一つ上にずらす(逆ループする)
		}

		if( Key[ KEY_INPUT_DOWN ] == 1 || Key[ KEY_INPUT_UP ] == 1 ){ // 下キーか、上キーが押された瞬間
			for( int i=0; i<5; i++ ){              // メニュー項目数である5個ループ処理
				if( i == SelectNum ){          // 今処理しているのが、選択番号と同じ要素なら
					MenuElement[i].x = 80; // 座標を80にする
				} else {                       // 今処理しているのが、選択番号以外なら
					MenuElement[i].x = 100;// 座標を100にする
				}
			}
		}

		// 描画フェーズ

		for( int i=0; i<5; i++ ){ // メニュー項目を描画
			DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
		}

	}

	DxLib_End(); // DXライブラリ終了処理
	return 0;
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: メニューの選択画面の応用

#2

投稿記事 by softya(ソフト屋) » 10年前

>たとえば、ゲームスタートでエンターキーを押したら、WinMain関数は1を返し、おまけでエンターキーをおしたら、WinMain関数は2を返す

WinMain関数からreturnするとプログラムが終了しますが、たぶん意味が違うんでしょうね。
最大限に想像を働かせると、ゲームスタートでエンターキーを押したら1を表示したい、おまけでエンターキーを押したら2を表示したいと言うことでしょうか?
これであれば、そのまま条件をif文に書いてDrawFormatString()するだけで良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

YUUKI

Re: メニューの選択画面の応用

#3

投稿記事 by YUUKI » 10年前

softoya(ソフト屋)さん
こんにちは。
分かりにくい表現ですいません。

>最大限に想像を働かせると、ゲームスタートでエンターキーを押したら1を表示したい、おまけでエンターキーを押したら2を表示したいと言うことでしょうか?
表示ではなく、自分で作ったほかの関数に1や2を渡したいということです。

渡した先の関数で、1や2といった値に応じた処理を行いたいと思っています。

Rittai_3D
記事: 525
登録日時: 11年前

Re: メニューの選択画面の応用

#4

投稿記事 by Rittai_3D » 10年前

YUUKI さんが書きました:>最大限に想像を働かせると、ゲームスタートでエンターキーを押したら1を表示したい、おまけでエンターキーを押したら2を表示したいと言うことでしょうか?
表示ではなく、自分で作ったほかの関数に1や2を渡したいということです。

渡した先の関数で、1や2といった値に応じた処理を行いたいと思っています。
ご自分で考えた関数のコードを貼ってみて下さい。
初心者です

アバター
usao
記事: 1887
登録日時: 11年前

Re: メニューの選択画面の応用

#5

投稿記事 by usao » 10年前

(1)「エンターキーが押されたとき」という処理を書く
(2)SelectNum が現在選択項目を表す値を持っているのだから,処理部に SelectNum を渡す.

……だけで済むと思います.
(SelectNumは0-base,質問文での値は1-baseだという微々たる違いこそあれ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: メニューの選択画面の応用

#6

投稿記事 by softya(ソフト屋) » 10年前

たぶん検討されていることが不足していると思います。

こちらに書かれているような形が理想なのでは?
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/sp_07.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る