C++游戏导弹碰撞检测

1 c++ detection collision

我正在重建经典游戏小行星,我在使碰撞检测正常工作时遇到了一些问题.目前,下面的代码运行良好,但由于某种原因,它只会检测最后一枚已经发射的导弹上的碰撞.我的意思是,如果我在一颗静止的小行星上直线发射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

cdh*_*wie 5

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.)然后,很明显,更换astast2的循环体.