当前位置: 首页 > 知识库问答 >
问题:

C语言中的冲突检测[重复]

蒋飞捷
2023-03-14

我一直在尝试用C语言编写一些碰撞检测代码,下面是我目前拥有的函数,它在每帧调用一次,但是由于某些原因,当两个精灵重叠时,碰撞不起作用

short int Collision(int x1, int y1, int w1, int h1, int x2, int y2, int w2, int h2)
{
    int left1, left2;
    int right1, right2;
    int top1, top2;
    int bottom1, bottom2;

    left1 = x1;
    left2 = x2;
    right1 = x1 + w1;
    right2 = x2 + w2;
    top1 = y1;
    top2 = y2;
    bottom1 = y1 + h1;
    bottom2 = y2 + h2;

    if ((bottom1 < top2)||(top1 > bottom2)||(right1 < left2)||(left1 > right2)) 
    {
        return(1);
    }

    else
    {
        return(0);
    }

    };

    if (Collision ==1)
    {
    //code for collision here
    }

任何指向正确方向的指示都将不胜感激

共有2个答案

林星阑
2023-03-14

记住,(0,0)顶点是左上角,而不是左下角。因此,y(垂直轴)向下增加,x(水平轴)向右增加。

因此,bottom1

夏青青
2023-03-14

我知道,有一个正确的单一条件,有32个标签和16个运算符,但它不可能阅读并且容易搞砸。我的建议是:写更多但更简单的条件。

bool collision = false;
do {
  if (top1 > bottom2) break;  // 1 is under 2
  if (top2 > bottom1) break;  // 1 is beyond 2
  if (left1 > right2) break;  // 1 is right to 2
  if (left2 > right1) break;  // 1 is left to 2
  // I think we listed all the non-collide cases  
  collision = true;
} while (false);

如果“触摸”算作非碰撞,

 类似资料:
  • 我正在尝试为我的大学工作制作一个基于2D平台的游戏(在SFML)。我不是要求任何人为我编写一些代码,但如果有人能提供一些指示,我将非常感激:) 目前我有大约13门课,包括: BaseEntity(大多数游戏对象都是由此派生的) 玩家(继承自BE) 魔法宝石(玩家需要这些来通过关卡晋级) 平台 SolidBlock(从平台继承) 可以说,我已经构建了大部分的游戏“积木”--每个类都有自己的更新函数,

  • 问题内容: 如何检测两个元素是否发生冲突? 这两个div是简单的彩色框,彼此垂直,因此没有复杂的形状或角度。 问题答案: 一般思路-获得框的偏移量和尺寸,并检查它们是否重叠。 如果要更新,可以使用: 另外,请注意,您可以针对特定示例优化功能。 因为它们是固定的,所以您不必重复读取框的尺寸(就像我在代码中一样)。您可以在页面加载时读取它们(将其读取到变量中),然后仅读取变量 小盒子的水平位置不会改变

  • 我使用下面的类制作了一个项目符号列表和一个精灵列表。如何检测子弹是否与子画面发生碰撞,然后删除该精灵和子弹?

  • 我目前正在学习C#和XNA,我在让碰撞检测正常工作方面遇到了一些问题。当敌人物体相交时,我希望我的玩家消失。 下面显示了我在Obj类中的代码 我正在循环查看objList中的每个项目,看它们是否相交。在这种情况下,如果敌人与我的玩家相交,我希望玩家消失,但这并没有发生。 此代码来自我的Player类 如果它与敌人相交,它应该消失,但这似乎没有发生。

  • 我正在尝试制作一个砖块游戏,在碰撞检测方面遇到了一些问题。如果你曾经玩过撞砖游戏,你知道在划桨时,如果球向左移动,而你击中了顶部的左侧,那么它会继续向右移动。不过,在这种情况下,如果你从右侧击球,那么球就会改变方向。而且如果你在桨的侧面撞击它,它会在Y轴上反弹。由于我不知道如何完成桨叶的顶部,我无法向您展示代码,因为我没有任何代码:)这是我用于侧面的代码: 发生的是,当球从侧面被击中时,它正好穿过

  • 我有一个2维数组叫做,也就是32x32。每个元素表示清除路径,表示墙。 窗口分辨率为800x800,这意味着