選択画面を作りたいです(急いでいます)

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

選択画面を作りたいです(急いでいます)

#1

投稿記事 by tutu » 11年前

龍神録を完成させたのですが、デバッグするとすぐに始まってしまうので、選択画面を作りたいと思っています

アバター
パコネコ
記事: 139
登録日時: 13年前
住所: 大阪

Re: 選択画面を作りたいです(急いでいます)

#2

投稿記事 by パコネコ » 11年前

そうですか。
それでどうしたいのでしょうか?
もしくはどうして欲しいのでしょうか。
その文章からだと、意思表示をしているだけのようにも取れますね。
(意地悪言ってるわけじゃないですよ?)

質問などは具体的にしたほうが、回答を得られやすいですよ。
ニャン!!\(゜ロ\)(/ロ゜)/

tutu

選択画面を作りたいです(急いでいます)

#3

投稿記事 by tutu » 11年前

すいません。書く途中で送信してしまいました。
選択画面を作りたいと思うのですが、このサイトのトピックでmain部分のcase値を1つ増やして選択画面の表示プログラムを入れると書いてあったので、やってみたところエラーがでてしまいます。四聖龍神録Plusみたいな選択画面を作るにはどうしたらいいですか。
main部分のソースコードを入れます。

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();  //現在のパッド入力処理を行う
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	while(ProcessLoop()==0){//メインループ
		music_ini();
		switch(func_state){
			case 0://初回のみ入る処理
				load();		//データロード
				first_ini();//初回の初期化
				func_state=99;
				break;
			case 99://STGを始める前に行う初期化
				ini();
				load_story();
				func_state=100;
				break;
			case 100://通常処理
			//ここにcaseをひとつ増やして選択画面のプログラムを書くとかいてありました。
			
								 enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main();	 enter_func_tm("計算メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
		}
		music_play();			 enter_func_tm("音楽再生");
		fps_wait();				 enter_func_tm("待機した時間",1);
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
		count++;

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

アバター
パコネコ
記事: 139
登録日時: 13年前
住所: 大阪

Re: 選択画面を作りたいです(急いでいます)

#4

投稿記事 by パコネコ » 11年前

確かにcaseを増やせば、そこに選択画面を作ることは可能かと思います。
(むしろほかどうすんのと聞かれてもすぐにはわかりませんがw)

残念ながら龍神ろくのソースをすべて覚えているわけでもないですし、今から調べるにもこの情報だと少し難しいですね。

どのようなエラーコードが、出力されたのかわかりますか?
内容が理解できないエラーコードなら、そのエラーコードを貼っていただけると原因がわかるかもしれません。
(もちろんユーザー名とかの個人情報は伏せて大丈夫ですから)

また。簡単な例で言えば、
ボタンを押したらfunc_stateの値を99にする。それまではひたすら何もしない
ってコードでも簡単な選択画面の第一歩ですよね?
それは可能でしょうか?
(この場合case 1~98のあいだに作るのがわかりやすいかな?)
ニャン!!\(゜ロ\)(/ロ゜)/

tutu
記事: 9
登録日時: 11年前

Re: 選択画面を作りたいです(急いでいます)

#5

投稿記事 by tutu » 11年前

このように追加

コード:

case 101:
					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 ;


        // メニュー項目要素を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 );
		}

	}
エラーメッセージ
1>c:\users\tsutsukawa\downloads\プログラム関係 サンプルなど\project\project\56章\mydat\source\main.cpp(36) : error C2601: 'gpUpdateKey' : ローカル関数の定義が正しくありません。
1> c:\users\tsutsukawa\downloads\プログラム関係 サンプルなど\project\project\56章\mydat\source\main.cpp(19): この行は '{' を含んでいますが、これに対応するものがありません。
1>c:\users\tsutsukawa\downloads\プログラム関係 サンプルなど\project\project\56章\mydat\source\main.cpp(115) : error C2361: 'SelectNum' の初期化が 'default' ラベルによって行われませんでした。
1> c:\users\tsutsukawa\downloads\プログラム関係 サンプルなど\project\project\56章\mydat\source\main.cpp(64) : 'SelectNum' の宣言を確認してください。
1>c:\users\tsutsukawa\downloads\プログラム関係 サンプルなど\project\project\56章\mydat\source\main.cpp(115) : error C2361: 'MenuElement' の初期化が 'default' ラベルによって行われませんでした。
1> c:\users\tsutsukawa\downloads\プログラム関係 サンプルなど\project\project\56章\mydat\source\main.cpp(57) : 'MenuElement' の宣言を確認してください。
1>c:\users\tsutsukawa\downloads\プログラム関係 サンプルなど\project\project\56章\mydat\source\main.cpp(41) : error C2065: 'Key' : 定義されていない識別子です。
1>c:\users\tsutsukawa\downloads\プログラム関係 サンプルなど\project\project\56章\mydat\source\main.cpp(43) : error C2065: 'Key' : 定義されていない識別子です。
1>ビルドログは "file://c:\Users\tsutsukawa\Downloads\プログラム関係 サンプルなど\project\project\56章\Debug\BuildLog.htm" に保存されました。
1>RyuJin - エラー 5、警告 0
========== ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ ==========

box
記事: 2002
登録日時: 13年前

Re: 選択画面を作りたいです(急いでいます)

#6

投稿記事 by box » 11年前

tutu さんが書きました:このように追加

コード:

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

// キーの入力状態を更新する
int gpUpdateKey(){
ぱっと見ですけど、switch文が正しく終わっていない(ように見える)のに
gpUpdateKey関数のコードを書いて本当に大丈夫なんでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
パコネコ
記事: 139
登録日時: 13年前
住所: 大阪

Re: 選択画面を作りたいです(急いでいます)

#7

投稿記事 by パコネコ » 11年前

ひさしくcaseの中には、関数以外のものを書いた覚えがないので、勘違いかもしれませんが、たしかswitchの中では宣言とかしては行けなかった気がします。

とにかく。
確認なのですが、これは
最初のものの32行目か31行目かぐらいにコピペしたような状態。
だと考えていいのでしょうか・・・

あと、tsutsukawaというのが本名なのかただのユーザー名なのかは、わかりませんが、そういう個人情報の可能性のあるものはできるだけ伏せたほうがいいかもしれませんね。

また

コード:

       int SelectNum = 0; // 現在の選択番号
 
        // while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 && gpUpdateKey()==0 ){
 
                // 計算フェーズ 
 
が私の考えてる通りならかなりまずいです。
もう少し簡単な事から順番にやったほうがいいかもしれません。

エラーについての返信はとりあえず、返信を待って今のソースの状態をハークしてからにします。
行数とかもちゃんと知りたいですしね。
ニャン!!\(゜ロ\)(/ロ゜)/

Loki
記事: 22
登録日時: 11年前

Re: 選択画面を作りたいです(急いでいます)

#8

投稿記事 by Loki » 11年前

case 節では、{} ブロックを使えば、宣言できますよ。

コード:

switch(value){
case 1:{
	int a,b,c;
	double d,e;
	break;
}
case 2:
	break;
default:
	break;
}

tutu
記事: 9
登録日時: 11年前

Re: 選択画面を作りたいです(急いでいます)

#9

投稿記事 by tutu » 11年前

皆様回答ありがとうございます。エラーが
error C2601: 'gpUpdateKey' : ローカル関数の定義が正しくありません。
この行は '{' を含んでいますが、これに対応するものがありません。
error C2361: 'SelectNum' の初期化が 'default' ラベルによって行われませんでした。
error C2361: 'MenuElement' の初期化が 'default' ラベルによって行われませんでした。
error C1075: 左側 中かっこ '{' に対応するものが project\project\56章\mydat\source\main.cpp(13)' で見つかる前に EOF が検出されました。
となりました。
回答お願いします。

box
記事: 2002
登録日時: 13年前

Re: 選択画面を作りたいです(急いでいます)

#10

投稿記事 by box » 11年前

case の中に「関数の実体」を書いて、本当に大丈夫なんでしょうか。
どこか別のところに実体を書いた関数を、case の中で呼び出すことはできそうですけれど。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 選択画面を作りたいです(急いでいます)

#11

投稿記事 by Dixq (管理人) » 11年前

「龍神録を完成させた」とありますが、ご自分で書かれたコードでしょうか?それとも、公開しているソースコードのままでしょうか?
また、既に書かれていますが、何故case文の中に関数の実体があるのでしょう。
コードが根本的におかしいので、見た感じ理解せずにそのまま特定のコードをコピペしてしまったように見えます。
特に、メインループの中にメインループを書いてはいけません。
http://dixq.net/g/h_11.html
そして、キーの入力状態の仕組みは他に既にあるので、改めて計算する必要はありません。
更に、メインループ内に処理の実体を書かないようにしましょう。

いきなり館の最終章に特定のコードを追加するのではなく、理解しながら章を進めた方が近道だと思います。
このままでは、追加したい要素があるたびに、人に書いてもらわないといけなくなってしまいそうです。
最終章までの章はお読みになりましたか?

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: 選択画面を作りたいです(急いでいます)

#12

投稿記事 by へにっくす » 11年前

tutu さんが書きました:皆様回答ありがとうございます。エラーが
error C2601: 'gpUpdateKey' : ローカル関数の定義が正しくありません。
この行は '{' を含んでいますが、これに対応するものがありません。
error C2361: 'SelectNum' の初期化が 'default' ラベルによって行われませんでした。
error C2361: 'MenuElement' の初期化が 'default' ラベルによって行われませんでした。
error C1075: 左側 中かっこ '{' に対応するものが project\project\56章\mydat\source\main.cpp(13)' で見つかる前に EOF が検出されました。
となりました。
回答お願いします。
コードを示さずにエラーだけ掲示されても。
言えるのは、boxさんの指摘を理解していないと言うことだけだな。
でもたぶん、それが直ったとしてもまた別のエラーが出そうだけどな。
written by へにっくす

アバター
パコネコ
記事: 139
登録日時: 13年前
住所: 大阪

Re: 選択画面を作りたいです(急いでいます)

#13

投稿記事 by パコネコ » 11年前

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"
 
//ループで必ず行う3大処理
int ProcessLoop(){
    if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
    if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
    GetHitKeyStateAll_2();//現在のキー入力処理を行う
    GetHitPadStateAll();  //現在のパッド入力処理を行う
    return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
 
    while(ProcessLoop()==0){//メインループ
        music_ini();
        switch(func_state){
            case 0://初回のみ入る処理
                load();     //データロード
                first_ini();//初回の初期化
                func_state=99;
                break;
            case 99://STGを始める前に行う初期化
                ini();
                load_story();
                func_state=100;
                break;
            case 100://通常処理
            //ここにcaseをひとつ増やして選択画面のプログラムを書くとかいてありました。
            case 101:
                    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 ;
 
 
        // メニュー項目要素を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 );
        }
 
    }
                                 enter_func_tm("最初");
                calc_ch();       enter_func_tm("キャラ計算");
                ch_move();       enter_func_tm("キャラ移動");
                cshot_main();    enter_func_tm("自機ショットメイン");
                enemy_main();    enter_func_tm("敵処理メイン");
                boss_shot_main();enter_func_tm("ボスショットメイン");
                shot_main();     enter_func_tm("ショットメイン");
                out_main();      enter_func_tm("当たり判定");
                effect_main();   enter_func_tm("エフェクトメイン");
                calc_main();     enter_func_tm("計算メイン");
                graph_main();    enter_func_tm("描画メイン");
                bgm_main();      enter_func_tm("BGMメイン");
                if(boss.flag==0)
                    stage_count++;
                break;
            default:
                printfDx("不明なfunc_state\n");
                break;
        }
        music_play();            enter_func_tm("音楽再生");
        fps_wait();              enter_func_tm("待機した時間",1);
        if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
        ScreenFlip();//裏画面反映
        count++;
 
    }
    DxLib_End();//DXライブラリ終了処理
    return 0;
}

現状はこうなっていると考えていいのでしょうか?
エラーコードの行数から考えるとこのようになっていると判断しましたが・・・

ご自身でなにか気づかれた点などはありますでしょうか?
現状で、何が悪かったのか?など。
もし気づいてる点、気づかせていただいた点が、おありでしたらご返答よろしくお願いします。

また、急いでいらっしゃるようなのですが、どのぐらい急いでいるのでしょうか?
(期限がせまっているなど)
ニャン!!\(゜ロ\)(/ロ゜)/

gya(tutuです)

Re: 選択画面を作りたいです(急いでいます)

#14

投稿記事 by gya(tutuです) » 11年前

tutuで送信しようとしたらできなかったので別の名前で投稿しました。

}をつけたしてみたところ、エラーが、つぎにようになりました。
error C2601: 'gpUpdateKey' : ローカル関数の定義が正しくありません。
この行は '{' を含んでいますが、これに対応するものがありません。
'Key' : 定義されていない識別子です。
'Key' : 定義されていない識別子です。


今週中に仕上げたいです。

コードは現状でこうなっています。

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();  //現在のパッド入力処理を行う
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	while(ProcessLoop()==0){//メインループ
		music_ini();
		switch(func_state){
			case 0://初回のみ入る処理
				load();		//データロード
				first_ini();//初回の初期化
				func_state=99;
				break;
			case 99://STGを始める前に行う初期化
				ini();
				load_story();
				func_state=100;
				break;
			case 100://通常処理
			//ここにcaseをひとつ増やして選択画面のプログラムを書くとかいてありました。
			case 101:{
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 ;


        // メニュー項目要素を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 );
		}

	}

					 }
		

								 enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main();	 enter_func_tm("計算メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
		}
		music_play();			 enter_func_tm("音楽再生");
		fps_wait();				 enter_func_tm("待機した時間",1);
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
		count++;

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

だんごさん
記事: 273
登録日時: 12年前

Re: 選択画面を作りたいです(急いでいます)

#15

投稿記事 by だんごさん » 11年前

まず問題を消して行きましょう。
皆さんが言っているとおり、case文に関数の中身が書かれた「関数の実体」が存在している。
管理人さんが言っているとおり、メインループに、選択画面としてのループが入っている。
それからcase文での変数宣言はややこしくてバグの元なのでなるべくswitchかwhile文の外へ出してやるべきです。

ここまで見てみると、「関数」というものを理解しているのか分からない点が出てきます。
もしコピペしてきてそこに関数の実態があったならメイン関数の外へ出すはずだからです。

またwhile文が2個あることが問題なのですから、選択画面のループを消してあげる必要があります。つまりそのwhile文の上部に書かれていた宣言などはメインループによって何回も宣言されるので、これも外へ出してあげる必要があります。

自分なりにメインループorメイン関数の外へ出すべきものを考え出してみましょう。エラーは段々減っていくはずです。
 Dango San

アバター
パコネコ
記事: 139
登録日時: 13年前
住所: 大阪

Re: 選択画面を作りたいです(急いでいます)

#16

投稿記事 by パコネコ » 11年前

返信ありがとうございます。
(ほかの方への返信も全部してくださいね。)

まず考えなければいけないのが、
できたとしてもできなくても、switchの中で宣言などは書くべきではありません。
(さらにゆうなら処理もですね。)
それと、今までのプログラムはある程度理解できていますでしょうか?
もし、できているなら真似してみるといいでしょう。
例えば、構造体や変数の宣言等です。

グローバル変数として宣言していたと記憶しておりますが、どうしてますか?
(弾やキャラクターなど)
もし、ほかで宣言していたモノがあるのでしたら、そこで同じように宣言してください。
また、Keyに関しては、既に宣言されてませんか?
名前が違うかもしれませんが同じ役割のものが既にあると思います。
その場合は使いまわしましょう。

また

コード:

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

コード:

        while(ProcessLoop()==0){//メインループ
と同じ意味ですよね?

そして、これは既にswitch文の手前で呼んでいると思います。

まずは、綺麗にしたいですね・・・
ヒントを書くと

コード:

        switch(func_state){
            case 0://初回のみ入る処理
                load();     //データロード
                first_ini();//初回の初期化
                func_state=50;
                break;
            case 50:
                // なんか関数
                // その関数内でfunc_stateを99にしてあげれれば、簡単なセレクト画面になると思います。
                break;
            case 99://STGを始める前に行う初期化
                ini();
                load_story();
                func_state=100;
                break;
            case 100://通常処理
                                 enter_func_tm("最初");
                calc_ch();       enter_func_tm("キャラ計算");
                ch_move();       enter_func_tm("キャラ移動");
                cshot_main();    enter_func_tm("自機ショットメイン");
                enemy_main();    enter_func_tm("敵処理メイン");
                boss_shot_main();enter_func_tm("ボスショットメイン");
                shot_main();     enter_func_tm("ショットメイン");
                out_main();      enter_func_tm("当たり判定");
                effect_main();   enter_func_tm("エフェクトメイン");
                calc_main();     enter_func_tm("計算メイン");
                graph_main();    enter_func_tm("描画メイン");
                bgm_main();      enter_func_tm("BGMメイン");
                if(boss.flag==0)
                    stage_count++;
                break;
            default:
                printfDx("不明なfunc_state\n");
                break;
        }
かなって思います。
もちろんこの通りにつくる必要はないですが・・・
ひとつの例だとお考え下さい。
ニャン!!\(゜ロ\)(/ロ゜)/

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 選択画面を作りたいです(急いでいます)

#17

投稿記事 by Dixq (管理人) » 11年前

今週中に仕上げたいとのことですが、何かの課題ですか?
もし課題として提出される際は規約にそってご報告願います。
http://dixq.net/rp/kiyaku.html
また、龍神録の館のコードに、ゲームプログラミングの館の選択画面のコードを張り付けたら完成になるんでしょうか?
そして、お聞きしたことへの回答をお願いします。

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

Re: 選択画面を作りたいです(急いでいます)

#18

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

念の為に書いておきますが学校などの夏休みの宿題や課題や提出物としては基本的にこのまま出すことは出来ません。
※ 相当のアレンジが加われば別ですがタイトル程度ではアレンジとはいえません。。
なので、利用規約をお読みください。
「龍神録プログラミングの館 利用規約」
http://dixq.net/rp/kiyaku.html

それ以外で焦る理由は思いつかなかったのですが、ちゃんとC言語と龍神録のコードの一行一行を理解する事が一番大事かと思います。
自己スケジュールであれば、もっと余裕を見ていただきたいです。
と書いている間にDixq (管理人)さんの書き込みがされましたね。Dixq (管理人)さんへの回答をよろしくお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Loki
記事: 22
登録日時: 11年前

Re: 選択画面を作りたいです(急いでいます)

#19

投稿記事 by Loki » 11年前

たとえコピー&ペーストでも、インデントだけはきちんと揃えておいた方が良いです。
{}の対応や、breakが足りなかった、なんてことが見つかります。
コメントもそろえると見やすいですね。
参考:

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;	//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;	//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();				//現在のキー入力処理を行う
	GetHitPadStateAll();				//現在のパッド入力処理を行う
	return 0;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0){//初期化と裏画面化
		return -1;
	}
	while(ProcessLoop()==0){//メインループ
		music_ini();
		switch(func_state){
		case 0:				//初回のみ入る処理
			load();			//データロード
			first_ini();	//初回の初期化
			func_state=99;
			break;
		case 99:			//STGを始める前に行う初期化
			ini();
			load_story();
			func_state=100;
			break;
		case 100:			//通常処理

			//ここにcaseをひとつ増やして選択画面のプログラムを書くとかいてありました。
								enter_func_tm("最初");
			calc_ch();			enter_func_tm("キャラ計算");
			ch_move();			enter_func_tm("キャラ移動");
			cshot_main();		enter_func_tm("自機ショットメイン");
			enemy_main();		enter_func_tm("敵処理メイン");
			boss_shot_main();	enter_func_tm("ボスショットメイン");
			shot_main();		enter_func_tm("ショットメイン");
			out_main();			enter_func_tm("当たり判定");
			effect_main();		enter_func_tm("エフェクトメイン");
			calc_main();		enter_func_tm("計算メイン");
			graph_main();		enter_func_tm("描画メイン");
			bgm_main();			enter_func_tm("BGMメイン");
			if(boss.flag==0){
				stage_count++;
			}
			break;
		case 101:{
			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 ;

			// メニュー項目要素を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 );
				}
			}
			break;
		}
		default:
			printfDx("不明なfunc_state\n");
			break;
		}
		music_play();		enter_func_tm("音楽再生");
		fps_wait();			enter_func_tm("待機した時間",1);
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1){//エスケープが入力されたらブレイク
			break;
		}
		ScreenFlip();//裏画面反映
		count++;
	}
	DxLib_End();//DXライブラリ終了処理
	return 0;
}

tutu
記事: 9
登録日時: 11年前

Re: 選択画面を作りたいです(急いでいます)

#20

投稿記事 by tutu » 11年前

パコネコさんの方法でiniを使いましたが、できません。
別の関数でなければいけないのですか

box
記事: 2002
登録日時: 13年前

Re: 選択画面を作りたいです(急いでいます)

#21

投稿記事 by box » 11年前

tutu さんが書きました:パコネコさんの方法でiniを使いましたが、できません。
それだけを書かれましても、現在お手元にあるソースコードや、
「できません」の具体的な内容(コンパイルエラー?実行時のエラー?エラーメッセージの内容は?)が
何もわからないため、いかんともしがたいのであります。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

tutu
記事: 9
登録日時: 11年前

Re: 選択画面を作りたいです(急いでいます)

#22

投稿記事 by tutu » 11年前

エラーはありません。
でも、実行すると、選択画面が表示されません。
コード

コード:

#define GLOBAL_INSTANCE 
#include "../include/GV.h"

//ループで必ず行う3大処理
int ProcessLoop(){
	if(ProcessMessage()!=0)return -1;//プロセス処理がエラーなら-1を返す
	if(ClearDrawScreen()!=0)return -1;//画面クリア処理がエラーなら-1を返す
	GetHitKeyStateAll_2();//現在のキー入力処理を行う
	GetHitPadStateAll();  //現在のパッド入力処理を行う
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
	ChangeWindowMode(TRUE);//ウィンドウモード
	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	while(ProcessLoop()==0){//メインループ
		music_ini();
		switch(func_state){
			case 0://初回のみ入る処理
				load();		//データロード
				first_ini();//初回の初期化
				func_state=50;
				break;
			case 50:
				ini();
				func_state=99;
				break;
			case 99://STGを始める前に行う初期化
				ini();
				load_story();
				func_state=100;
				break;
			case 100://通常処理
								 enter_func_tm("最初");
				calc_ch();       enter_func_tm("キャラ計算");
				ch_move();       enter_func_tm("キャラ移動");
				cshot_main();    enter_func_tm("自機ショットメイン");
				enemy_main();	 enter_func_tm("敵処理メイン");
				boss_shot_main();enter_func_tm("ボスショットメイン");
				shot_main();	 enter_func_tm("ショットメイン");
				out_main();  	 enter_func_tm("当たり判定");
				effect_main();   enter_func_tm("エフェクトメイン");
				calc_main();	 enter_func_tm("計算メイン");
				graph_main();    enter_func_tm("描画メイン");
				bgm_main();		 enter_func_tm("BGMメイン");
				if(boss.flag==0)
					stage_count++;
				break;
			default:
				printfDx("不明なfunc_state\n");
				break;
		}
		music_play();			 enter_func_tm("音楽再生");
		fps_wait();				 enter_func_tm("待機した時間",1);
		if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
		ScreenFlip();//裏画面反映
		count++;

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

box
記事: 2002
登録日時: 13年前

Re: 選択画面を作りたいです(急いでいます)

#23

投稿記事 by box » 11年前

あれ?
今までさんざん話題になっていた
case 101
の部分はどこへ行ったのでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: 選択画面を作りたいです(急いでいます)

#24

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

Dixq (管理人)さん他の方々への回答を放置して質問を続けないでいただけますでしょうか。
boxさんもこういう状況ですので、よろしくお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

tutu
記事: 9
登録日時: 11年前

Re: 選択画面を作りたいです(急いでいます)

#25

投稿記事 by tutu » 11年前

Dixqさんへ
龍神録は最終章まですべて読みました。
boxさんへ
case101の話は、パコネコさんの提案によりcase50で書くことになりました。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: 選択画面を作りたいです(急いでいます)

#26

投稿記事 by Dixq (管理人) » 11年前

メッセージにて提出先の情報はご連絡頂きました。
しかしメッセージでもなかなかスムーズに意思疎通ができていないようです。
コメントを投稿する前に、自分の書いたコメントで人が理解できるかよく考え、回答者が質問したことにすべて答えているか確認するようにして下さい。

ところで、case 50で呼んでいる処理はどのようになっているのでしょうか?
追記:case 99で呼んでいるiniと同じものを50で呼んでメニュー画面が動作するとは思えないのですが・・・。

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

Re: 選択画面を作りたいです(急いでいます)

#27

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

なるほど解決したということでよいでしょうか。
case 50
case 99
で同じini();を呼んでいるのが気になりますね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
パコネコ
記事: 139
登録日時: 13年前
住所: 大阪

Re: 選択画面を作りたいです(急いでいます)

#28

投稿記事 by パコネコ » 11年前

解決ならいいのかな?
書いても?

>>パコネコさんの方法でiniを使いましたが、できません。
>>別の関数でなければいけないのですか
おっと、これは私の書き方が悪かったかもですね。
なんかの関数とは、中身はなんでもいいから適当に空の関数でも作ってそこに処理を書いてくださいと、いう意味のつもりでしたので、
MenuMain(仮名)とでも名づけた空の関数をおつくりください。
また、それはメイン関数の中に実態を書くのではないのでご注意ください。
ほかの関数を、観察していると書き方はわかると思います。

それができたら、「なにも行われないと思います。」
それで正解ですので大丈夫です。
なんたって関数はカラですからねw

ちなみに↑に書いてるのは、正直既にご指摘していただいているところですけどね^^。
それができましたら次のステップに行く準備が出来たということです。

Tutuさんの理解度がどの程度か測りかねますが、その関数の中であなたの今できる形で選択画面を作ってみてください。
(もちろんほかの方法を試しても大丈夫ですよ。)
ニャン!!\(゜ロ\)(/ロ゜)/

tutu
記事: 9
登録日時: 11年前

Re: 選択画面を作りたいです(急いでいます)

#29

投稿記事 by tutu » 11年前

皆さん、ありがとうございます。
期限が来てしまったので、選択画面のかわりに、最初の敵の待機時間をながくすることにしました。
本当にありがとうございました。

閉鎖

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