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);
}
Dxlibで二次元配列のマップチップとの当たり判定について
Dxlibで二次元配列のマップチップとの当たり判定について
今directxの2dでゲームを作っているのですが二次元配列のマップチップとの当たり判定にこまっています教えてください。よろしくお願いします。
Re: Dxlibで二次元配列のマップチップとの当たり判定について
具体的にどのようなことにこまっているか教えていただけますか?
以下、フォーラムルールより転載
以下、フォーラムルールより転載
「うまくいきません」という質問は大抵回答に困ります。
1. 自分は今何がしたくて
2. どう取り組んで(作ったプログラムはどれで
3. どのようなエラーやトラブルで困っていて
4. 自分は何が解らないのか、知りたいのか
5. 今のCの知識はどの程度なのか
この5点をしっかりと明記して下さい。
環境に依存する場合やライブラリを使っているときは
使っているOS名・コンパイラ名・ライブラリ名も明記しましょう。
コンパイルエラーの質問時は必ず最低限のエラーメッセージも書きましょう。
「ゲーム作っているのですが、うまく作れません」
「コンパイルしたのですが、うまくコンパイルできません」
この手の質問はよく回答に困ります。
しっかり取り組んだことと、何に困っているか、自分の理解レベルはどれ位なのかを明確にして下さい。
コンパイルエラーの質問の場合、エラーメッセージをコピペするのは最重要です。
■悪い質問例■
○○を作っているのですが、うまく作れません。どうしたらいいでしょうか?
■良い質問例■
今回は○○について質問をします。
今私は○○の宿題に取り組んでいて、詳細の仕様は○○のようになっています(1)。
今わかる範囲でこのプログラム(ソースコードの提示)まで書いてみたのですが(2)、
○○というコンパイルエラーが出て原因が解らず困っています(3)。
今知りたいのはこのエラーの原因と、○○の実装の仕方についてです。(4)
(今学校で○○について習っているところですが、○○についてはよくわかりません。(5))
質問の最初にその質問がどんな質問であるかその要旨を簡潔に書くと読み易いでしょう。
また、OSやコンパイラによってもC言語の実装の仕方が違う場合がありますから、
明らかに不必要ではない限り使用しているOSやコンパイラ名も一緒に書いて下さい。
オフトピック
これは「うまくいきません」という質問ではない、ということには目をつむってください…
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: Dxlibで二次元配列のマップチップとの当たり判定について
失礼しました
プログラムを学び始めて5か月です
いまは就職作品をDirectXの2Dで制作中です
困っているところはマップとの当たり判定です
マップに乗ることはできるのですが壁の判定がうまくいかず困っています
上のソースが二次元配列を使ったマップのコードです。
知りたい内容はマップチップとプレイヤーの当たり判定です
プログラムを学び始めて5か月です
いまは就職作品をDirectXの2Dで制作中です
困っているところはマップとの当たり判定です
マップに乗ることはできるのですが壁の判定がうまくいかず困っています
上のソースが二次元配列を使ったマップのコードです。
知りたい内容はマップチップとプレイヤーの当たり判定です
-
- 記事: 48
- 登録日時: 7年前
Re: Dxlibで二次元配列のマップチップとの当たり判定について
まずは、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座標/マップチップのサイズ)*マップチップのサイズ
実際には処理の順番がいろいろと変わってきますが、基本はその方向に動かしたらその方向への当たり判定を
すぐ下に書く事です。
取得する関数を何を参考にしてもいいので作ってみてください。そして取得した元の座標を小さなポリゴンでも画像
でもいいので(自分だったら円を描画命令で描く)描画してください。
そうすることにより、どこが判定中なのか丸わかりだと思うのです。
ちなみにマップデータの取得方法を日本語で書きます。
int マップデータを取得する関数func(int 調べたいX座標,調べたいY座標)
{
サイズ=マップチップのサイズ;
return tuto_mapdata[(小数部切り捨て)調べたいY座標/サイズ][(小数部切り捨て)調べたいX座標/サイズ];
}
またマップチップとプレイヤーキャラクターの当たり判定は
ほとんど決まったやり方が確立したようなものなのですが何故か自作しようとする人も多い問題です。
自分のやり方はプレイヤーキャラクタがマップに当たったらという判定をプレイヤーキャラクターの
右上、左上、右下、左下にかけておこないます。まず、
マップの上に当たる可能性があるなら右上と左上を調べる、
マップの下に当たる可能性があるなら右下と左下を調べる、
マップの左に当たる可能性があるなら左上と左下を調べる、
マップの右に当たる可能性があるなら右上と右下を調べる処理を行っています。
そしてマップが当たったら、座標の補正を行います。
-------------------------------------------------------
方向|補正処理
上 |プレイヤーのY座標=(小数点部切り捨て)(プレイヤーのY座標/マップチップのサイズ+1)*マップチップのサイズ
左 |プレイヤーのX座標=(小数点部切り捨て)(プレイヤーのX座標/マップチップのサイズ+1)*マップチップのサイズ
右 |プレイヤーのX座標=(小数点部切り捨て)(プレイヤーのX座標/マップチップのサイズ)*マップチップのサイズ
下 |プレイヤーのX座標=(小数点部切り捨て)(プレイヤーのX座標/マップチップのサイズ)*マップチップのサイズ
実際には処理の順番がいろいろと変わってきますが、基本はその方向に動かしたらその方向への当たり判定を
すぐ下に書く事です。
-
- 記事: 48
- 登録日時: 7年前
Re: Dxlibで二次元配列のマップチップとの当たり判定について
下方向に補正する場合、Y座標=(小数切り捨て)(Y座標/マップチップのサイズ)*マップチップのサイズ
にしてください。入力した文章が間違えてました。すみません。
にしてください。入力した文章が間違えてました。すみません。
-
- 記事: 48
- 登録日時: 7年前
Re: Dxlibで二次元配列のマップチップとの当たり判定について
まず、ジャンプではない事から考えると良いです。
上に移動するボタンが押されたらプレイヤーキャラクターの座標が(pcx,pcy)という
左上に取られた場合、
上に移動するボタンが押されたらプレイヤーキャラクターの座標が(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;
}
}
//これを左と右にも適応する
-
- 記事: 48
- 登録日時: 7年前
Re: Dxlibで二次元配列のマップチップとの当たり判定について
これは少しこちらも勘違いしてましたが、上ボタンが押されたら上、下ボタンが押されたら下に移動する事
を当たり判定のチェック前に行ってください。もちろん、左ボタンが押されたら左に移動し、当たり判定をチェック
し、右ボタンが押されたら右に移動し、当たり判定をチェックしてください。もう十分なほどヒントは
与えたはずです。
を当たり判定のチェック前に行ってください。もちろん、左ボタンが押されたら左に移動し、当たり判定をチェック
し、右ボタンが押されたら右に移動し、当たり判定をチェックしてください。もう十分なほどヒントは
与えたはずです。
Re: Dxlibで二次元配列のマップチップとの当たり判定について
丁寧にありがとうございました
おかげでできました。
まだプログラムを始めて6か月しかたっていないので理解できていないとおころもありお手数おかけして申し訳ありませんでした。これからいろいろいじって理解していこうと思いますありがとうございました。
おかげでできました。
まだプログラムを始めて6か月しかたっていないので理解できていないとおころもありお手数おかけして申し訳ありませんでした。これからいろいろいじって理解していこうと思いますありがとうございました。
-
- 記事: 48
- 登録日時: 7年前
Re: Dxlibで二次元配列のマップチップとの当たり判定について
とりあえず、残った自分の用意した答えを示します。今後のこの記事が役に立つためです。
上と下は辺り判定が良いとして、
左と右ですね。
あとはジャンプですね。これは、上と下の当たり判定を全部上書きしてください。
上と下は辺り判定が良いとして、
左と右ですね。
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にする
}
}
-
- 記事: 48
- 登録日時: 7年前
Re: Dxlibで二次元配列のマップチップとの当たり判定について
Bottom2で判定しているところはBottom2==0の条件付きですね。
つまり正しくは
if(ジャンプフラグが0なら && Bottom1==0 && Bottom2==0)です。
つまり正しくは
if(ジャンプフラグが0なら && Bottom1==0 && Bottom2==0)です。