ページ 11

ダンジョンの壁の判定

Posted: 2012年8月29日(水) 17:30
by mk.

コード:

#include"DxLib.h"

int main(void)
{
	ChangeWindowMode(TRUE);
	SetDrawScreen(DX_SCREEN_BACK);


	if(DxLib_Init()==-1)
		return -1;

	int x=10,y=10,cir_color;//円の座標と色
	int map_color;
	int i,j;
	int map[5][5]={{0,0,1,1,0},//ダンジョン形
				   {0,1,0,0,0},
				   {0,1,1,0,1},
	               {0,0,0,0,1},
	               {1,1,1,0,1}};
	
	while(1){  
	cir_color=GetColor(0,0,255);
	map_color=GetColor(255,255,255);

	ProcessMessage();
/*-------------------------------------
   キャラクターの移動処理
---------------------------------------*/
	if(CheckHitKey(KEY_INPUT_UP)==1)
		y--;
	else if(CheckHitKey(KEY_INPUT_DOWN)==1){
		y++;
	}
	else if(CheckHitKey(KEY_INPUT_RIGHT)==1){
		if(map[y][x+1]!=1)
		x++;
	}
	else if(CheckHitKey(KEY_INPUT_LEFT)==1)
		x--;
	
	ClearDrawScreen();
	//map描写
	DrawCircle(x,y,8,cir_cr,TRUE);
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			if(map[j][i]==1)
				DrawBox(i*20,j*20,i*20+20,j*20+20,box_cr,TRUE);
		}
	}

	ScreenFlip();
	}

	WaitKey();
	DxLib_End();

	return 0;
}
こんな感じでダンジョンの中を円が動くというプログラムを作成しました。
この円を壁にめり込まないようにしたいのですがどのようにすればいいのかわかりません。
ご回答よろしくおねがいします。
まだ初心者なのでコードに無駄な部分、汚い部分がありましたらご指摘お願いします。

※管理人がcodeタグを修正しました。

Re: ダンジョンの壁の判定

Posted: 2012年8月29日(水) 17:32
by mk.
[]はいらないんですね。すみません

Re: ダンジョンの壁の判定

Posted: 2012年8月29日(水) 20:02
by Dixq (管理人)
これ手打ちですか?
このままだとコンパイルエラーで実行できないと思いますが・・

まず仕様をお聞きしたいのですが、一度上下左右キーを押したら玉は1区間進む仕様ですか?
それとも1ピクセルずつ玉はスムーズに進むのですか?もしその場合、2x2のような広い空間があったら斜めに進めるのですか?

Re: ダンジョンの壁の判定

Posted: 2012年8月29日(水) 22:17
by mk.
作成したいゲームてきには1ビットづつでなくてもいいのですが、ある一定の値づつ進むということはないです。
できればななめ移動も可能なようにしたいですが、プログラムの難易度が跳ね上がるようなら実施しないつもりです。

エラーすみませんでした。
変数名を貼り付けてから編集したので書き換え忘れの部分です。
43行目cir_cr→cir_color
47行目box_cr→map_color
で書き換えてもらえれば結構です。

Re: ダンジョンの壁の判定

Posted: 2012年8月29日(水) 22:22
by mk.
連続投稿すみません。
最初に投稿したコードではあたり判定の実験の消し忘れやエラーがありましたので正しいやつを上げておきます。
code=c++
#include"DxLib.h"

int main(void)
{
ChangeWindowMode(TRUE);
SetDrawScreen(DX_SCREEN_BACK);


if(DxLib_Init()==-1)
return -1;

int x=10,y=10,cir_color;//円の座標と色
int map_color;
int i,j;
int map[5][5]={{0,0,1,1,0},//ダンジョン形
{0,1,0,0,0},
{0,1,1,0,1},
{0,0,0,0,1},
{1,1,1,0,1}};

while(1){
cir_color=GetColor(0,0,255);
map_color=GetColor(255,255,255);

ProcessMessage();
/*-------------------------------------
キャラクターの移動処理
---------------------------------------*/
if(CheckHitKey(KEY_INPUT_UP)==1)
y--;
else if(CheckHitKey(KEY_INPUT_DOWN)==1)
y++;
else if(CheckHitKey(KEY_INPUT_RIGHT)==1)
x++;
else if(CheckHitKey(KEY_INPUT_LEFT)==1)
x--;

ClearDrawScreen();
//map描写
DrawCircle(x,y,8,cir_color,TRUE);
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(map[j]==1)
DrawBox(i*20,j*20,i*20+20,j*20+20,map_color,TRUE);
}
}

ScreenFlip();
}

WaitKey();
DxLib_End();

return 0;
}
/code

Re: ダンジョンの壁の判定

Posted: 2012年8月29日(水) 23:23
by トントン
>この円を壁にめり込まないようにしたいのですがどのようにすればいいのかわかりません。
旧ゲームプログラミングの館にある
23. 行けない所を作る。~1D~
24. 行けない所を作る。~2D~
は参考になりませんか?

Re: ダンジョンの壁の判定

Posted: 2012年8月30日(木) 00:00
by softya(ソフト屋)
コードタグは[/code]と

コード:

の組み合わせです。
※ わざと逆に書いてあります。

Re: ダンジョンの壁の判定

Posted: 2012年8月30日(木) 00:02
by softya(ソフト屋)
ちゃんとしたのを貼っておきます。

コード:

#include"DxLib.h"

int main(void)
{
	ChangeWindowMode(TRUE);
	SetDrawScreen(DX_SCREEN_BACK);


	if(DxLib_Init()==-1)
		return -1;

	int x=10,y=10,cir_color;//円の座標と色
	int map_color;
	int i,j;
	int map[5][5]={{0,0,1,1,0},//ダンジョン形
				   {0,1,0,0,0},
				   {0,1,1,0,1},
	               {0,0,0,0,1},
	               {1,1,1,0,1}};
	
	while(1){  
	cir_color=GetColor(0,0,255);
	map_color=GetColor(255,255,255);

	ProcessMessage();
/*-------------------------------------
   キャラクターの移動処理
---------------------------------------*/
	if(CheckHitKey(KEY_INPUT_UP)==1)
		y--;
	else if(CheckHitKey(KEY_INPUT_DOWN)==1)
		y++;
	else if(CheckHitKey(KEY_INPUT_RIGHT)==1)
		x++;
	else if(CheckHitKey(KEY_INPUT_LEFT)==1)
		x--;
	
	ClearDrawScreen();
	//map描写
	DrawCircle(x,y,8,cir_color,TRUE);
	for(i=0;i<5;i++){
		for(j=0;j<5;j++){
			if(map[j][i]==1)
				DrawBox(i*20,j*20,i*20+20,j*20+20,map_color,TRUE);
		}
	}

	ScreenFlip();
	}

	WaitKey();
	DxLib_End();

	return 0;
}

Re: ダンジョンの壁の判定

Posted: 2012年8月30日(木) 00:18
by softya(ソフト屋)
リンクが通りませんね。
DXライブラリですのでWinMainで始まらないといけません。
必ず動作確認して貼って下さい。

それとインデントが間違っていますのでVC++ならCTRL+Aで選択後に編集→詳細→選択範囲のフォーマットでインデントを整形してから投稿して下さい。
日頃からインテントを整えるとバグも減りますよ。

DXライブラリ御本家のサンプルも参考になると思います。
「29.アクションゲームにおけるマップとの当たり判定基本」
http://homepage2.nifty.com/natupaji/DxL ... Sample.cpp

わからないことは聞いてくださいね。

Re: ダンジョンの壁の判定

Posted: 2012年8月30日(木) 01:19
by トントン
softya(ソフト屋) さんが書きました:リンクが通りませんね。
DXライブラリですのでWinMainで始まらないといけません。
必ず動作確認して貼って下さい。
gccだと通りましたね。
# mkさんがMinGW用を使用しているのかは置いといて。
# というか通るんですね。

ちなみに、このプログラムだとゾンビ状態になるようです。

Re: ダンジョンの壁の判定

Posted: 2012年9月03日(月) 20:16
by mk.
たくさんのご指摘ありがとうございます。
最終的には旧プログラミングの館の2Dダンジョンのようなパターンにしました。

Re: ダンジョンの壁の判定

Posted: 2012年9月03日(月) 21:11
by Dixq (管理人)
ななめ移動も特に難しくないと思いますが、移動をスムーズにヌルッと行わせるのは結構難易度が上がりそうです。
つまりボンバーマンのような移動方法ですね。
例えば一区間が32x32ピクセルだとしたら、32のちょうど倍数の座標にいる時でないと曲がれないという仕様では非常に操作が難しいです。
操作をしやすくするには、ブロックの中間で方向キーを押した時、ブロックが無い方に向かって歩き始めなければならず、移動に調整が必要です。
昔こんな物を作ったことがありますが、こういうことを言っています。
http://dixq.net/bomman.html (注意:音が出ます)
32の倍数以外の座標で方向転換してもスムーズに移動できているのが分かりますかね。
これは、進行方向に障害物があれば、ない方向に押し出すような計算をして実装しています。

まぁ2Dダンジョンのようなパターンでいいのであれば、それが一番楽ですけどね。
単にのめりこまないようにしたいのであれば、一時変数上で進行方向に動かしてみて、ブロックとのあたり判定を計算し、あたっていれば壁まで押し戻せばいい(あるいは移動自体をさせない)と思います。