在游戏如何让程序知道物体在撞墙?
可通过无题所在点的位置和墙体边缘的位置进行检测。
计算方法是:用中心坐标和朝向所对应的墙的位置与物体的宽度进行比较,若是大于宽度,则没有碰上。
将地图分为若干个小的正方形格子,物体到每一个格子后进行碰撞检测。
碰撞检测函数是在"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