Dxlibで二次元配列のマップチップとの当たり判定について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kurou
記事: 4
登録日時: 5年前

Dxlibで二次元配列のマップチップとの当たり判定について

#1

投稿記事 by kurou » 5年前

今directxの2dでゲームを作っているのですが二次元配列のマップチップとの当たり判定にこまっています教えてください。よろしくお願いします。

コード:

HRESULT MakeVertexTutoBlock(void);

void SetVertexTutoBlock(void);
//void SetVertexBlock(float x, float y, float z);
//void SetBB(int block_x, int block_y);
static void Setbb(void);

static D3DXVECTOR3 tuto_possize(int tate, int yoko);
//*****************************************************************************
// グローバル変数
//*****************************************************************************
 
static LPDIRECT3DTEXTURE9		Texture_Block = NULL;					// テクスチャへのポリゴン

static D3DXVECTOR3				Old_Y;


static TUTOBLOCK tuto_block[TUTOBLOCK_MAX];


int tuto_mapdata[TUTO_MAX_HEIGHT][TUTO_MAX_WIDTH] = {

	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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
	0,0,0,0,0,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,0,
	1,1,1,1,1,1,1,1,1,1,1,1,1,1,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,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,0,0,0,0,0,0,0,0,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

};


//
//RECT rcMapChip[MAX_HEIGHT*MAX_WIDTH];			//表示する矩形のセット

//=============================================================================
// 初期化処理
//=============================================================================
HRESULT InitTutoBlock(int type)
{
	TUTOBLOCK *tuto_block = GetTutoBlock(0);
	PLAYER *player = GetPlayer(0);
	LPDIRECT3DDEVICE9 pDevice = GetDevice();


	if (type == 0)
	{
		// テクスチャの読み込み
		D3DXCreateTextureFromFile(pDevice,			// デバイスのポインタ
			TEXTURE_TUTO_BLOCK,						// ファイルの名前
			&Texture_Block);							// 読み込むメモリのポインタ
	}
	
	//
	tuto_block->bmap_pos = D3DXVECTOR3(0.0f,0.0f, 0.0f);		//ウインドウの左上
	tuto_block->scr = D3DXVECTOR3(0.0f, 0.0f, 0.0f);		//ウインドウの左上

	tuto_block->Old_X=D3DXVECTOR3(0.0f, 0.0f, 0.0f);
	Old_Y = D3DXVECTOR3(0.0f, 0.0f, 0.0f);


	tuto_block->Texture_Tuto_Block = Texture_Block;

	// 頂点情報の作成	ポリゴンの頂点
	MakeVertexTutoBlock();
	return S_OK;
}

//=============================================================================
// 終了処理
//=============================================================================
void UninitTutoBlock(void)
{
	if (Texture_Block != NULL)
	{
		// テクスチャの開放
		Texture_Block->Release();
		Texture_Block = NULL;
	}
}

//=============================================================================
// 描画処理
//=============================================================================
void DrawTutoBlock(void)
{
	PLAYER *player = GetPlayer(0);
	TUTOBLOCK *tuto_block = GetTutoBlock(0);
	LPDIRECT3DDEVICE9 pDevice = GetDevice();


	//マップを描く
		for (int i = 0; i < TUTO_MAX_HEIGHT; i++)
		{
			for (int j = 0; j < TUTO_MAX_WIDTH; j++)
			{
	
				switch (tuto_mapdata[i][j])
				{
				case 0:
					break;

				case 1:
					// 頂点フォーマットの設定
					pDevice->SetFVF(FVF_VERTEX_2D);
					// テクスチャの設定 テクスチャ―に張り付ける テクスチャを切り替えながら張り付ける
					pDevice->SetTexture(0, tuto_block->Texture_Tuto_Block);
					tuto_block->bmap_pos = tuto_possize(i, j);
					//SetBB((int)tuto_block->bmap_pos.x, (int)tuto_block->bmap_pos.y);
					Setbb();
					SetVertexTutoBlock();
					// ポリゴンの描画
					pDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, NUM_BLOCK, tuto_block->vertexWk_Block, sizeof(VERTEX_2D));

					break;

				}
			}
		}

	
}

D3DXVECTOR3 tuto_possize(int tate, int yoko)
{
	return D3DXVECTOR3((FLOAT)yoko * 32, (FLOAT)tate * 32, 0);
}

//=============================================================================
// 頂点の作成
//=============================================================================
HRESULT MakeVertexTutoBlock(void)
{
	TUTOBLOCK *tuto_block = GetTutoBlock(0);
	LPDIRECT3DDEVICE9 pDevice = GetDevice();

	// 頂点座標の設定
	//tuto_block->vertexWk_Block[0].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x, tuto_block->bmap_pos.y, tuto_block->bmap_pos.z) + tuto_block->scr;
	//tuto_block->vertexWk_Block[1].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x + BOSS_BLOCK_X, tuto_block->bmap_pos.y, tuto_block->bmap_pos.z) + tuto_block->scr;
	//tuto_block->vertexWk_Block[2].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x, tuto_block->bmap_pos.y + BOSS_BOSS_BLOCK_Y, tuto_block->bmap_pos.z) + tuto_block->scr;
	//tuto_block->vertexWk_Block[3].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x + BOSS_BLOCK_X, tuto_block->bmap_pos.y + BOSS_BOSS_BLOCK_Y, tuto_block->bmap_pos.z) + tuto_block->scr;

	tuto_block->vertexWk_Block[0].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x, tuto_block->bmap_pos.y, tuto_block->bmap_pos.z);
	tuto_block->vertexWk_Block[1].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x + TUTOBLOCK_X, tuto_block->bmap_pos.y, tuto_block->bmap_pos.z);
	tuto_block->vertexWk_Block[2].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x, tuto_block->bmap_pos.y + TUTOBLOCK_Y, tuto_block->bmap_pos.z);
	tuto_block->vertexWk_Block[3].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x + TUTOBLOCK_X, tuto_block->bmap_pos.y + TUTOBLOCK_Y, tuto_block->bmap_pos.z);

	// rhwの設定 表示順位
	tuto_block->vertexWk_Block[0].rhw =
	tuto_block->vertexWk_Block[1].rhw =
	tuto_block->vertexWk_Block[2].rhw =
	tuto_block->vertexWk_Block[3].rhw = 1.0f;

	// 反射光の設定
	tuto_block->vertexWk_Block[0].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
	tuto_block->vertexWk_Block[1].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
	tuto_block->vertexWk_Block[2].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);
	tuto_block->vertexWk_Block[3].diffuse = D3DCOLOR_RGBA(255, 255, 255, 255);

	// テクスチャ座標の設定
	tuto_block->vertexWk_Block[0].tex = D3DXVECTOR2(0.0f, 0.0f);
	tuto_block->vertexWk_Block[1].tex = D3DXVECTOR2(1.0f, 0.0f);
	tuto_block->vertexWk_Block[2].tex = D3DXVECTOR2(0.0f, 1.0f);
	tuto_block->vertexWk_Block[3].tex = D3DXVECTOR2(1.0f, 1.0f);


	return S_OK;
}

//=============================================================================
// 頂点座標の設定
//=============================================================================
void SetVertexTutoBlock(void)
{
	PLAYER *player = GetPlayer(0);

	TUTOBLOCK *block = GetTutoBlock(0);

	// 頂点座標の設定
	tuto_block->vertexWk_Block[0].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x, tuto_block->bmap_pos.y, tuto_block->bmap_pos.z);
	tuto_block->vertexWk_Block[1].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x + TUTOBLOCK_X, tuto_block->bmap_pos.y, tuto_block->bmap_pos.z);
	tuto_block->vertexWk_Block[2].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x, tuto_block->bmap_pos.y + TUTOBLOCK_Y, tuto_block->bmap_pos.z);
	tuto_block->vertexWk_Block[3].vtx = D3DXVECTOR3(tuto_block->bmap_pos.x + TUTOBLOCK_X, tuto_block->bmap_pos.y + TUTOBLOCK_Y, tuto_block->bmap_pos.z);

}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#2

投稿記事 by みけCAT » 5年前

具体的にどのようなことにこまっているか教えていただけますか?

以下、フォーラムルールより転載
「うまくいきません」という質問は大抵回答に困ります。

1. 自分は今何がしたくて
2. どう取り組んで(作ったプログラムはどれで
3. どのようなエラーやトラブルで困っていて
4. 自分は何が解らないのか、知りたいのか
5. 今のCの知識はどの程度なのか

この5点をしっかりと明記して下さい。

環境に依存する場合やライブラリを使っているときは
使っているOS名・コンパイラ名・ライブラリ名も明記しましょう。

コンパイルエラーの質問時は必ず最低限のエラーメッセージも書きましょう。
「ゲーム作っているのですが、うまく作れません」
「コンパイルしたのですが、うまくコンパイルできません」
この手の質問はよく回答に困ります。
しっかり取り組んだことと、何に困っているか、自分の理解レベルはどれ位なのかを明確にして下さい。
コンパイルエラーの質問の場合、エラーメッセージをコピペするのは最重要です。

■悪い質問例■
○○を作っているのですが、うまく作れません。どうしたらいいでしょうか?

■良い質問例■
今回は○○について質問をします。
今私は○○の宿題に取り組んでいて、詳細の仕様は○○のようになっています(1)。
今わかる範囲でこのプログラム(ソースコードの提示)まで書いてみたのですが(2)、
○○というコンパイルエラーが出て原因が解らず困っています(3)。
今知りたいのはこのエラーの原因と、○○の実装の仕方についてです。(4)
(今学校で○○について習っているところですが、○○についてはよくわかりません。(5))

質問の最初にその質問がどんな質問であるかその要旨を簡潔に書くと読み易いでしょう。

また、OSやコンパイラによってもC言語の実装の仕方が違う場合がありますから、
明らかに不必要ではない限り使用しているOSやコンパイラ名も一緒に書いて下さい。
オフトピック
これは「うまくいきません」という質問ではない、ということには目をつむってください…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

kurou
記事: 4
登録日時: 5年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#3

投稿記事 by kurou » 5年前

失礼しました
プログラムを学び始めて5か月です
いまは就職作品をDirectXの2Dで制作中です
困っているところはマップとの当たり判定です
マップに乗ることはできるのですが壁の判定がうまくいかず困っています

上のソースが二次元配列を使ったマップのコードです。

知りたい内容はマップチップとプレイヤーの当たり判定です

littlestream
記事: 48
登録日時: 7年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#4

投稿記事 by littlestream » 5年前

まずは、tuto_mapdata[TUTO_MAX_HEIGHT][TUTO_MAX_WIDTH] 内のマップデータを指定の座標から
取得する関数を何を参考にしてもいいので作ってみてください。そして取得した元の座標を小さなポリゴンでも画像
でもいいので(自分だったら円を描画命令で描く)描画してください。
そうすることにより、どこが判定中なのか丸わかりだと思うのです。

ちなみにマップデータの取得方法を日本語で書きます。
int マップデータを取得する関数func(int 調べたいX座標,調べたいY座標)
{
サイズ=マップチップのサイズ;
return tuto_mapdata[(小数部切り捨て)調べたいY座標/サイズ][(小数部切り捨て)調べたいX座標/サイズ];
}
またマップチップとプレイヤーキャラクターの当たり判定は
ほとんど決まったやり方が確立したようなものなのですが何故か自作しようとする人も多い問題です。
自分のやり方はプレイヤーキャラクタがマップに当たったらという判定をプレイヤーキャラクターの
右上、左上、右下、左下にかけておこないます。まず、
マップの上に当たる可能性があるなら右上と左上を調べる、
マップの下に当たる可能性があるなら右下と左下を調べる、
マップの左に当たる可能性があるなら左上と左下を調べる、
マップの右に当たる可能性があるなら右上と右下を調べる処理を行っています。

そしてマップが当たったら、座標の補正を行います。
-------------------------------------------------------
方向|補正処理
上 |プレイヤーのY座標=(小数点部切り捨て)(プレイヤーのY座標/マップチップのサイズ+1)*マップチップのサイズ
左 |プレイヤーのX座標=(小数点部切り捨て)(プレイヤーのX座標/マップチップのサイズ+1)*マップチップのサイズ
右 |プレイヤーのX座標=(小数点部切り捨て)(プレイヤーのX座標/マップチップのサイズ)*マップチップのサイズ
下 |プレイヤーのX座標=(小数点部切り捨て)(プレイヤーのX座標/マップチップのサイズ)*マップチップのサイズ

実際には処理の順番がいろいろと変わってきますが、基本はその方向に動かしたらその方向への当たり判定を
すぐ下に書く事です。

littlestream
記事: 48
登録日時: 7年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#5

投稿記事 by littlestream » 5年前

下方向に補正する場合、Y座標=(小数切り捨て)(Y座標/マップチップのサイズ)*マップチップのサイズ
にしてください。入力した文章が間違えてました。すみません。

kurou
記事: 4
登録日時: 5年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#6

投稿記事 by kurou » 5年前

取得する関数は作ったのですがそれを使った当たり判定の条件をどう書いていいのか困っています。
作った取得関数はこちらです

コード:


//マップデータの取得関数
int GetMapData(int px, int py)
{
	int size = TUTOBLOCK_SIZE;

	return tuto_mapdata[py / size][px/ size];
}

littlestream
記事: 48
登録日時: 7年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#7

投稿記事 by littlestream » 5年前

まず、ジャンプではない事から考えると良いです。
上に移動するボタンが押されたらプレイヤーキャラクターの座標が(pcx,pcy)という
左上に取られた場合、

コード:

pcw=プレイヤーキャラクターの幅;
pch=プレイヤーキャラクターの高さ;
size=マップチップの大きさ;
もしも上ボタンが押されたら
{
  if( (GetMapData(pcx,pcy)!=0 || GetMapData(pcx+pcw-1,pcy)!=0)
  //左上と右上をチェックする
  {
    pcy=(pcy/size+1)/size;
  }
}
もしも下ボタンが押されたら
{
  if( (GetMapData(pcx,pcy+pch-1)!=0 || GetMapData(pcx+pcw-1,pcy+pch-1)!=0)
  //左下と右下をチェックする
  {
    pcy=(pcy/size)/size;
  }
}
//これを左と右にも適応する

littlestream
記事: 48
登録日時: 7年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#8

投稿記事 by littlestream » 5年前

これは少しこちらも勘違いしてましたが、上ボタンが押されたら上、下ボタンが押されたら下に移動する事
を当たり判定のチェック前に行ってください。もちろん、左ボタンが押されたら左に移動し、当たり判定をチェック
し、右ボタンが押されたら右に移動し、当たり判定をチェックしてください。もう十分なほどヒントは
与えたはずです。

kurou
記事: 4
登録日時: 5年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#9

投稿記事 by kurou » 5年前

丁寧にありがとうございました
おかげでできました。
まだプログラムを始めて6か月しかたっていないので理解できていないとおころもありお手数おかけして申し訳ありませんでした。これからいろいろいじって理解していこうと思いますありがとうございました。

littlestream
記事: 48
登録日時: 7年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#10

投稿記事 by littlestream » 5年前

とりあえず、残った自分の用意した答えを示します。今後のこの記事が役に立つためです。

上と下は辺り判定が良いとして、
左と右ですね。

コード:

if(左が押されたら)
{
  左に移動
  if(GetMapData(pcx,pcy)!=0 || GetMapData(pcx,pcy+pch-1)!=0)
  {//左上と左下を調べる
    size=マップチップのサイズ;
    pcx=(pcx*size+1)*size;//補正
  }
}
if(右が押されたら)
{
  右に移動
  if(GetMapData(pcx+pcw-1,pcy)!=0 || GetMapData(pcx+pcw-1,pcy+pch-1)!=0)
  {//右上と右下を調べる
    size=マップチップのサイズ;
    pcx=(pcx*size)*size;//補正
  }
}
あとはジャンプですね。これは、上と下の当たり判定を全部上書きしてください。

コード:

  if(ジャンプボタンが押された瞬間があったら && ジャンプフラグが0なら(falseなら))
  {
    ジャンプフラグを1にする(trueでも可);
    ジャンプ力を-5(ここら辺は実験が必要);
  }
  
  pcy+=ジャンプ力;
  int Bottom1=GetMapData(pcx,pcy+pch);
  int Bottom2=GetMapData(pcx+pcw-1,pcy+pch);

  if(ジャンプフラグが0なら &&  Bottom1==0 && Bottom2)
  {
    ジャンプフラグを1にする;
  }
if(ジャンプフラグが1なら)
{
  ジャンプ力=ジャンプ力+0.06;
  if( (GetMapData(pcx,pcy)!=0 || GetMapData(pcx+pcw-1,pcy)!=0)
  //左上と右上をチェックする(上をチェック)
  {
    pcy=(pcy/size+1)/size;
    ジャンプ力を0にする;
  }
  if( (GetMapData(pcx,pcy+pch-1)!=0 || GetMapData(pcx+pcw-1,pcy+pch-1)!=0)
  //左下と右下をチェックする(下をチェック)
  {
    pcy=(pcy/size)/size;
    ジャンプフラグを0にする(falseでも可);
    ジャンプ力を0にする
  }
}

littlestream
記事: 48
登録日時: 7年前

Re: Dxlibで二次元配列のマップチップとの当たり判定について

#11

投稿記事 by littlestream » 5年前

Bottom2で判定しているところはBottom2==0の条件付きですね。
つまり正しくは
if(ジャンプフラグが0なら && Bottom1==0 && Bottom2==0)です。

返信

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