【问题标题】:Which class should I place this method in? C++我应该把这个方法放在哪个类? C++
【发布时间】:2013-04-14 01:40:26
【问题描述】:

我正在制作基于 Nethack 的 Rogue Like 游戏。我需要决定最好的班级来放置在地牢中导航的方法。现在我实现移动的方式是简单地向 Player 询问字符输入。 (使用 W、A、S、D 作为箭头)。我设置了一段时间,所以它循环直到触发字符结束程序。在这个循环中,它从打印地牢的状态开始。要求输入字符,然后是 if 语句以检查输入的字符。在每个 if 语句中,它将调用一个相对于要移动的输入/方向的方法。所以我将拥有:moveUp()、moveRight() 等等。我只需要弄清楚哪个类最适合放置这些方法,这将决定如何调用这些方法、传递什么以及以此类推。

我将用粗体列出类并用缩进表示继承。以下是我参与的课程:

  • 实体:基类。它本质上代表任何/所有对象
    • 生物:基本上代表地牢中的活“东西”
      • Player:基本上是一个扩展的 Creature.. 这是谁在玩的类。
    • Item:作为任何被视为 Item 的东西的基类
      • 武器:武器..
      • 盔甲:一件盔甲..
      • 消耗品:可以消耗的物品。还有其他几个类别

我也有几个独立的类:

  • Tile:“游戏板”上的空间。它包含一个指向 Creature 的 ptr、指向 Items 的指针向量和一个显示该空间所代表内容的字符。
  • DungeonLevel:这是单个关卡的游戏板/网格。它有一个平铺对象的二维向量。

我已经可以正常生成地牢了,还有什么不可以的。对于每个 DungeonLevel 对象,所有 Tiles 将保持在同一位置。因此,当 PlayerCreature 移动(1 个点)时,程序将调用这些方法来操作 DungeonLevel 对象( >Tile's) 以反映玩家/生物移动到的位置,方法是将它们从 Tile 传递到 Tile。然后程序重新开始循环。

我不确定将这些方法放在哪个类中。我基本上需要 Creatures 和 Player 才能移动。玩家根据字符输入移动。游戏中生成的生物/怪物将向玩家移动 1 个空间(如果可能)。

所以我不确定是否应该使用相同的方法来控制任何 Entity 或者 DungeonLevel 是否应该控制移动,或者 Creature 基类和派生类,玩家,类应该有相同的移动方法,或者如果 Creature 应该有自己的,Player 应该有自己的。

建议?谢谢。

【问题讨论】:

  • 这不是您问题的答案,但根据您所做的决定,如果您还没有一本关于设计模式的书,我强烈建议您购买。我有 Design Patterns: Elements of Reusable Object-Oriented Software 并推荐它。这本书让我对设计类和类之间交互的不同方式敞开了心扉。
  • 是的,这是个好主意。感谢您的建议。
  • codeumbra.eu/… 有一个使用 libtcod 库编写 roguelike 游戏的 c++ 教程,它有一个经过深思熟虑的类层次结构。 c++ 教程基于roguebasin.roguelikedevelopment.org/… 上更完整的python 教程(我参与了一些)。

标签: c++ class object inheritance implementation


【解决方案1】:

因为你正在做一个 2d 游戏。我假设您正在使用opengl。或直接。

用于移动地牢的瓷砖。我建议你不要移动它们。而是移动“相机”,有很多关于 opengl 和 directx 的书籍来了解渲染的工作原理。这样你需要做的所有事情。检查哪些图块在屏幕上或不在屏幕上,只在屏幕上绘制。

至于决定谁应该控制什么。玩家控制他自己的动作是合乎逻辑的。但具有允许外部类移动他的功能。不允许直接访问他的私人信息,因为他们不是朋友;)。

现在了解您的课程应该如何布置。很难明确回答这个问题。但从所呈现的。

这样看,玩家、生物和物品都继承自实体。他们都需要有什么共同点?他们都需要一个职位。函数能够获取和设置它们的位置。他们的轮换。也许是一个名字来识别它们。以及处理发生在他们身上的任何动作的更新函数?这就是虚函数派上用场的地方。

因为你可以拥有virtual void Update(int a_iDeltaTime); 在你的基类中。并且从它继承的所有东西都有自己的更新类型。即播放器检查按键。而敌人只会更新他们的旋转和移动。

编辑:这样您就可以存储所有敌人的玩家物品。作为实体*,当您调用更新时,因为它是虚拟的。它会根据它真正的类型调用正确的更新。这意味着您只需要 1 个列表来存储游戏中的每种类型的实体。结尾。

这样你就可以把它们之间共享的所有东西都放在基类中。并且只将独特的东西放在主类中。

我所说的一切都只是建议,因为您的实施应该最适合您面临的确切问题。只有通过实践才能更好地了解在哪里使用什么实现,正如前面提到的,你应该明确地了解更多关于设计模式的知识,因为它会让你对编写代码的方式敞开心扉。并允许您编写更简单易读的代码。希望这会有所帮助。

【讨论】:

  • Roguelikes 传统上是基于文本的,并在标准终端中运行,使用标准的conio 函数,或支持像curses 这样的库
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 2010-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 2011-12-11
  • 2014-02-27
相关资源
最近更新 更多