マップチップと自キャラの当たり判定について

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

マップチップと自キャラの当たり判定について

#1

投稿記事 by na » 12年前

マップチップと自キャラの当たり判定についての質問です。
現在2Dアクションゲームを作っています。
現在のコードは、右と左を押すと動き自キャラがマップチップを素道りする用になっています
このコードに自キャラがマップチップにあたったら、そちらの方向に行けなくなるようにしたいのですが
調べてみてもイマイチ理解ができずにいます。
以前あったコードを見まねで書いてみたのですが、マップチップと関係ないところで動けなくなりました。
よろしければマップチップとの当たり判定のコードを教えてくれませんか?
よろしくお願いします

コード:

#include "Main.h"//ヘッダーの読み込み



int MyGHandle[11];
int Myx=96; //自キャラの初期x座標
int Myy=96; //自キャラの初期Y座標

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定
		LoadDivGraph("MY.png", 12, 3, 4, 93, 93, MyGHandle);

        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0){
                //ここに処理を追加
			MyMove();
			Map();
        }
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}  

コード:

#include "Main.h"//ヘッダーの読み込み


#define MAP_SIZE	32			// マップチップ一つのドットサイズ

#define MAP_WIDTH	20			// マップの幅
#define MAP_HEIGHT	15			// マップの縦長さ

// マップのデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
	{ 0, 0, 0, 0, 0, 0, 0, 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, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 } ,
	{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
} ;

int i,j;//マップチップの位置
bool RIGHTHit=false;



void Map(){
	//ひとつひとつのマップデータを見る
	for( i = 0 ; i < MAP_HEIGHT ; i ++ )
	{
		for( j = 0 ; j < MAP_WIDTH ; j ++ )
		{
			if( MapData[ i ][ j ] == 0 )//マップデータが0の場所をを色をつける
			{
				DrawBox( j * MAP_SIZE , i * MAP_SIZE ,
						j * MAP_SIZE + MAP_SIZE , i * MAP_SIZE + MAP_SIZE , 
							GetColor( 255 , 0 , 0 ) , TRUE ) ;//マップチップの色
			}
		}
	}
	
}
]

コード:

#include "Main.h"//ヘッダーの読み込み

void MyMove(){
	int phot=4;
	
	DrawGraph(Myx,Myy,MyGHandle[phot],true);

	if(CheckHitKey(KEY_INPUT_RIGHT) ){
		Myx +=2;			
	}

	if(CheckHitKey(KEY_INPUT_LEFT)){
			Myx -=2;
	}

}
[ヘッダー]#include "DxLib.h" //DxLib.hをインクルード


void MyMove();
void Map();


extern int phot,MyGHandle[],Myx,Myy;//Main.cppの変数extern
extern int i,j;//Map.cppのint変数extern
extern bool RIGHTHit;//Map.cppのbool変数extern[/ヘッダー]

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

Re: マップチップと自キャラの当たり判定について

#2

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

画面の座標系とマップチップの座標系が単位が違うと言うことをまずイメージ的に理解しないと行けません。
画面上はピクセルの単位で移動しますが、マップの単位は32x32ピクセルの1ブロック単位とするブロックです。
マップと当たり判定すると言うことは、ピクセル単位からマップブロック単位に変換してからマップを歩けるか調べないと行けないと言うことです。

こんな風に絵を書いてみると分かりやすくなりますよ。
map_hit.png
map_hit.png (11.95 KiB) 閲覧数: 9489 回
(16,0)を基準に描画されたキャラクタが(32,0)にある黒い斜線ブロックに食い込んでますよね?
つまり当たっているわけですが、画面上の座標は(32,0)のブロックですが配列上だとMapData[0][1]になります。 ← 縦横が配列上逆なので注意。

つまり、こんなデータです。

コード:

// マップのデータ
int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] =
{
    { 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ,
 略
}
ここまでは理解出来ますか?
ここで、絵や図を書くというのは結構重要です。つまり、イメージが出来なければ書いてみてイメージを固める事ができます。
全く書けなければ、それはイメージ出来ないので作れないと言うことです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

na

Re: マップチップと自キャラの当たり判定について

#3

投稿記事 by na » 12年前

画像まで用意していただき、ありがとうございます。
画面の座標系とマップチップの座標系の単位が違うと知らなかったので、驚き物でした。
大変わかりやすかったです。
つまり右に進む場合、自キャラの右側の座標(仮に右上の端)がマップチップの座標単位では
ブロックがあるところの場合は、通れなくする。こんな感じでよろしいですか?

しかし画面の座標をマップチップの座標に単位変換するにはどうすればよろしですか?

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

Re: マップチップと自キャラの当たり判定について

#4

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

マップがスクロールしない状況では、32ピクセル単位でマップのブロックが並んでいるわけです。
なので画面の座標を32で割れば、マップチップの座標単位となります。

そうですね例えるとこんな感じです。
32cmx32cmのブロックが横に20個、縦に15個平面に並んでいるいると想像してみてください。
その上に32cmx32cmの紙に書かれた絵が左上(0,0)から、右に16cm移動しました。さて何個目と何個目のブロックの上にあるでしょうか?
と考えてみてください。これなら想像しやすいと思います。算数程度の計算で解けると思いますよ。

つまり、右に移動する場合は移動後の自キャラの右側の座標を32で割ったマップチップの座標で歩けないマップチップを指していないか調べる訳です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

na

Re: マップチップと自キャラの当たり判定について

#5

投稿記事 by na » 12年前

一番上右端はこんな感じでよろしいでしょうか?
MapData[Myy/32][(Myx+93 + 2)/32]
これであってましたら、IF文など使ってみて試してみます

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

Re: マップチップと自キャラの当たり判定について

#6

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

93+2と言うのは何処から出てきた数値でしょうか?
横幅が93ピクセルで2ピクセル移動でしょうか? それなら良いのですが。

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

na

Re: マップチップと自キャラの当たり判定について

#7

投稿記事 by na » 12年前

画像の登録されていた横幅が93
移動が+2です。

言われたところを注意しながら、IF文をつかってやってみたところ無事にできました。
本当に助かりましたありがとうございます

閉鎖

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