在游戏如何让程序知道物体在撞墙?
可通过无题所在点的位置和墙体边缘的位置进行检测。
计算方法是:用中心坐标和朝向所对应的墙的位置与物体的宽度进行比较,若是大于宽度,则没有碰上。
将地图分为若干个小的正方形格子,物体到每一个格子后进行碰撞检测。
碰撞检测函数是在"GObject.h"的Collision()函数中,这是一个bool型函数。
bool GObject::Collision()
{
bool b = false;
AchiveCtrl();//更新行列的数据
if (dArray<0 || dRow<0 || dArray>MAPLENTH || dRow>MAPLENTH)
{
b = true;
}
else if (Achive())
{
switch (twCommand)
{
case LEFT:
if (dArray > 0 && !pStage->mapData[dRow][dArray - 1])
{
b = true;
}
break;
case RIGHT:
if (dArray < MAPLENTH - 1 && !pStage->mapData[dRow][dArray + 1])
{
b = true;
}
break;
case UP:
if (dRow>0 && !pStage->mapData[dRow - 1][dArray])
{
b = true;
}
break;
case DOWN:
if (dRow < MAPLENTH - 1 && !pStage->mapData[dRow + 1][dArray])
{
b = true;
}
break;
}
if (!b)
{
tw = twCommand;//没撞墙,指令成功
}
}
mX = point.x;
mY = point.y;
int MAX = pStage->LD*MAPLENTH + pStage->LD / 2;
int MIN = pStage->LD / 2;
switch (tw)
{
case LEFT:
if (dArray > 0 && !pStage->mapData[dRow][dArray - 1])
{
b = true;//撞墙了
break;
}
if (point.x < MIN)
{
point.x = MAX;
}
point.x -= speed;
break;
case RIGHT:
if (dArray < MAPLENTH - 1 && !pStage->mapData[dRow][dArray + 1])
{
b = true;//撞墙了
break;
}
point.x += speed;
if (point.x >MAX)
{
point.x = MIN;
}
break;
case UP:
if (dRow>0 && !pStage->mapData[dRow - 1][dArray])
{
b = true;//撞墙了
break;
}
if (point.y < MIN)
{
point.y = MAX;
}
point.y -= speed;
break;
case DOWN:
if (dRow < MAPLENTH - 1 && !pStage->mapData[dRow + 1][dArray])
{
b = true;
break;
}
point.y += speed;
if (point.y >MAX)
{
point.y = MIN;
}
break;
}
return b;
}
@ Mayuko