【问题标题】:Moving a Character Between Levels/Rooms在关卡/房间之间移动角色
【发布时间】:2013-11-25 19:24:52
【问题描述】:

我有一个从 xml 文件绘制房间的 2d 平台游戏。 xml 文件包含常见的东西,例如敌人和瓷砖的位置,以及它们的纹理映射。

在典型的“Metroidvania”游戏中,玩家将移动到一个房间的边缘,这将加载相邻的房间。我的问题很笼统:

如何传达我的角色从当前加载的房间走进了哪个房间?

现在每个房间都在一个单独的 xml 文件中,每个房间可能有多个出口(周长较大的房间可能在上下/上/左/右的每个方向上有多个出口)。我认为某种图论是合适的,但我无法找到如何在 C++ 或 SFML 2.1 中实现这一点的示例。

【问题讨论】:

  • 最简单的方法是给每个房间一个标识符(一个数字、名称等),并让每扇门存储它通向的房间的标识符。你考虑过这个解决方案吗?

标签: c++ sfml


【解决方案1】:

考虑一下触发器的概念,它在很多游戏中被大量使用。它们通常是没有图形表示的可碰撞对象。因此,在 2D 平台游戏中,它是一个不可见的盒子,当特定对象与它发生碰撞时会做一些事情。

设置触发器就像设置其他对象一样,只是不绘制它。确保它检查玩家是否与它发生碰撞,如果发生碰撞,则执行它的动作。你可以有一个触发器去一个房间,另一个触发器去另一个房间,等等。

class TriggerBase
{
    Rectangle _bounds;

    void CheckAgainst( IObjectWithPosition* object ) const
    {
        if( object->X >= _bounds.Left &&
            object->X <= _bounds.Right &&
            object->Y >= _bounds.Top &&
            object->Y <= _bounds.Bottom )
        {
            ExecuteTrigger( object );
        }
    }

    virtual void ExecuteTrigger( IObject* object ) const = 0;
};

我们的想法是列出这些触发器,然后循环遍历它们,检查实际需要检查的对象。这是一个粗略的基础,但它提供了基本思想。

【讨论】:

  • 这很好。我正在考虑在我的 Tile 类中添加一个“触发器”成员,以便我可以为某些图块提供一个非空的触发器属性,该属性将包含下一个要加载的房间的文件名。然后这可能是碰撞检测周期的一部分,碰撞时当前房间被卸载并加载新房间。
  • 这可行,但您可能希望将触发系统从布局系统中抽象出来。它将更具可扩展性和组织性。这样您就不必将触发逻辑耦合到平台逻辑。
  • 这是有道理的,将不可见的物体与放置瓷砖分开放置会更好。我可能会添加一个新的 xml 节点,其中包含这些不可见触发对象的位置和房间链接 - 感谢您的帮助。
  • 没问题!祝你好运。
猜你喜欢
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-25
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多