タイトル画面

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

タイトル画面

#1

投稿記事 by hibi » 11年前

初めての投稿です。

ある程度C言語の勉強を終え、ゲームを作りたいと思いました。
(ある程度というのは、ポインタ等が終わっていないということです。ゲームを作りつつ、勉強したいと考えています。)
そこで、いきなりアクションやシューティングはきついので、
画像あり、思考ありのジャンケンゲームをつくろうと思いました。

そこで早速、タイトル画面を作ろうと思ったのですが、画像処理がうまくいきません。
自作の関数にしたとたん、うまくいかなくなりました。
どうすればよいのでしょうか。助言、お願いします。

コード:

#include "DxLib.h"

int Title(void);
int Game(void);
int End(void);


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
        ChangeWindowMode( TRUE ); // ウィンドウモードに設定
        DxLib_Init();   // DXライブラリ初期化処理

		int phase = 0;
 
		while(1){
			switch(phase)
			{
				case 0  : Title(); break;  // タイトル画面処理
				case 1  : Game(); break; // ゲーム画面処理
				default : End(); // 終了処理
			}
		}

		WaitKey();     // キー入力があるまで待機
        DxLib_End();   // DXライブラリ終了処理
        return 0;
} 

int Title(void)
{
	int Handle;     // データハンドル格納用変数
        Handle = LoadGraph( "画像\\Title.png" ); // 画像をロード
        DrawGraph( 20, 50, Handle, TRUE ); // データハンドルを使って画像を描画
		return 0;
}

int Game()
{
	return 0;
}

int End()

{
	return 0;
}

読みにくかったらすみません。

non
記事: 1097
登録日時: 13年前

Re: タイトル画面

#2

投稿記事 by non » 11年前

hibi さんが書きました: そこで早速、タイトル画面を作ろうと思ったのですが、画像処理がうまくいきません。
自分の考えを整理するためにも、他人に説明することは大事なことです。
何が、どううまくいかないのか説明してください。
自分はこうしたい。(このような結果を得たい)でも、こうなってしまう。みたいに。
non

hibi

Re: タイトル画面

#3

投稿記事 by hibi » 11年前

大変失礼しました。

自分がしたかったのは「画像の表示」です。
mainのなかで直接、DrawGraph関数を使えば画像が表示されたのですが、
関数のなかでやると表示されませんでした。

これまた、失礼なんですが、先ほど
WaitKey(); // キー入力があるまで待機
を関数内に加えたところ、無事、表示されました。

表示されたの嬉しいのですが、
なぜ加えただけで表示されたのか、もしくはなぜ加えなかったのが原因なのか教えてください。

わかりづらくてすみません。

アバター
Nao
記事: 24
登録日時: 11年前

Re: タイトル画面

#4

投稿記事 by Nao » 11年前

http://dixq.net/g/01_09.html
まず、ゲームプログラムの骨格について理解できてますか?ここができてないとゲームすら作れないので、今一度確認を。他に気になるのは、
自作関数がint型  コードを見る限り、戻り値の意味がないのでvoid型でいいと思うのですが...
まあ、何事も平穏に。

non
記事: 1097
登録日時: 13年前

Re: タイトル画面

#5

投稿記事 by non » 11年前

画面のロードをwhileの中で何度もやってはいけません。
non

アバター
spaaaark・∀・
記事: 66
登録日時: 11年前
住所: 埼玉
連絡を取る:

Re: タイトル画面

#6

投稿記事 by spaaaark・∀・ » 11年前

ソースを実行してみましたが、ループで画面が固まってしまい出力されませんでした。
と同時に、画面右上の×ボタンを押しても終了出来なくなってしまっていたかと思われます。
それではなぜ関数化する前がちゃんと動いていたのか、少し不思議ですが、そこはおいておくことにします。
恐らく、関数化すると同時にゲームループも作ったのだと思うのですが…。

さて、DxLibではゲームループを作る際に、ProcessMessage関数を1ループごとに呼び出してあげる必要があります。
その関数については、DxLib様のホームページにある関数リファレンスのトップページの下側に記述されています。
その関数は、ソフトの状態をチェックするもので、これがエラーを返したときには即時にソフトを終了させないといけません。

この関数を、このように呼び出してあげてください。

コード:

while(ProcessMessage()==0){
    /* 処理 */
}
この関数が0以外を返すと、ループが終了します。画面右上の×ボタンを押した際も、この関数で処理をすることができます。
同時に、画像も表示されるはずです。

また、ループではこのほかにも画面の初期化や裏画面描画といった処理が必要になりますが、
このトピックでの説明は場違いであるため、割愛させていただきます。
この辺りはDxLib本家サイトの「プログラム開発講座」にも載っているので、こちらもチェックしてみてください。

ただ、一つだけ大きな問題点がこのプログラムにはあるので、そこだけ指摘しておきます。
自作関数を作って呼び出したとき、その処理が終了し関数を抜けると、その中の変数が消えてしまうことはご存知かと思います。
しかし、LoadGraph関数で呼び出した画像は消えず、メモリの中に残ってしまいます。
これがたまっていくと、パソコンが大変危険な状態に陥ってしまいます。
なので、

コード:

static int handle = LoadGraph("ファイル名");
にすることを推奨します。
この際ですので、staticについては自分で調べてみるのもありだと思います。
クリエイティブな生活で刺激的な毎日を!

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

Re: タイトル画面

#7

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

ゲームプログラミングの館のC言語部分の内容はひと通り理解されましたか?
http://dixq.net/g/
結構重要な要素が詰まっているので、まず理解することをおすすめします。

> WaitKey(); // キー入力があるまで待機

画像を表示するためには、これから画像を表示するよと言う合図がDXライブラリに対して必要です。
そのうちの一つが WaitKey();なのですが、WaitKey()は「h.11 書いてはいけない4つの処理 」に該当します。
一般的なゲーム中においては、 ScreenFlip()を使うようにして下さい。
WaitKey();は、短い実験用のコードを書くときに使うものです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: タイトル画面

#8

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

あっとDXライブラリを利用した場合、
static int handle = LoadGraph("ファイル名");
はDxlib_Initに対しての順番が制御出来ないのでマズイことになると思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
spaaaark・∀・
記事: 66
登録日時: 11年前
住所: 埼玉
連絡を取る:

Re: タイトル画面

#9

投稿記事 by spaaaark・∀・ » 11年前

softya(ソフト屋) さんが書きました:あっとDXライブラリを利用した場合、
static int handle = LoadGraph("ファイル名");
はDxlib_Initに対しての順番が制御出来ないのでマズイことになると思います。
そうだったのですか。その点は配慮していませんでした。申し訳ないです。
クリエイティブな生活で刺激的な毎日を!

hibi

Re: タイトル画面

#10

投稿記事 by hibi » 11年前

Naoさん、nonさん、spaaaark・∀・さん、副管理人さん
たくさんの回答ありがとうございます。

こんな初心者の出てくる場ではないとも思っていたのですが、本当に親切に教えていただくことができ、感謝しております。

みなさんの回答をもとに、プログラムを一部書き換えました。
こんなかんじでよろしいのでしょうか。(static int handle = LoadGraph("ファイル名"); ←これはどうしたらいいんですか。)

また、このあと「はじめる」と「おわる」と「設定」の3つの項目をつくり、上下キーで選べるようにしたいと思っています。
こんなかんじでやったらいい、みたいのがありましたら教えてください。



コード:

#include "DxLib.h"

void Title();
void Game();
void End();


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
        ChangeWindowMode( TRUE ); // ウィンドウモードに設定
        DxLib_Init();   // DXライブラリ初期化処理

		int phase = 0;
 
		while(ProcessMessage()==0){
			switch(phase)
			{
				case 0  : Title(); break;  // タイトル画面処理
				case 1  : Game(); break; // ゲーム画面処理
				default : End(); // 終了処理
			}
		}

		ScreenFlip();   // キー入力があるまで待機
        DxLib_End();   // DXライブラリ終了処理
        return 0;
} 

void Title()
{
	int Handle;     // データハンドル格納用変数
        Handle = LoadGraph( "画像\\Title.png" ); // 画像をロード
        DrawGraph( 20, 50, Handle, TRUE ); // データハンドルを使って画像を描画
	    ScreenFlip();// キー入力があるまで待機
}

void Game()
{
	
}

void End()

{
	
}


アバター
Nao
記事: 24
登録日時: 11年前

Re: タイトル画面

#11

投稿記事 by Nao » 11年前

hibi さんが書きました: (static int handle = LoadGraph("ファイル名"); ←これはどうしたらいいんですか。)

コード:

void Title(int Handle)
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
    int handle = LoadGraph("ファイル名");
      while(ProcessMessage()==0)
{
              Title(handle);  // タイトル画面処理
}
        DxLib_End();   // DXライブラリ終了処理
        return 0;
} 
 
void Title(int Handle)
{
        DrawGraph( 20, 50, Handle, TRUE ); // データハンドルを使って画像を描画
        WaitKey();// キー入力があるまで待機
}
このようにすれば一応問題なくすることができます。
(主要なところしか書いてないので、自分で追加してくださいね。)
hibi さんが書きました: また、このあと「はじめる」と「おわる」と「設定」の3つの項目をつくり、上下キーで選べるようにしたいと思っています。
こんなかんじでやったらいい、みたいのがありましたら教えてください。
http://dixq.net/g/sp_03.html
やはり、まずは目を通すだけでもいいのでこのサイトを一通り見ておきましょう。
この内容が理解できれば、質問せずともやりたいことができるはずです。
そのうえでわからないところがあれば、そのことについて質問しましょう。

これについては、ファイル分割ができないと少々厳しいところがあります。
(もちろん不可能ではありませんが、コードの量が増えると処理の流れが分かりにくくなります。)
それ以前にみなさんの言うようにDxLibの知識もまだまだ少ないと思われますので、今一度リファレンスなどを確認しましょう。

コード:

		ScreenFlip();   // キー入力があるまで待機
WaitKey()では?
[/quote]
まあ、何事も平穏に。

ソフト屋 外出中

Re: タイトル画面

#12

投稿記事 by ソフト屋 外出中 » 11年前

screenflipなのは私がWaitkeyを使ってはいけないと書いたからですね。
ただ、screenflipの使い方がまちがっています。
そこら辺に関してもゲームプログラミングの館にかかれていますのでよく理解していただけると良いと思います。
なによりゲームプログラミングの館の勉強をしていたら色々と疑問が出てくるはずですので、そこで悩まないのなら理解できていないと思った方がよいです。
なのでまず館を理解するようにして疑問点を聞いてください。

閉鎖

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