|
|
这个是我做的坦克大战的碰撞检测代码,但是敌人与敌人的检测有问题,运行时敌人经常重叠卡在一起,希望高手能帮我指出错误在那里
BOOL game::CheckAABB(int AMinX, int AMaxX,int AMinY, int AMaxY, int BMinX, int BMaxX, int BMinY, int BMaxY)
{
if(AMaxX<BMinX)
return false;
if(AMinX>BMaxX)
return false;
if(AMaxY<BMinY)
return false;
if(AMinY>BMaxY)
return false;
return true;
}
///Enemy与地图的碰撞
BOOL game:: Enemyblock(int x, int y)
{
bool block = false;
for(int i=0; i<MAXX; i++)
{
for(int j=0; j<MAXY; j++)
{
if(gameMap[j] > 1)
{
if(CheckAABB(x, x+28, y, y+28, j*16+10,j*16+16+10, i*16+20,i*16+16+20) )
{
block = true;
break;
}
}
}
if(block)
break;
}
return block;
};
///Enemy与Enemy的碰撞
BOOL game:: EnemyandEnemy(struct_EnemyTank *pETank)
{
bool block = false;
struct_EnemyTank *pETank2;
POSITION pos=manager.listEnemyTank.GetHead();
while(pos)
{
pETank2 = (struct_EnemyTank*)manager.listEnemyTank.GetAt(pos);
if(pETank!=pETank2)
{
switch(pETank->Directry)
{
case 0:
if(CheckAABB(pETank-> os.x, pETank->Pos.x+28, pETank->Pos.y-pETank->v, pETank->Pos.y+28-pETank->v, pETank2->Pos.x,pETank2->Pos.x, pETank2->Pos.y,pETank2->Pos.y) )
{
block = true;
break;
}break;
case 1:
if(CheckAABB(pETank->Pos.x+pETank->v, pETank->Pos.x+pETank->v+28, pETank->Pos.y, pETank->Pos.y+28, pETank2->Pos.x,pETank2->Pos.x, pETank2->Pos.y,pETank2->Pos.y) )
{
block = true;
break;
}break;
case 2:
if(CheckAABB(pETank->Pos.x, pETank->Pos.x+28, pETank->Pos.y+pETank->v, pETank->Pos.y+28+pETank->v, pETank2->Pos.x,pETank2->Pos.x, pETank2->Pos.y,pETank2->Pos.y) )
{
block = true;
break;
}break;
case 3:
if(CheckAABB(pETank->Pos.x-pETank->v, pETank->Pos.x-pETank->v+28, pETank->Pos.y, pETank->Pos.y+28, pETank2->Pos.x,pETank2->Pos.x, pETank2->Pos.y,pETank2->Pos.y) )
{
block = true;
break;
}break;
}
}
pos=manager.listEnemyBullet.GetNext(pos);
if(block)
break;
}
return block;
};
//===================================
//描述: 控制敌方的坦克的行动
//====================================
int game::MoveETank()
{
DWORD nt=GetTickCount();
POINT np;
POSITION pos;
struct_EnemyTank *pETank;
pos=manager.listEnemyTank.GetHead();
while(pos)
{
pETank=(struct_EnemyTank*)manager.listEnemyTank.GetAt(pos);
switch (pETank->Directry)
{
case 0:
{
if( !Enemyblock( pETank->Pos.x, pETank->Pos.y - pETank->v )))///有碰撞就转方向
{
if(!EnemyandEnemy(pETank))
{
pETank->Pos.y -= pETank->v;
}
if( pETank->Pos.y - pETank->v < 20 )///碰到边境就转方向
{
pETank->Pos.y = 20;
pETank->Directry = rand()%4;
}
}
else
{
pETank->Directry = rand()%4;
}
}
break;
case 1:
{
if( !Enemyblock( pETank->Pos.x + pETank->v , pETank->Pos.y )&&!EnemyandEnemy(pETank))
{
if(!EnemyandEnemy(pETank))
{
pETank->Pos.x += pETank->v;
}
if( pETank->Pos.x + pETank->v > 398 )
{
pETank->Pos.x = 398;
pETank->Directry = rand()%4;
}
}
else
{
pETank->Directry = rand()%4;
}
}
break;
case 2:
{
if( !Enemyblock( pETank->Pos.x, pETank->Pos.y + pETank->v )&&!EnemyandEnemy(pETank))
{
if(!EnemyandEnemy(pETank))
{
pETank->Pos.y += pETank->v;
}
if( pETank->Pos.y + pETank->v > 408 )
{
pETank->Pos.y = 408;
pETank->Directry = rand()%4;
}
}
else
{
pETank->Directry = rand()%4;
}
}
break;
case 3:
{
if( !Enemyblock( pETank->Pos.x - pETank->v, pETank->Pos.y )&&!EnemyandEnemy(pETank))
{
if(!EnemyandEnemy(pETank))
{
pETank->Pos.x -= pETank->v;
}
if( pETank->Pos.x - pETank->v < 10 )
{
pETank->Pos.x = 10;
pETank->Directry = rand()%4;
}
}
else
{
pETank->Directry = rand()%4;
}
}
break;
}
pos=manager.listEnemyBullet.GetNext(pos);
DisplayETank(pETank);
}
return 1;
}
|
|