何故かフリーズします。

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

何故かフリーズします。

#1

投稿記事 by kayama » 16年前

FF風のメッセージウィンドウを作成しようと思い以下の様なプログラムを組んだのですが。。
ファイル1
#include "DxLib.h"

extern void WndGrpPri(double,double,double,double);
 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
        ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
        if( DxLib_Init() == -1 ) return -1;//初期化処理する関数
	WndGrpPri(50,50,100,100);
        WaitKey() ;//何か入力があるまで待つ関数
        DxLib_End() ;//終了処理をする関数
        return 0 ;
}

ファイル2

#include "DxLib.h"

#define COLOR_MAX 255
#define COLOR_PLU 1

void WndGrpPri(double X,double Y,double H,double W){
	H += X;
	W += Y;
	double P = ( W - X ) / COLOR_MAX / COLOR_PLU ;
	int    color,var,cnt;
	for (cnt=0 ; cnt < COLOR_MAX ; cnt+=COLOR_PLU ){
		if (cnt<=COLOR_PLU*2) {
			X++;
			Y++;
			H--;
			W--;
			var = (cnt - 1) * (cnt - 1) * -10 + 200;
			color = GetColor(var,var,var);
		}else{
			H -= P;
			Y += P;
			color = GetColor(0,0,COLOR_MAX-cnt);
		}
		DrawBox (X,Y,W,H,color,TRUE);
		WaitKey(); // 動作を確認するために毎回停止
	}

}
何故かフリーズしてしまいます。
実行中に左下のバーの自動変数のところにcntが値が-858993460と出ています。
cntの値を直接変更しているのはfor文のパラメータのところだけなはずなのですが、何故こうなるのでしょうか?

kayama

Re:何故かフリーズします。

#2

投稿記事 by kayama » 16年前

void WndGrpPri(double X,double Y,double H,double W){
	double P = ( W - X ) / COLOR_MAX / COLOR_PLU ;
	H += Y;
	W += X;
	int    color,var,cnt;
	for (cnt=0 ; cnt < COLOR_MAX ; cnt+=COLOR_PLU ){
		if (cnt<=COLOR_PLU*2) {
			X++;
			Y++;
			H--;
			W--;
			var = (cnt - 1) * (cnt - 1) * -10 + 200;
			color = GetColor(var,var,var);
		}else{
			H -= P;
			Y += P;
			color = GetColor(0,0,COLOR_MAX-cnt);
		}
		DrawBox (X,Y,W,H,color,TRUE);
		WaitKey();
	}

}
でした。
どちらにせよフリーズしますが。。

kazuoni

Re:何故かフリーズします。

#3

投稿記事 by kazuoni » 16年前

フリーズっというか、キーを255回押すとWndGrpPri
をぬけて、(その間の暗くなり方がちょっと魅力的ですw)
もう一度キーを押すと終了っというプログラムですが・・・?(255+1回押すまでは終了しない)
本当はどういう動作を期待しているのでしょうか?

kayama

Re:何故かフリーズします。

#4

投稿記事 by kayama » 16年前

私の環境で実行すると何故かフリーズしてしまいます。。
実行直後急に重くなりウィンドウが消えてしまうので、
タスクバーから終了をすると
「このプログラムは応答していません。」
とでてしまいます。

ループ毎にWaitKey()を入れてるのは動作を確認するためです。

因みに本当は
┏━━━━━┓
┃メッセージ┃
┃ウィンドウ┃
┃(グラデ)┃
┗━━━━━┛
こんな感じに(分かりにくいですけど)ゲームウィンドウを作りたかったです。
フリーズさえなければ動作を改善できるのですがorz
まともに実行できないので成功してるのかどうかすら分かりません。。

kazuoni

Re:何故かフリーズします。

#5

投稿記事 by kazuoni » 16年前

自分の環境ではどこで止まっているのかがわからないので、
デバッグの際に、すべての行を見ていってください。
環境は何ですか?VC++ならブレークポイントがそれにあたります。
実行して反応がなかったらそこが原因です。

>実行中に左下のバーの自動変数のところにcntが値が-858993460と出ています
for文のcnt=0が実行されていない可能性がります。(あくまで可能性です。)

ちなみに、BrawBox()の第一~四引数はint型です。

SCI

Re:何故かフリーズします。

#6

投稿記事 by SCI » 16年前

フリーズするのは、ProcessMessage()関数を呼んでいないからですね。
まずは、基本的なループを組んでから、中身を作っていくといいと思います。

kayama

Re:何故かフリーズします。

#7

投稿記事 by kayama » 16年前

>>kazuoniさん
int型にキャストしたらフリーズしなくなりました。
ありがとうございました。

>>SCIさん
そう言えばProcessMessageを忘れてました。
ちゃんと入れておきます。
ありがとうございました。



こんな感じになりましたがプログラムに問題はないでしょうか?
#include "DxLib.h"

extern int WndGrpPri(double,double,double,double);

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ;//ウィンドウモードに変更する関数
if( DxLib_Init() == -1 ) return -1;//初期化処理する関数

LoadGraphScreen( 0 , 0 , "test1.bmp" , TRUE ) ;//画像を表示する関数
WndGrpPri(50,50,100,100);

WaitKey() ;//何か入力があるまで待つ関数
DxLib_End() ;//終了処理をする関数
return 0 ;
}




#include "DxLib.h"

#define COLOR_MAX 255
#define COLOR_PLU 1

int WndGrpPri(double X,double Y,double H,double W){
double P = ( W - COLOR_PLU * 4 ) / COLOR_MAX * COLOR_PLU ;
double X2,Y2,W2,H2;
H += Y; W += X;
int color,var,cnt;
for (cnt=0 ; cnt < COLOR_MAX/COLOR_PLU ; cnt+=COLOR_PLU ){
if (ProcessMessage()){return -1;}
if (cnt<=COLOR_PLU*2) {
X++; Y++; H--; W--;
var = (cnt - 1) * (cnt - 1) * 10 + 200;
color = GetColor(var,var,var);
}else{
Y += P;
//H -= P;
color = GetColor(0,0,COLOR_PLU-cnt);
}
X2 = X; Y2 = Y; W2 = W; H2 = H;
DrawBox ((int)X2,(int)Y2,(int)W2,(int)H2,color,TRUE);
// WaitKey();
}
return 0;
}

SCI

Re:何故かフリーズします。

#8

投稿記事 by SCI » 16年前

これって、枠が出てグラデーションが内側に向かっていけばいいんですよね?
私もいろいろ考えてみましたが、DrawBoxで描画した矩形を保持しようとすると、どうしても方法が複雑になってしまいそうなんです。
(私の力不足・・・泣)

グラデーションを画像で用意すれば、もう少し単純な感じに出来そうなんですけど、このコードのように細かく指定できるほうがいいですか?

kayama

Re:何故かフリーズします。

#9

投稿記事 by kayama » 16年前

う~ん。。強引すぎますかね。

一応結果さえ得られればいいのですが、この方法だと毎回描写するにも処理に時間がかかりますし、やはりグラデ画像を使うべきなんでしょうか。

kazuoni

Re:何故かフリーズします。

#10

投稿記事 by kazuoni » 16年前

まず、今後の為にも、裏描写のSetDrawScreen( DX_SCREEN_BACK )
を使うようにしたほうが良いと思います。
詳細は本家へ。
ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_graph.html#R4N6
なぜっと思ったらゲームプログラミングの館1~13章までささっと読んでみてください。
http://dixq.net/g/#13

自分もやはりグラデーション画像を用意したほうが効率的かと思います。
何度も同じところを描写していることになるので、ちょっと非効率な気がします。

SCI

Re:何故かフリーズします。

#11

投稿記事 by SCI » 16年前

一応、想定しているような表示になるコードはかけたのですが、描画が一通り終わると、その後の更新がされないんです。
つまり、描画が終わった後は矩形が消されると再描画されなくなってしまいます。

画像の場合、同じドットを毎フレーム描画すればいいんですけど、今回の場合はそうはいかないかも知れません。
例えば、完成形のグラデーションを毎フレーム作るか、描画が終わった段階の矩形をそのままコピーしておくか・・・

kayama

Re:何故かフリーズします。

#12

投稿記事 by kayama » 16年前

>>kazuoniさん
アドバイスありがとうございます。
一度全部読み直して見ます。

>>SCIさん
やはり厳しいですよねorz
素直に画像を使うことにします。

閉鎖

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