碰撞2D - 检测侧面

时间:2014-06-13 07:52:10

标签: c 2d sdl sprite graphic

我正在使用我的破砖机并制作一个合适的碰撞系统,以便在逻辑上使球切换方向,我必须检测球撞到哪一侧砖。 这是我目前的剧本:

int sprite_collide(const Sprite item1, const Sprite item2)
{
    if(item1.sShow == 0 || item2.sShow == 0) // return if any item is invisible
        return 0;

    if(item1.sCollide == 0 || item2.sCollide == 0) 
        return 0;

    if((item2.sPos.x >= item1.sPos.x + item1.sImg->w)      // too right
    || (item2.sPos.x + item2.sImg->w <= item1.sPos.x) // too left
    || (item2.sPos.y >= item1.sPos.y + item1.sImg->h) // too up
    || (item2.sPos.y + item2.sImg->h <= item1.sPos.y))  // too down
    return 0;

return 1;
}

精灵结构:

typedef struct Sprite
{
    SDL_Surface *sImg;
    SDL_Rect sPos;

    int sShow; // If sShow = 1, we show it.
    int sCollide; // If sCollide = 1, then it's physic.
    int sMoving; // If sMoving = 1, it'll be able to move
    float sSpeed;

    int sLife;
    int sInit;

} Sprite;

1 个答案:

答案 0 :(得分:1)

您只是在寻找任何碰撞,然后返回一个int值。我建议用另一种方法来识别球碰到的砖块的哪一侧。 像这样:

int sprite_collide(const Sprite item1, const Sprite item2)
{
    if(item2.sPos.x >= item1.sPos.x + item1.sImg->w) // trop à droite
        doAction(1);
    if(item2.sPos.x + item2.sImg->w <= item1.sPos.x) // trop à gauche
        doAction(2);
    ...
}

然后doAction()方法会在砖块触及侧面时执行某些操作,就像您在评论中提到的那样。

祝你好运。