ページ 11

イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 00:20
by TERA
下のようなコードでやっているんですけどマグマとマウスの当たり判定と数秒したら画面が真っ暗になるバグの解決法を教えて下さい!

コード:

#include "DxLib.h"
#include <stdlib.h>

int map[12][16] = {
		{1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
		{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1},
		{1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1},
		{1,0,1,0,1,0,1,1,1,1,1,1,0,1,0,1},
		{1,0,1,0,1,0,1,0,0,0,0,1,0,1,0,1},
		{1,0,1,0,1,0,0,0,0,0,0,1,0,1,0,1},
		{1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1},
		{1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1},
		{1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1},
		{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
		{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//マップ
		
	};
    int M1Handle,M2Handle,CHandle ;//画像データ保存
	int MouseX , MouseY ;//マウス座標
	int i,j;
	
int MAP()
{
	M1Handle = LoadGraph( "map1.png" ) ;//マウスが通れる場所
	M2Handle = LoadGraph( "map2.png" ) ;//落ちたら死ぬ
	
	for (j = 0; j < 12; j++) {
		for (i= 0; i < 16; i++) {
			if(map[j][i]==1)
				DrawExtendGraph( 40*i , 40*j ,40+40*i , 40+40*j , M1Handle , FALSE ) ;//道表示
			else
				DrawExtendGraph( 40*i , 40*j , 40+40*i , 40+40*j , M2Handle , FALSE ) ;//マグマ表示
	}
	}
	
	return 0;
}
int HIT()
{
	i=0,j=0;
	for (j = 0; j < 12; j++) {
		for (i= 0; i < 16; i++) {
			if(map[j][i]==0){
				if(MouseX < 30+30*i && 30*i < MouseX && MouseY < 30+30*j && 30*j < MouseY)//当たり判定
					SetMousePoint( 0 , 0 ) ;
			}
	}
	}
	return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
			LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode( TRUE ) ;//640×480 16*12
	
	if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
	{
			return -1;    // エラーが起きたら直ちに終了
	}

	// マウスを非表示状態にする
	SetMouseDispFlag( FALSE ) ;
	CHandle = LoadGraph( "bouzu.png" ) ;
	
	while(1)
	{
		// マウスの位置を取得
		
		GetMousePoint( &MouseX , &MouseY ) ;
		MAP();
		DrawExtendGraph( MouseX-15 , MouseY-15 , MouseX+15 , MouseY+15 , CHandle , TRUE ) ;
		HIT();
		// メッセージ処理
		if( ProcessMessage() == -1 )
		{
			break ;    // エラーが起きたらループを抜ける
		}
		ClearDrawScreen() ;
	}

	DxLib_End() ;        // DXライブラリ使用の終了処理

	return 0 ;        // ソフトの終了
}
 

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 00:25
by みけCAT
TERA さんが書きました:数秒したら画面が真っ暗になるバグの解決法を教えて下さい!
画像を毎フレームロードするべきではありません。

当たり判定の方は後で考えたいと思います。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 00:26
by hide
とりあえず MAP() という関数内で LoadGraph() しているのはよろしくないですね。
なぜダメなのか理由は分かりますか?

あと、ちょくちょくインデントがおかしいのが気になります。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 00:29
by softya(ソフト屋)
骨格として足らないものがあるので、こちらを真似して頂くと動くと思います。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]  1.9章 ゲームプログラムの骨格の完成」
http://dixq.net/g/01_09.html

それとLoadGraph()がメインループにあるのでメモリリークかハンドル不足ででやがて落ちます。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 00:45
by TERA
真っ暗になるバグは解決しました!
ありがとうございます!

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 00:48
by hide
TERA さんが書きました:真っ暗になるバグは解決しました!
ありがとうございます!
このトピックの目的を達成したのであれば
フォーラムルールに従って終わらせてくださいね。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 00:48
by softya(ソフト屋)
TERA さんが書きました:真っ暗になるバグは解決しました!
ありがとうございます!
フォーラムルールに記載されているのですが、今後同じ問題にハマる人のためにどう直したか分かるようにお願いします。
http://dixq.net/board/board.html
ソースコードを載せてもらうのが手っ取り早いです。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 01:28
by TERA
あと、マグマとマウスの当たり判定の条件を教えてください。この条件では、通路を通っているのに座標0.0 に戻ったりマグマに当たっているのに戻らなかったりする部分があります。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 09:44
by みけCAT
TERA さんが書きました:あと、マグマとマウスの当たり判定の条件を教えてください。この条件では、通路を通っているのに座標0.0 に戻ったりマグマに当たっているのに戻らなかったりする部分があります。
あたり判定で使用している1マスの大きさと、描画で使用している1マスの大きさが違うようです。
このようなバグを防ぐために、マスの大きさを定数で定義するか、
画像をロードした直後に画像の大きさを取得し、その値を利用するのがいいと思います。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 13:07
by softya(ソフト屋)
TERA さんが書きました:あと、マグマとマウスの当たり判定の条件を教えてください。この条件では、通路を通っているのに座標0.0 に戻ったりマグマに当たっているのに戻らなかったりする部分があります。
一方通行にならないように、なるべく回答者に返答をお願いしいます。

さて質問の件ですが、こうすると自分で確認できるという方法をご紹介します。
if(MouseX < 30+30*i && 30*i < MouseX && MouseY < 30+30*j && 30*j < MouseY)//当たり判定
この条件で当たった瞬間に、DrawBox(30*i,30*j,30+30*i,30+30*j,GetColor(255,0,0),FALSE);と視覚的に大変わかり易いです。
つまり、バグを自分でわかりやすくする工夫がデバッグには必要なのです。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 17:47
by TERA
みけCAT さんが書きました:
TERA さんが書きました:あと、マグマとマウスの当たり判定の条件を教えてください。この条件では、通路を通っているのに座標0.0 に戻ったりマグマに当たっているのに戻らなかったりする部分があります。
あたり判定で使用している1マスの大きさと、描画で使用している1マスの大きさが違うようです。
このようなバグを防ぐために、マスの大きさを定数で定義するか、
画像をロードした直後に画像の大きさを取得し、その値を利用するのがいいと思います。
ありがとうございます。画像の大きさを同じにしたらバグがなくなりました。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 17:48
by TERA
softya(ソフト屋) さんが書きました:
TERA さんが書きました:あと、マグマとマウスの当たり判定の条件を教えてください。この条件では、通路を通っているのに座標0.0 に戻ったりマグマに当たっているのに戻らなかったりする部分があります。
一方通行にならないように、なるべく回答者に返答をお願いしいます。

さて質問の件ですが、こうすると自分で確認できるという方法をご紹介します。
if(MouseX < 30+30*i && 30*i < MouseX && MouseY < 30+30*j && 30*j < MouseY)//当たり判定
この条件で当たった瞬間に、DrawBox(30*i,30*j,30+30*i,30+30*j,GetColor(255,0,0),FALSE);と視覚的に大変わかり易いです。
つまり、バグを自分でわかりやすくする工夫がデバッグには必要なのです。
ありがとうございます。これからそのような工夫をしてプログラムがうまくなるよう精進していきたいと思います。

Re: イライラ棒的なゲームを作っているんですけど・・・

Posted: 2014年4月20日(日) 17:49
by TERA
下のようなコードでバグがなくなりました。

コード:

 
#include "DxLib.h"
#include <stdlib.h>

int map[12][16] = {
	{1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
	{1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,0,1,0,1,1,1,1,1,1,1,1,1,1,0,1},
	{1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,1},
	{1,0,1,0,1,0,1,1,1,1,1,1,0,1,0,1},
	{1,0,1,0,1,0,1,0,0,0,0,1,0,1,0,1},
	{1,0,1,0,1,0,0,0,0,0,0,1,0,1,0,1},
	{1,0,1,0,1,1,1,1,1,1,1,1,0,1,0,1},
	{1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1},
	{1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1},
	{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
	{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},//マップ

};
int StartTime;
int M1Handle,M2Handle,CHandle ;//画像データ保存
int S1Handle,S2Handle;
int MouseX , MouseY ;//マウス座標
int i,j;
int LOAD()
{
	CHandle = LoadGraph( "bouzu.png" ) ;
	M1Handle = LoadGraph( "map1.png" ) ;//マウスが通れる場所
	M2Handle = LoadGraph( "map2.png" ) ;//落ちたら死ぬ
	S1Handle = LoadSoundMem("mokugyo1.mp3");
	return 0;
}
int MAP()
{
	
	for (j = 0; j < 12; j++){
		for (i= 0; i < 16; i++){
			if(map[j][i]==1)
				DrawExtendGraph( 40*i , 40*j ,40+40*i , 40+40*j , M1Handle , FALSE ) ;//道表示
			else
				DrawExtendGraph( 40*i , 40*j , 40+40*i , 40+40*j , M2Handle , FALSE ) ;//マグマ表示
		}
	}

	return 0;
}
int HIT()
{
	i=0,j=0;
	for (j = 0; j < 12; j++){
		for (i= 0; i < 16; i++){
			if(map[j][i]==0){
				if(MouseX < 40+40*i && 40*i < MouseX && MouseY < 40+40*j && 40*j < MouseY)//当たり判定
					SetMousePoint( 0 , 0 ) ;
			}
		}
	}
	return 0;
}
int TIME()
{
	if( GetNowCount() - StartTime < 6000){
		PlaySoundMem(S1Handle,DX_PLAYTYPE_BACK);
		
	}
	return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPSTR lpCmdLine, int nCmdShow )
{
	ChangeWindowMode( TRUE ) ;//640×480 16*12

	if( DxLib_Init() == -1 )    // DXライブラリ初期化処理
	{
		return -1;    // エラーが起きたら直ちに終了
	}

	// マウスを非表示状態にする
	StartTime = GetNowCount();
	SetMouseDispFlag( FALSE ) ;

	while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 )
	{
		LOAD();
		TIME();
		// マウスの位置を取得
		GetMousePoint( &MouseX , &MouseY ) ;
		MAP();
		DrawExtendGraph( MouseX-20 , MouseY-20 , MouseX+20 , MouseY+20 , CHandle , TRUE ) ;
		HIT();
	}

	DxLib_End() ;        // DXライブラリ使用の終了処理

	return 0 ;        // ソフトの終了
}