#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 ; // ソフトの終了
}
イライラ棒的なゲームを作っているんですけど・・・
-
TERA
イライラ棒的なゲームを作っているんですけど・・・
下のようなコードでやっているんですけどマグマとマウスの当たり判定と数秒したら画面が真っ暗になるバグの解決法を教えて下さい!
Re: イライラ棒的なゲームを作っているんですけど・・・
画像を毎フレームロードするべきではありません。TERA さんが書きました:数秒したら画面が真っ暗になるバグの解決法を教えて下さい!
当たり判定の方は後で考えたいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
hide
Re: イライラ棒的なゲームを作っているんですけど・・・
とりあえず MAP() という関数内で LoadGraph() しているのはよろしくないですね。
なぜダメなのか理由は分かりますか?
あと、ちょくちょくインデントがおかしいのが気になります。
なぜダメなのか理由は分かりますか?
あと、ちょくちょくインデントがおかしいのが気になります。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: イライラ棒的なゲームを作っているんですけど・・・
骨格として足らないものがあるので、こちらを真似して頂くと動くと思います。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 1.9章 ゲームプログラムの骨格の完成」
http://dixq.net/g/01_09.html
それとLoadGraph()がメインループにあるのでメモリリークかハンドル不足ででやがて落ちます。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ] 1.9章 ゲームプログラムの骨格の完成」
http://dixq.net/g/01_09.html
それとLoadGraph()がメインループにあるのでメモリリークかハンドル不足ででやがて落ちます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
hide
Re: イライラ棒的なゲームを作っているんですけど・・・
このトピックの目的を達成したのであればTERA さんが書きました:真っ暗になるバグは解決しました!
ありがとうございます!
フォーラムルールに従って終わらせてくださいね。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: イライラ棒的なゲームを作っているんですけど・・・
フォーラムルールに記載されているのですが、今後同じ問題にハマる人のためにどう直したか分かるようにお願いします。TERA さんが書きました:真っ暗になるバグは解決しました!
ありがとうございます!
http://dixq.net/board/board.html
ソースコードを載せてもらうのが手っ取り早いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: イライラ棒的なゲームを作っているんですけど・・・
あと、マグマとマウスの当たり判定の条件を教えてください。この条件では、通路を通っているのに座標0.0 に戻ったりマグマに当たっているのに戻らなかったりする部分があります。
Re: イライラ棒的なゲームを作っているんですけど・・・
あたり判定で使用している1マスの大きさと、描画で使用している1マスの大きさが違うようです。TERA さんが書きました:あと、マグマとマウスの当たり判定の条件を教えてください。この条件では、通路を通っているのに座標0.0 に戻ったりマグマに当たっているのに戻らなかったりする部分があります。
このようなバグを防ぐために、マスの大きさを定数で定義するか、
画像をロードした直後に画像の大きさを取得し、その値を利用するのがいいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: イライラ棒的なゲームを作っているんですけど・・・
一方通行にならないように、なるべく回答者に返答をお願いしいます。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);と視覚的に大変わかり易いです。
つまり、バグを自分でわかりやすくする工夫がデバッグには必要なのです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: イライラ棒的なゲームを作っているんですけど・・・
ありがとうございます。画像の大きさを同じにしたらバグがなくなりました。みけCAT さんが書きました:あたり判定で使用している1マスの大きさと、描画で使用している1マスの大きさが違うようです。TERA さんが書きました:あと、マグマとマウスの当たり判定の条件を教えてください。この条件では、通路を通っているのに座標0.0 に戻ったりマグマに当たっているのに戻らなかったりする部分があります。
このようなバグを防ぐために、マスの大きさを定数で定義するか、
画像をロードした直後に画像の大きさを取得し、その値を利用するのがいいと思います。
Re: イライラ棒的なゲームを作っているんですけど・・・
ありがとうございます。これからそのような工夫をしてプログラムがうまくなるよう精進していきたいと思います。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: イライラ棒的なゲームを作っているんですけど・・・
下のようなコードでバグがなくなりました。
#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 ; // ソフトの終了
}