タイトル画面について

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

タイトル画面について

#1

投稿記事 by ZEROXE » 12年前

1.自己紹介文とこの掲示板に至るまでの過程
どうもこんにちはZEROXEと申します。
今回始めて投稿させていただきます。
ここ最近ゲームプログラミングの館を見つけてDxLibを使ってのプログラミングを始めたものです。
昔からゲームが作りたくてC言語とかも少しかじったんですが挫折していまいして、
DxLibを使えばなんとか作れるかもしれないと思ってサイトに1度目を通しました。
タイトル画面でつまずいてインターネットを検索するもいい方法が見つかりませんでした。
Yahoo!の掲示板にも書き込んだんですがどうしても上手くいかなかったので、
この掲示板に書き込みました。※

2.質問文
では本題に移りますが、今回はノベルゲームを作ろうと思いまして下のコードを分からないところは
インターネットで調べて作っていたのですが、タイトル画面のところでつまずいてしまいました。
このプログラムは、先ずPlease Start Enterkeyという文字を起動直後の画面で点滅表示してから
エンターキーが入力されたら選択画面を表示するプログラムです。
一応画像は自分で作ったものを使っていますので自作の画象の部分は画象と書き直してあります。
分からないところはここからなんですが、選択画面のところで文字を上下キーで選択した後に、
エンターキーを押したときに、New GameやLOADなどのイベントを発生させるにはどうしたら良いのでしょうか?
もう一つ質問なのですが、ゲームなどの音量設定や画面をフルスクリーンやウィンドウモードなどを、
ゲームの設定画面のようにプレイヤーが変更するにはどうしたらよいのでしょうか?

3.C言語についての知識
C言語の知識は、新ゲームプログラミングの館を1度見まして、昔C言語の本を1冊読んだ程度です。
他 VBA HSPもやってみましたが、挫折しました。
C言語は、コンソールアプリケーションでは少しかけるのですがWindows API が難しく諦めていたところ
新ゲームプログラミングの館を見つけたというわけです。
※コンソールアプリケーションでは簡単な計算機を作ることは出来ますが複雑な処理などはできません。
自分でインターネットで探して作ったプログラムです。

4.環境
一応環境も書いておきます。
OSはWindows 7 64bit・ソフトはMicrosoft visual C++ Express edition・ライブラリはDxLibです。

5.自分で作ったプログラム

コード:

#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); //ウィンドウモード!! TRUEでウィンドウ FALSEでフルスクリーン	
	SetMainWindowText("タイトル");//ウィンドウタイトルの設定
	DxLib_Init();   // DXライブラリ初期化処理

	int White,Black,Pink,Count=0,Font00,Handle000,Handle003;//変数群
	White = GetColor( 255, 255, 255);//白色
	Black = GetColor(   0,   0,   0);//黒色
	Pink  = GetColor( 255,   0,  93);//ピンク?
	SetFontSize(21);//文字の大きさ
	SetDrawMode( DX_DRAWMODE_NEAREST  ) ;//ネアレストネイバー法とバイリニア法との変更
	Font00= CreateFontToHandle( NULL,  40,   0, -1); //フォント変更
	Handle000= LoadGraph("画象"); //画像をロード
	Handle003= LoadGraph("画象"); //画像をロード

//初期画面①の文字点滅処理プログラム
	while(1){
		if( ProcessMessage() == -1)break ;//エラーが起きたらループを抜ける
		ClearDrawScreen();//描いてあるものを消す
		DrawRotaGraph( 325, 300, 1.0,  0.0, Handle000, TRUE );//データハンドルを使っての画像描画
		if( Count%120 < 60 )//2秒のうち最初の1秒なら
		DrawFormatString( 190,360,White,"Please Start Enterkey");//文字表示		
		if( CheckHitKey( KEY_INPUT_RETURN ) == 1 ){//EnterKeyが押されていれば
			break;//無限ループ通過
		}
		Count++;		
		ScreenFlip();
	}

//メニュー項目要素を作る

	 MenuElement_t MenuElement[5]={
			{ 460, 100, "New Game"},//タグの中身の順番で格納される。
			{ 480, 150, "LOAD"},
			{ 480, 200, "EXTRA"},
			{ 480, 250, "System"},
			{ 480, 300, "END"},
		};
	 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 = 460; // 座標を460にする
				} else {                       // 今処理しているのが、選択番号以外なら
					MenuElement[i].x = 480;// 座標を480にする
				}
			}
		}

		// 描画フェーズ

		for( int i=0; i<5; i++ ){ // メニュー項目を描画
			DrawFormatString( MenuElement[i].x, MenuElement[i].y, GetColor(255,255,255), MenuElement[i].name );
			SetDrawMode( DX_DRAWMODE_BILINEAR  ) ;//ネアレストネイバー法とバイリニア法との変更
			DrawRotaGraph( 280, 150, 0.5, 0.0, Handle003, TRUE );//データハンドルを使っての描画

		}

	}

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

nil
記事: 428
登録日時: 12年前

Re: タイトル画面について

#2

投稿記事 by nil » 12年前

まずは関数について学びましょう。
C言語の基礎知識をある程度学んだほうがいいです。
関数について学んだら次は

今のコードを部分部分に分けていきます。

あと気になった点はインデントとメインループが複数あるところです。

プログラミングを始めたばかりというのであれば自分の頭の中にあるものを再現しようとゴリゴリ作っていくのではなく
初歩的(たいてい皆さんがおっしゃるのはじゃんけんゲームですかね)なものから作ることをお勧めします。

ノベルゲームを作るのであればこのサイトが大変参考になります。

ZEROXE

タイトル画面について

#3

投稿記事 by ZEROXE » 12年前


涼雅さん回答ありがとうございます。
1.関数に学べばいいのですね
 ですがどういうふうに学んだらよいでしょうか? 出来れば挫折は避けたいのでよろしくお願いします。
2.ある程度とはどれくらいの知識があればノベルゲームなどのゲームを作ることができますか?
3.一応C言語のコンソールの方では、色々作れるんですが
 DxLibは、似たような感じで書けばいいのでしょうか?
4.じゃんけんゲームの方は、DxLibの方で作ればよいのでしょうか?
5.タイトル画面の文字選択は、関数を学んだら出来るんでしょうか?
一応ノベルのサイトの方は、自分で探してる時に見つけたので読んでみたんですが、
途中でわからないところが出てきたので正直理解できませんでした。 紹介してくださったのに申し訳ないです。
色々と分からないものですから疑問文が多くなってしまいましたが、詳しく教えていただければ幸いです。

nil
記事: 428
登録日時: 12年前

Re: タイトル画面について

#4

投稿記事 by nil » 12年前

1.関数の使い方、作り方と戻り値について学べれば今はいいでしょう余裕があれば引数などについても理解できたほうがいいですが今はまだいいでしょう

2.ピンキリです。文字を表示するだけのものなら今すぐにでも作れるかもしれませんが
 スクリプト形式で管理、画像の呼び出しなどをしようと思えば難易度はぐんと跳ね上がります。

3.DxLibならば画像処理などについても簡単に扱えるため基本的なところ(入力,描画)という部分はあまり変わりませんが、
 コンソールでは入力があるまで待機し続けるが、ウィンドウアプリはループを続ける、という違いがあります

4.DxLibでゲームを作る練習をするならそのほうがいいでしょう

5.できるかと聞かれればできないと答えます。
 関数は手段であって結果では無いので、ご自身での創意工夫が重要です
ここをみてたいただければわかりやすいかと思いますがメイン関数内にコードを直で打ち込むのと比べて煩雑さが少ない、管理しやすいように感じませんか?

ですが内部に書いてある処理は同じなので、ただ関数化という手段は効率よくプログラミングするためのものだとお考えください。

ZEROXE

タイトル画面について

#5

投稿記事 by ZEROXE » 12年前

涼雅さん回答ありがとうございます。
最後にお聞きしたいのですが、文字選択をした時に次の処理を行うやり方のプログラムについて
助言をいただけませんか?
2日前からネットを回って探していても見つからなかったので出来たら回答お願い致します。

nil
記事: 428
登録日時: 12年前

Re: タイトル画面について

#6

投稿記事 by nil » 12年前

まず全体を管理する変数Stateを用意し、
Stateの値で処理を分岐させます
Stateは列挙体などを使用するといいでしょう

コード:


switch( State ){
case タイトル:
	if( エンターキーが押された ){
		State = メニュー;
	}
	
	break;

case メニュー:
	if( エンターキーが押された ){
		if( メニュー番号が0 )
			State = ゲーム;
	    else if(....){
			.............
                }
	}
	
	break;

case ゲーム:
	............
	break;
	
case ....:
	.................
	break;
}

のような流れでしょう。
こうすることでタイトルとメニューでwhileループを分ける必要がなくなります。
状態と状態の遷移はStateの値を書き換えるだけで済みます。
列挙体,switch文などに不安があるようでしたら適宜調べることをお勧めします

これよりももっといい実装方法も他に幾つもあるのでしょうが、
わかり易い例としてあげるにはこの方法ですかね……。

ZEROXE

タイトル画面について

#7

投稿記事 by ZEROXE » 12年前


涼雅さん分かりやすい回答ありがとうございました。
その他色々簡単なものも作っていきたいと思います。
困ったときはまたこのサイトを利用してみようと思います。
それではそろそろ時間なので終了させていただきます。
どうも有難うございました。

閉鎖

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