ページ 1 / 1
タイトル画面
Posted: 2013年7月26日(金) 18:09
by hibi
初めての投稿です。
ある程度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;
}
読みにくかったらすみません。
Re: タイトル画面
Posted: 2013年7月26日(金) 18:21
by non
hibi さんが書きました:
そこで早速、タイトル画面を作ろうと思ったのですが、画像処理がうまくいきません。
自分の考えを整理するためにも、他人に説明することは大事なことです。
何が、どううまくいかないのか説明してください。
自分はこうしたい。(このような結果を得たい)でも、こうなってしまう。みたいに。
Re: タイトル画面
Posted: 2013年7月26日(金) 18:29
by hibi
大変失礼しました。
自分がしたかったのは「画像の表示」です。
mainのなかで直接、DrawGraph関数を使えば画像が表示されたのですが、
関数のなかでやると表示されませんでした。
これまた、失礼なんですが、先ほど
WaitKey(); // キー入力があるまで待機
を関数内に加えたところ、無事、表示されました。
表示されたの嬉しいのですが、
なぜ加えただけで表示されたのか、もしくはなぜ加えなかったのが原因なのか教えてください。
わかりづらくてすみません。
Re: タイトル画面
Posted: 2013年7月26日(金) 18:31
by Nao
http://dixq.net/g/01_09.html
まず、ゲームプログラムの骨格について理解できてますか?ここができてないとゲームすら作れないので、今一度確認を。他に気になるのは、
自作関数がint型 コードを見る限り、戻り値の意味がないのでvoid型でいいと思うのですが...
Re: タイトル画面
Posted: 2013年7月26日(金) 18:52
by non
画面のロードをwhileの中で何度もやってはいけません。
Re: タイトル画面
Posted: 2013年7月26日(金) 18:53
by spaaaark・∀・
ソースを実行してみましたが、ループで画面が固まってしまい出力されませんでした。
と同時に、画面右上の×ボタンを押しても終了出来なくなってしまっていたかと思われます。
それではなぜ関数化する前がちゃんと動いていたのか、少し不思議ですが、そこはおいておくことにします。
恐らく、関数化すると同時にゲームループも作ったのだと思うのですが…。
さて、DxLibではゲームループを作る際に、ProcessMessage関数を1ループごとに呼び出してあげる必要があります。
その関数については、DxLib様のホームページにある関数リファレンスのトップページの下側に記述されています。
その関数は、ソフトの状態をチェックするもので、これがエラーを返したときには即時にソフトを終了させないといけません。
この関数を、このように呼び出してあげてください。
コード:
while(ProcessMessage()==0){
/* 処理 */
}
この関数が0以外を返すと、ループが終了します。画面右上の×ボタンを押した際も、この関数で処理をすることができます。
同時に、画像も表示されるはずです。
また、ループではこのほかにも画面の初期化や裏画面描画といった処理が必要になりますが、
このトピックでの説明は場違いであるため、割愛させていただきます。
この辺りはDxLib本家サイトの「プログラム開発講座」にも載っているので、こちらもチェックしてみてください。
ただ、一つだけ大きな問題点がこのプログラムにはあるので、そこだけ指摘しておきます。
自作関数を作って呼び出したとき、その処理が終了し関数を抜けると、その中の変数が消えてしまうことはご存知かと思います。
しかし、LoadGraph関数で呼び出した画像は消えず、メモリの中に残ってしまいます。
これがたまっていくと、パソコンが大変危険な状態に陥ってしまいます。
なので、
コード:
static int handle = LoadGraph("ファイル名");
にすることを推奨します。
この際ですので、staticについては自分で調べてみるのもありだと思います。
Re: タイトル画面
Posted: 2013年7月26日(金) 18:55
by softya(ソフト屋)
ゲームプログラミングの館のC言語部分の内容はひと通り理解されましたか?
http://dixq.net/g/
結構重要な要素が詰まっているので、まず理解することをおすすめします。
> WaitKey(); // キー入力があるまで待機
画像を表示するためには、これから画像を表示するよと言う合図がDXライブラリに対して必要です。
そのうちの一つが WaitKey();なのですが、WaitKey()は「h.11 書いてはいけない4つの処理 」に該当します。
一般的なゲーム中においては、 ScreenFlip()を使うようにして下さい。
WaitKey();は、短い実験用のコードを書くときに使うものです。
Re: タイトル画面
Posted: 2013年7月26日(金) 18:56
by softya(ソフト屋)
あっとDXライブラリを利用した場合、
static int handle = LoadGraph("ファイル名");
はDxlib_Initに対しての順番が制御出来ないのでマズイことになると思います。
Re: タイトル画面
Posted: 2013年7月26日(金) 19:02
by spaaaark・∀・
softya(ソフト屋) さんが書きました:あっとDXライブラリを利用した場合、
static int handle = LoadGraph("ファイル名");
はDxlib_Initに対しての順番が制御出来ないのでマズイことになると思います。
そうだったのですか。その点は配慮していませんでした。申し訳ないです。
Re: タイトル画面
Posted: 2013年7月27日(土) 13:49
by hibi
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()
{
}
Re: タイトル画面
Posted: 2013年7月27日(土) 14:41
by Nao
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: タイトル画面
Posted: 2013年7月28日(日) 00:27
by ソフト屋 外出中
screenflipなのは私がWaitkeyを使ってはいけないと書いたからですね。
ただ、screenflipの使い方がまちがっています。
そこら辺に関してもゲームプログラミングの館にかかれていますのでよく理解していただけると良いと思います。
なによりゲームプログラミングの館の勉強をしていたら色々と疑問が出てくるはずですので、そこで悩まないのなら理解できていないと思った方がよいです。
なのでまず館を理解するようにして疑問点を聞いてください。