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

冲突检测类(&C)

章涵容
2023-03-14

我正在尝试为我的大学工作制作一个基于2D平台的游戏(在SFML)。我不是要求任何人为我编写一些代码,但如果有人能提供一些指示,我将非常感激:)

目前我有大约13门课,包括:

BaseEntity(大多数游戏对象都是由此派生的)

玩家(继承自BE)

魔法宝石(玩家需要这些来通过关卡晋级)

平台

SolidBlock(从平台继承

可以说,我已经构建了大部分的游戏“积木”--每个类都有自己的更新函数,在game::update中调用。这同样适用于每个对象的Draw()函数。每个类都有一个指向游戏窗口的指针,这样它就可以实现这些功能,并且它们还会从游戏中传递一些变量,比如当前按下的是什么键,以及经过的时间(对于移动calcs)。

一切看起来都很好,直到这里-然后我遇到了碰撞。虽然我了解它们的工作原理,但我尝试了两三种不同的方法来实现它们。一开始,我只是让Player类拥有一系列函数,如CollidesWith(Beetle&b)和CollidesWith(Platform&plat)。显然,在测试我级别中的每一个对象(当然包括宝石)时,这是非常费劲的,我开始考虑如何实现广泛的相位碰撞检测。然后我尝试使用由2个2dvectors(SFML的内置类)定义的AABB类。我就在这里被困住了,决定来这里寻求帮助。我回到了纯粹使用sprite的大小来测试碰撞(因为它们是由一个框定义的-与AABB的相同,对吗?)但我不确定这是不是一条明智的路。

在我把游戏的好基础弄得一团糟之前,有谁能提供一些友好的建议,好的方法来实现宽相位和窄相位冲突检测?我曾经在一个阶段做得很好,然后我意识到一个球员仍然可以通过一个平台的侧面移动,呵呵。

我应该为碰撞创建一个专用类吗?或者,我应该继续使用每个对象的sprite的大小(每个对象都有自己的sprite和image--实际上,我将展示一个示例):

class BaseEntity
{
public:
// Constructors
BaseEntity();
BaseEntity(sf::RenderWindow* gameWin, string imgPath, sf::Vector2f position = sf::Vector2f(0,0), sf::Vector2f velocity = sf::Vector2f(0,0));
virtual ~BaseEntity();
// Setters
void SetCurrentPos(sf::Vector2f newPos); // Set the current position 
void SetPreviousPos(sf::Vector2f newPrevPos); // Shouldn't be needed but there may be rare circumstances
void SetCurrentVel(sf::Vector2f newVel); // Set the velocity

// Getters
sf::Vector2f GetCurrentPos(); // Returns the current position values
sf::Vector2f GetPreviousPos(); // Returns the previous position values
sf::Vector2f GetCurrentVel(); // Returns the current velocity values 

void virtual SetSprite(string imgPath); // Set up the images for the sprite

void virtual Update(float elapsedTime); // The function that handles the updating of movement
void virtual Draw(); // The function that handles the 'Draw' aspect of this object

protected:


sf::RenderWindow* p_GameWin; // A pointer to the game window (used for drawing)
sf::Vector2f currentPos;
sf::Vector2f previousPos;
sf::Vector2f currentVel;
sf::Sprite mySprite; // This objects sprite
sf::Image myImage; // This objects image
};

player类继承了这个特性,并且有一些额外的函数,比如CheckBoundares、ColldesWith、Jump,还包含一些变量-在这个场景中bool isCollding可能会引起兴趣。

干杯,伙计们,抱歉的文章!

共有1个答案

苏乐
2023-03-14

根据您所处理的实体的数量,在内存和/或性能方面,仅仅检查游戏中每个对象的冲突可能会有巨大的成本。

您可能需要对对象进行预处理,以便按轴分类,比如增加x坐标,从而简化冲突检查。在游戏开始前准备好所有的对象并对它们进行排序会更好,例如作为一个等级的开始。我想这是我第一次选择的方式。

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

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

  • 我只使用Box2D进行碰撞检测。我的代码与Ray Wenderlich教程中的代码类似。 我遇到了这个方法的问题。由于代码绕过了Box2D模拟,因此没有碰撞响应。因此,精灵可以重叠。我知道Box2D冲突API提供了一个单位法向量来帮助解决冲突。然而,这个矢量传达的是方向,而不是大小。因此,我无法确定应该将重叠的sprites移动多远。有人知道如何使用Box2D冲突API手动解决重叠问题吗?

  • 我在做一个小的迷你瓷砖引擎游戏。我目前正致力于实现简单的基于块的碰撞检测,然而我遇到了实际的问题。我已经在谷歌上搜索了几个小时,查看了不同的实现,但似乎无法理解它。我目前的努力(只在玩家向右移动时检测碰撞),大部分工作,但允许玩家通过障碍物的底部。碰撞使用法线映射数组来检测碰撞,映射中的任何值2都是一个实体对象。 我明白了我需要做什么的概念--在我移动我的玩家之前,计算玩家将最终进入哪个单元格。检

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

  • 我目前正在为一个学校项目制作一个小游戏,冲突检测有问题。 这是我的时间线和跳转按钮代码: 这是我对碰撞检测的尝试: 我只能假设这不起作用,因为它不会不断地寻找X和Y位置,但我不确定如何做到这一点。