最速怪談選手権

現在direct3dでフライトゲームを作っており、当たり判定部分を考えているのですがうまくいきません。メタセコイアでxファイルを作成し、ビルボードで表示している(敵も自弾も)のですが、そもそも基準点はどこに来るのか、プログラム上で指定する縦横高さがわからないなど当たり判定以前の問題のような気もするのですが・・・。とりあえず、該当部分のコードを載せるのでご享受お願いします。

↓ゲームメインの攻撃部分↓
if(GetKeyboardTrigger(DIK_Z)){
_for(int i = 0; i < ATTACKNUM; i++){
__if( man_bullet[i].flag.bullet == 0){
___man_bullet[i].flag.bullet = 1;
___//自機の座標セット
___mat_world[15+i]._41 = mat_world[0]._41;
___mat_world[15+i]._42 = mat_world[0]._42+2;
___mat_world[15+i]._43 = mat_world[0]._43;
___break;
__}
_}
}
for(int i = 0; i < ATTACKNUM; i++){
_if(man_bullet[i].flag.bullet == 1){
__mat_world[15+i]._43 ++;
__man_bullet[i].cnt.bullet++;
__if(man_bullet[i].cnt.bullet >= 100){
___man_bullet[i].flag.bullet = 0;
___man_bullet[i].cnt.bullet = 0;
___mat_world[15+i]._42 = -100;
__}
__for(int j = 0; j < ENEMYNUM; j++){
___man_bullet[i].flag.atk_result =
___Hit_Judging(&mat_world[5+j]._41, &mat_world[5+j]._42, &mat_world[5+j]._43,
________enemy[j].x, enemy[j].y, enemy[j].z,
________&mat_world[15+i]._41 , &mat_world[15+i]._42, &mat_world[15+i]._43,
________man_bullet[i].x, man_bullet[i].y, man_bullet[i].z );
___if(man_bullet[i].flag.atk_result == 1){
____man_bullet[i].flag.atk_result = 0;
____man_bullet[i].flag.bullet = 0;
____man_bullet[i].cnt.bullet = 0;
____mat_world[5+j]._43 = 150;
____mat_world[15+i]._42 = -100;
____break;
___}
__}
_}
}

↓当たり判定部分↓
int Hit_Judging( float *xpos1 , float *ypos1 , float *zpos1 ,
________float x1, float y1, float z1,
________float *xpos2 , float *ypos2 , float *zpos2 ,
________float x2, float y2, float z2 )
{
_for(int i = 0; i < ATTACKNUM; i++){
__if(man_bullet[i].flag.bullet == 1){
___for(int j = 0; j < ENEMYNUM; j++){
____if( ((xpos1[j] - (x1/2) ) < (xpos2[i] + (x2/2) ) &&
______(xpos1[j] + (x1/2) ) > (xpos2[i] - (x2/2) )) &&
______((ypos1[j] + y1 ) < ypos2[i] && ypos1[j] > (ypos2[i] + y2 )) &&
_______(zpos1[j] == zpos2[i]) ){
_____return 1;
____}else
_____return 0;
___}
__}
_}

A 回答 (1件)

この一部のコードだけ見ても何ともコメントできません。

クラスや変数の役割は分からないですし、「15+i」などのハードコーディングの意味も分かりませんので。

ただ一般的な当たり判定の話をすると、「球体当たり判定」が一番簡単で高速です。2つの物体の距離を求めて、その距離が一定以下なら当たりと判定する方法です。

参考までに2点の距離を求める関数を載せておきます。

FLOAT FindDistance(const D3DVECTOR& v1, const D3DVECTOR& v2)
{
FLOAT dx = v2.x - v1.x;
FLOAT dy = v2.y - v1.y;
FLOAT dz = v2.z - v1.z;
return sqrtf(dx*dx + dy*dy + dz*dz);
}
    • good
    • 0
この回答へのお礼

>この一部のコードだけ見ても何ともコメントできません。クラスや変数の役割は分からないですし、
>「15+i」などのハードコーディングの意味も分かりませんので。

言われてみればそうですね。すみませんでした。ご迷惑をおかけしました

お礼日時:2012/01/14 00:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!