我正在重建经典游戏小行星,我在使碰撞检测正常工作时遇到了一些问题.目前,下面的代码运行良好,但由于某种原因,它只会检测最后一枚已经发射的导弹上的碰撞.我的意思是,如果我在一颗静止的小行星上直线发射3枚导弹,前两颗将穿过小行星,而只有最后一颗将与它碰撞并按预期行动.我不太清楚为什么会这样,但我认为这与迭代导弹列表有关.
这是用于检测冲突的部分工作函数:
void checkMissileAsteroidCollision(struct particle *ast, struct particle *mis)
{
float missileX = 0;
float missileY = 0;
float asteroidX = 0;
float asteroidY = 0;
float asteroidSize = 0;
for( ; mis ; mis = mis->next )
{
missileX = mis->x;
missileY = mis->y;
for( ; ast ; ast = ast->next)
{
asteroidX = ast->x;
asteroidY = ast->y;
asteroidSize = ast->size;
if(missileX < asteroidX + asteroidSize &&
missileX > asteroidX &&
missileY < asteroidY + asteroidSize &&
missileY > asteroidY && mis->draw == 1 && ast->draw == 1)
{
collisionCounter++;
ast->draw = 0;
mis->draw = 0;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
粒子结构;
typedef struct particle{
float x;
float y;
float vx;
float vy;
float heading;
float dur;
int size;
int draw;
struct particle *next;
} node_t;
Run Code Online (Sandbox Code Playgroud)
我已经在下面链接了两个链接到整个源文件及其代码来自的标题,以防需要任何其他信息来弄清楚为什么会发生这种情况.
gamestate.cpp:https://gist.github.com/Jakemangan/d286ef1f9159e6682778ec2e0daf516c
gamestate.h:https://gist.github.com/Jakemangan/6c3788a46825a86cd0e2642864fcad68
for( ; ast ; ast = ast->next)
Run Code Online (Sandbox Code Playgroud)
这条线就是问题所在.在此循环终止后,ast为null但不会为外mis循环的下一次迭代重置.这意味着只有mis循环的第一次迭代才能实际看到任何小行星.
要更正此问题,请为此循环声明一个新变量:
for(struct particle *ast2 = ast ; ast2 ; ast2 = ast2->next)
Run Code Online (Sandbox Code Playgroud)
(或选择比一个更好的名字ast2.)然后,很明显,更换ast用ast2的循环体.
| 归档时间: |
|
| 查看次数: |
164 次 |
| 最近记录: |