【问题标题】:Collision 2D - Detecting the side碰撞 2D - 检测侧面
【发布时间】:2014-06-13 16:36:00
【问题描述】:

我正在研究我的砖块破碎机并制作一个适当的碰撞系统以使球在逻辑上切换方向,我必须检测球与砖的哪一侧发生碰撞。 这是我当前的脚本:

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

Sprite 结构:

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;

【问题讨论】:

  • 运行这段代码会得到什么行为?
  • chouaib : 如果这些项目之一没有碰撞器,或者如果这些项目之一没有显示,我们不处理它们(我有一些项目没有对撞机)。如果项目 2 太靠右、靠左、靠上或靠下,那么它就不会发生碰撞。如果我们达到了所有这些“如果”,那就意味着发生了冲突。
  • 你的精灵是矩形的吗?你能粘贴你的精灵结构代码吗?
  • 是的,一切都是矩形的,不会很复杂
  • 您在下面的评论中提到您返回COLHAUT COLBAS 等...您可以发布那部分代码吗? P.S:还是不明白你的问题

标签: c 2d sdl sprite graphic


【解决方案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() 方法会在砖块接触到侧面时做一些事情,就像你在 cmets 中提到的那样。

祝你好运。

【讨论】:

  • 实际上我的方法在触及顶部、底部、右侧和左侧时返回 COLHAUT、COLBAS、COLDROITE 或 COLGAUCHE。然而,我昨天试图弄清楚如何知道球撞到了哪一边。我最好的想法是从砖的中间得到,推断出侧面(它是左边还是右边,顶部或底部)但问题是它可以是右上角。在这种情况下,我仍然不知道球在哪里,除了它是顶部还是右侧。但我觉得这太过分了,一个最简单的解决方案是可能的。感谢您的回复!
  • 如果它在右上角,那么碰撞确实就在顶部。你必须做一些数学运算才能让球从它接触到顶部的位置反弹回来。我认为你不能像“The ball touch Top Right”那样让输出返回,因为它也可能触及顶部中间和右上角之间的顶部。
  • “右上”意味着代码会触及顶部或右侧,而不是角落,因为它会检测到球是从中间开始的顶部或底部,并且右或左。这里可以是4个combo。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2011-06-23
  • 1970-01-01
相关资源
最近更新 更多