ページ 1 / 1
ProcessMessageについてちょっとした疑問があります
Posted: 2016年3月07日(月) 22:15
by PUMP
ゲームのメインループは、ProcessMessageで「ウィンドウの×ボタンが押された時にループを抜ける」という風にしてあるのが基本のようですが
例えば次のようなプログラムがあったとして
コード:
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {
ChangeWindowMode(true);
DxLib_Init();
while (ProcessMessage() == 0) {
}
WaitKey();
DxLib_End();
return 0;
}
ウィンドウ×ボタンを押すとProcessMessageに0以外が返される、条件式にはまらなくなるのでループを抜ける、その後WaitKeyでキーを押さないと終了できない...となると予想していたのですが
ウィンドウの×ボタンを押すとすぐに終了してしまいます。
気になったんですが、これはどういう仕様でなっているのでしょうか?
もし「×ボタン = 強制終了ボタン = WaitKeyは実行されない」 ということでしたら、DxLib_Endも実行されていないということですかね?
Re: ProcessMessageについてちょっとした疑問があります
Posted: 2016年3月07日(月) 23:11
by amehirune
面白い話だなーと思ったので実験してみました。
コード:
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {
FILE *fp;
fp = fopen("Mlog.txt","w");
ChangeWindowMode(true); fprintf(fp,"起動プロセス:ウィンドウモードに変更\n");
DxLib_Init(); fprintf(fp,"起動プロセス:Dxライブラリの初期化に成功\n");
while (ProcessMessage() == 0) {
}
fprintf(fp,"プロセスメッセージより0以外の値が返されました\n");
WaitKey(); fprintf(fp,"終了プロセス:何かキーが押されるまで待機しています\n");
DxLib_End(); fprintf(fp,"終了プロセス:Dxライブラリの終了処理を行いました\n");
fclose(fp);
return 0;
}
各重要点にチェックポイントを設け、処理をさせてみました。
すると、以下のようなログファイルが出力されました。
起動プロセス:ウィンドウモードに変更
起動プロセス:Dxライブラリの初期化に成功
プロセスメッセージより0以外の値が返されました
終了プロセス:何かキーが押されるまで待機しています
終了プロセス:Dxライブラリの終了処理を行いました
きちんとWaitKeyも実行され、Dx_endも実行されているのが確認できます。
因みに、なぜこうなったのかを説明しておきますと、
WaitKey関数は実は「キーボードからの入力待ち」ではなく、ただ単純に「入力待ち」なんです。
実はこれ、マウスクリックにも反応して、それでWaitが解除されてしまうんです。
恐らく、×ボタンもウィンドウの中に入っているので、
プロセスを抜ける→そのとき×ボタンを押している→WaitKeyも反応→即座に終了
という流れを踏んでいるのではないかと推測されます。
間違っていたらごめんなさい。
Re: ProcessMessageについてちょっとした疑問があります
Posted: 2016年3月08日(火) 15:53
by プラム
PUMP さんが書きました:
ゲームのメインループは、ProcessMessageで「ウィンドウの×ボタンが押された時にループを抜ける」という風にしてあるのが基本のようですが
例えば次のようなプログラムがあったとして
ウィンドウ×ボタンを押すとProcessMessageに0以外が返される、条件式にはまらなくなるのでループを抜ける、その後WaitKeyでキーを押さないと終了できない...となると予想していたのですが
ウィンドウの×ボタンを押すとすぐに終了してしまいます。
気になったんですが、これはどういう仕様でなっているのでしょうか?
もし「×ボタン = 強制終了ボタン = WaitKeyは実行されない」 ということでしたら、DxLib_Endも実行されていないということですかね?
すごく面白い発想ですね、僕は考えたことがなかったです。
これはすごく良い発想だと思います。そこの場所に処理を追加することで、自動セーブ機能を作ったりすることもできますしね。
amehirune さんが書きました:
各重要点にチェックポイントを設け、処理をさせてみました。
すると、以下のようなログファイルが出力されました。
起動プロセス:ウィンドウモードに変更
起動プロセス:Dxライブラリの初期化に成功
プロセスメッセージより0以外の値が返されました
終了プロセス:何かキーが押されるまで待機しています
終了プロセス:Dxライブラリの終了処理を行いました
きちんとWaitKeyも実行され、Dx_endも実行されているのが確認できます。
因みに、なぜこうなったのかを説明しておきますと、
WaitKey関数は実は「キーボードからの入力待ち」ではなく、ただ単純に「入力待ち」なんです。
実はこれ、マウスクリックにも反応して、それでWaitが解除されてしまうんです。
恐らく、×ボタンもウィンドウの中に入っているので、
プロセスを抜ける→そのとき×ボタンを押している→WaitKeyも反応→即座に終了
という流れを踏んでいるのではないかと推測されます。
間違っていたらごめんなさい。
僕もamehiruneさんが言っているように、クリックに反応して、処理が通ったんだともいます。
もしEscが押されたときに終了したいのであれば
コード:
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int) {
ChangeWindowMode(true);
DxLib_Init();
while (ProcessMessage() == 0){}
while(CheckKeyInput(KEY_INPUT_ESCAPE)==0){}
WaitKey();
DxLib_End();
return 0;
}
などとやってみると良いと思います。
Re: ProcessMessageについてちょっとした疑問があります
Posted: 2016年3月08日(火) 16:30
by usao
DXライブラリを使ったことないですが…
ググると,リファレンスでは
・WaitKey()はProcessMessage()を実行している
・ProcessMessage()はウィンドウが閉じられたら-1を返す
ということみたいです.
問題にしている 10行目のWaitKey()の時点では,既にウィンドウが存在していないから
WaitKey()が所望の動作をしないというだけのことなのではないでしょうか.
Re: ProcessMessageについてちょっとした疑問があります
Posted: 2016年3月08日(火) 18:44
by PUMP
リファレンスページに書いてあるとは...盲点でした...
やっと動的確保を勉強し始めたところで、「もしかしてこれ解放できてない!?」と深読みしまして(^^;
普通に処理でいてるようで、安心しました。 ありがとうございます。