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

SFML 1.6碰撞问题

蓬思博
2023-03-14

我目前正在业余时间用C语言和SFML 1.6编写游戏。当需要进行碰撞检测时,我遇到了一个恼人的错误,程序检测碰撞时,好像物体被移到了左上角,根据我用来测试的静止精灵的大小,移动量不同,通常是其大小的一半左右。我似乎找不到我的代码中有什么bug,但也许你能找到。我的代码列在下面,提前感谢。

#include <SFML/Graphics.hpp>
#include <math.h>

bool collide_rec(sf::Sprite object_1, sf::Sprite object_2);
bool collide_point(sf::Vector2f point, sf::Sprite object);
void collide(sf::Sprite& movable, object& movable_data, sf::Sprite& sationary);

void collide(sf::Sprite& movable, object& movable_data, sf::Sprite& stationary)
{
//Handle Collision NOTE: Results in infinate loop if started on colliding object
for(;collide_rec(movable, stationary);)
{
if((movable_data.move.spd.x<0)||(movable_data.move.left==true||movable_data.direction==LEFT )) movable.Move( 1, 0);
if((movable_data.move.spd.x>0)||(movable_data.move.right==true||movable_data.direction==RIGHT)) movable.Move(-1, 0);
if((movable_data.move.spd.y<0)||(movable_data.move.up   ==true||movable_data.direction==UP   )) movable.Move(0,  1);
if((movable_data.move.spd.y>0)||(movable_data.move.down ==true||movable_data.direction==DOWN )) movable.Move(0, -1);
  }
}

bool collide_point(sf::Vector2f point, sf::Sprite object)
{

}

bool collide_rec(sf::Sprite object_1, sf::Sprite object_2)
{
  bool hit=true;
  sf::Vector2f tl_1, br_1, tl_2, br_2;//Top-Left Coner, Botom Right Corner

  //Assign the corners proporly
  tl_1= object_1.GetPosition();
  tl_2= object_2.GetPosition();

   br_1= (object_1.GetPosition()+object_1.GetSize());
   br_2= (object_2.GetPosition()+object_2.GetSize());

  if((tl_1.x<tl_2.x)&&(br_1.x<tl_2.x) || (tl_1.x<br_2.x)&&(br_1.x<br_2.x)) //if both points are to the left or right on the x demtion
  hit=false;

  if((tl_1.y<tl_2.y)&&(br_1.y<tl_2.y) || (tl_1.y<br_2.y)&&(br_1.y<br_2.y)) //if both points are to the left or right on the y demtion
  hit=false;

  return hit;
}

共有1个答案

仲孙昊焱
2023-03-14

不确定你是否仍然需要一个答案,但我不妨尝试一下。

你可能需要检查几件事:-object_1.getPosition()和object_2的位置是否是对象的左上角。-如果对象不是正方形,那么右下角需要稍微不同的方程来计算。(x,y)坐标是(Pos. x宽度,Pos. y高度)。

一旦你确定了这一点,我在你的命中检测算法中注意到以下几点:

1)

如果(tl_1.x

这个条件的第二部分:

(tl_1.x < br_2.x)&&(br_1.x < br_2.x))

似乎应该是这样

(tl_1.x > br_2.x)&&(br_1.x > br_2.x))

2)

同样:

(tl_1.y < tl_2.y)&&(br_1.y < tl_2.y) 

似乎应该是这样

(tl_1.y > tl_2.y)&&(br_1.y > tl_2.y)

3)

最后,你的条件有一定的冗余,这是不需要的。

一旦您有了topLeft1、BottomRight1和topLeft2、Bottom Right2,您就可以像这样简单地检查碰撞:

假设笛卡尔坐标系,原点(0,0)是左下角。

> < li>

X级碰撞:

if(左上1.x

//如果box 1的左侧

>

  • Y 级碰撞:

    if(左上1.y

    //如果box 1的顶侧

    这将它从8个条件减少到4个。希望能有所帮助。

  •  类似资料:
    • 所以我在为我的平台游戏编写攻击方法时,我注意到我的游戏中的碰撞行为很奇怪,当我向敌人发起攻击(我的游戏中的火球)时没有损坏的记录,我添加了一个打印声明来检查他们是否失去任何生命值和没有记录,但是当我按住攻击方法(这是空格键)时,敌人上记录了多个攻击。 玩家角色是蓝色的,敌人是绿色的。 控制台显示敌人的生命值下降,但仅当空格键被按住时。 同样,当我走进敌人的精灵时,我点击一次空格键,我也能以这种方式

    • 我在我的自上而下的游戏中实现了一个简单的基于瓷砖的碰撞系统,但是我在跨角移动方面遇到了问题。目前,我的程序采取了玩家的中心点,并在一个20px的正方形网格(交替的灰色背景)上做出一个瓷砖。它检查上、下、左、右贴图是否有冲突,如果找到冲突,它就进入下一个阶段。 下一个阶段是检查玩家在瓷砖内的位置。为此,我有一个名为的函数(我知道有创意的名字)。这将返回从瓷砖的中心点到玩家的中心点的距离的向量2i(x

    • 我正在开发一个平台,我有一个32x32的精灵和32x32的磁贴。我还使用了一个图块引擎,它在数组的帮助下生成地图。我使用一个< code>RectangleHelper.cs来修复与瓷砖和播放器的碰撞,到目前为止,它可以与瓷砖的顶部碰撞,也可以与瓷砖的左侧碰撞。 在第一张图中,我展示了“在顶部”碰撞工作正常。没有错误什么的。 在图2中,我展示了“碰撞左侧”,这也很棒。 但是在图3中,你可以看到这个

    • 你是否看到过车祸?是否跟什么物体相撞过?就像车的相撞一样,刚体对象也可以互相碰撞,当它们互相接触的时候,就认为发生了碰撞。当碰撞发生时,会触发一系列事件,它可以被完全忽略。 碰撞筛选 碰撞筛选允许你启用或者阻止形状之间碰撞的发生,引擎支持使用类型,组位掩码来进行碰撞筛选。 Cocos2d-x 有 32 个支持的碰撞类型,对于每个形状都可以指定其所属的类型。还可以指定有哪些类型可以与这个形状进行碰撞

    • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

    • 我已经寻找并找到了单个碰撞的答案,但我正在寻找一种检测多种类型的碰撞的方法。我正在制作一个游戏,其中有3个我想要的碰撞。用户飞机与敌方子弹相撞,用户子弹与敌机相撞(我已经工作过),敌方子弹与用户子弹相撞。我已经设置并更正了所有类别BitMask和contactTestBitMask。这是我的委托方法。