0

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

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

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

我还有一些独立课程:

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

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

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

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

建议?谢谢。

4

1 回答 1

1

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

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

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

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

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

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

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

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

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

于 2013-04-14T02:05:28.927 回答