ダンジョンの壁の判定

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

ダンジョンの壁の判定

#1

投稿記事 by mk. » 13年前

コード:

#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タグを修正しました。

mk.

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

#2

投稿記事 by mk. » 13年前

[]はいらないんですね。すみません

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

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

#3

投稿記事 by Dixq (管理人) » 13年前

これ手打ちですか?
このままだとコンパイルエラーで実行できないと思いますが・・

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

mk.

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

#4

投稿記事 by mk. » 13年前

作成したいゲームてきには1ビットづつでなくてもいいのですが、ある一定の値づつ進むということはないです。
できればななめ移動も可能なようにしたいですが、プログラムの難易度が跳ね上がるようなら実施しないつもりです。

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

mk.

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

#5

投稿記事 by mk. » 13年前

連続投稿すみません。
最初に投稿したコードではあたり判定の実験の消し忘れやエラーがありましたので正しいやつを上げておきます。
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

トントン
記事: 100
登録日時: 15年前

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

#6

投稿記事 by トントン » 13年前

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#7

投稿記事 by softya(ソフト屋) » 13年前

コードタグは[/code]と

コード:

の組み合わせです。
※ わざと逆に書いてあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#8

投稿記事 by softya(ソフト屋) » 13年前

ちゃんとしたのを貼っておきます。

コード:

#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;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

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

#9

投稿記事 by softya(ソフト屋) » 13年前

リンクが通りませんね。
DXライブラリですのでWinMainで始まらないといけません。
必ず動作確認して貼って下さい。

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

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

わからないことは聞いてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

トントン
記事: 100
登録日時: 15年前

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

#10

投稿記事 by トントン » 13年前

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

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

mk.

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

#11

投稿記事 by mk. » 13年前

たくさんのご指摘ありがとうございます。
最終的には旧プログラミングの館の2Dダンジョンのようなパターンにしました。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

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

#12

投稿記事 by Dixq (管理人) » 13年前

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

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

閉鎖

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