C 碰撞2D-检测侧面

C 碰撞2D-检测侧面,c,2d,sdl,sprite,graphic,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

我正在研究我的砖块破碎机,为了制作一个合适的碰撞系统,以便使球的开关方向符合逻辑,我必须检测球与砖块的哪一侧碰撞。 以下是我当前的脚本:

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;
}

您只需查找任何冲突,然后返回一个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);
    ...
}
int-sprite\u冲突(常量sprite项1,常量sprite项2)
{
如果(item2.sPos.x>=item1.sPos.x+item1.sImg->w)//tropádroite
作用(1);

如果(item2.sPos.x+item2.sImg->w,运行此代码会得到什么行为?chouaib:如果其中一个项目没有碰撞器,或者其中一个项目没有显示,我们不会处理它们(我有一些项目没有碰撞器).如果第2项太右、太左、太上或太下,那么就没有冲突。如果我们达到所有这些“如果”你的精灵是矩形的吗?你能粘贴你的精灵结构代码吗?是的,所有的东西都是矩形的,这不会是你在下面的评论中提到的复杂的东西,你返回
COLHAUT
COLBAS
等等…你能发布那部分代码吗当我的方法碰到顶部、底部、右侧和左侧时,我会返回COLHAUT、COLBAS、COLDROITE或COLGAUCHE。然而,昨天我试图找出如何知道球碰撞的哪一侧。我最好的办法是从砖块的中间开始,推断出一侧(要么是左侧,要么是右侧,要么是顶部,要么是底部)但问题是它可能是右上角。在这种情况下,我仍然不知道球在哪里,除了它是右上角还是右上角。但我觉得这太过分了,一个最简单的解决方案是可能的。谢谢你的回答!如果它是右上角,那么碰撞确实就在顶部。你必须做一些数学,让球反弹b从它接触顶部的位置确认。我认为你不能像“球接触右上角”那样得到输出,因为它也可以接触顶部中间和右上角之间的顶部。通过“右上角”这意味着代码可能会触及顶部或右侧,而不是角落,因为它会检测到球从中间到顶部或底部,从右到左。这里可以是4连击。
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);
    ...
}