2013-04-14 94 views
0

我正在制作一款基于Nethack的游戏。我需要决定最好的班级来放置通过地牢进行导航的方法。现在我执行移动的方式是只需要播放器输入一个字符。 (使用W,A,S,D作为箭头)。我有一段时间建立,所以它循环直到触发器字符结束程序。在这个循环中,它通过打印地下城的状态开始。要求输入字符输入,然后输入if语句来检查输入的字符。在每个if语句中,它将调用一个相对于想要移动的输入/方向的方法。所以我会有:moveUp(),moveRight()等等。我只需要弄清楚哪个类最适合放这些方法,这将决定如何调用方法,传递什么,以及等等。我应该在哪个类中放置此方法? C++

我将用粗体列出类,并用缩进表示继承。这里是我涉及的类:

  • 实体:基类。它本质上表示任何/所有对象
    • 生物的:基本上代表了地牢
      • 球员生活“东西”:基本上是一个扩展的怪物..它是谁在玩的类。
    • 项目:作为一个基类的任何一个被认为会项目
      • 武器:一个武器..
      • 护甲:一块装甲..
      • 消耗品:可以消耗的物品..有其他几个类别

我也有一些独立的类:

  • 瓷砖:在A空间 “游戏键盘”。它拥有Creature的ptr,指向Items的向量以及显示该空间所代表的字符的char。
  • DungeonLevel:这是单个级别的游戏板/网格。它有一个2D向量Tile对象。

我已经有地牢生成正确,什么不是。对于每个DungeonLevel对象,所有的瓷砖将保持在同一个位置。因此,当一个播放生物移动(1点)的程序将调用这些方法来操纵DungeonLevel对象(的2D矢量瓷砖的),以反映在播放器/生物通过从将它们移动到平铺到平铺。然后程序重新启动循环。

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

所以我不知道我是否应该使用相同的方法来控制任何实体或者如果DungeonLevel应控制移动,或生物基类和派生,播放机,类应该具有相同的运动方法,或者如果Creature应该有自己的球员,球员应该有自己的。

对此提出建议?谢谢。

+1

这不是您的问题的答案,而是基于您所做决定的种类,如果您尚未拥有设计模式,我强烈建议您阅读这本书。我有设计模式:可重用的面向对象软件的元素,并将其推荐。这本书让我开始思考不同的课程设计类别和交互方式。 – Joshua

+0

是的,这是一个好主意。感谢您的建议。 – ModdedLife

+0

在http:// codeumbra上有一个使用libtcod库编程roguelike游戏的C++教程。eu/complete-roguelike-tutorial-using-c-and-libtcod-part-1-setting-up,它有一个相当深思熟虑的课堂教学。 C++教程基于更完整的python教程http://roguebasin.roguelikedevelopment.org/index.php?title=Complete_Roguelike_Tutorial,_using_python%2Blibtcod(我有一些参与)。 – Muscles

回答

1

因为你正在做2D游戏。即时假设你正在使用opengl。或directx。

用于移动地下城的瓷砖。我建议你不要移动它们。但相反,移动“相机”有许多书籍的opengl和directx如何重新工作。这就是你需要做的一切。检查屏幕上是否显示图块,只在屏幕上绘制图块。

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

现在如何布置你的课程。它很难明确地回答这个问题。而是来自所呈现的内容。

看这个样子,玩家和生物和物品都是从实体继承而来。他们都需要有什么共同点?他们都需要一个位置。函数能够获取和设置他们的位置。他们的旋转。也许是一个名字来标识它们。和一个更新函数来处理发生在他们身上的任何操作?这是虚拟功能派上用场的地方。

因为您的基类中可能有virtual void Update(int a_iDeltaTime); 。并且从它继承的每一条信息都有它自己的更新类型。即玩家检查按键。而敌人只更新他们的旋转和移动。

编辑:这种方式,你可以只存储所有你的敌人的球员项目。作为实体*的,当你打电话更新,因为它的虚拟。它会根据它的实际类型调用适当的更新。这意味着你只需要1个列表来存储游戏中的每种类型的实体。结束。

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

我所说的一切都是简单的sugggestions,因为您的实施应该是最适合您面对的确切问题的最佳选择。并且只有这样,您才能更好地了解在实践中使用哪些实现方法,并且如前所述,您应该定义更多地了解设计模式,因为它会打开思路,编写代码。并允许你写简单易读的代码。希望这可以帮助。

+0

传统上,Roguelikes是*基于文本的*,并且在标准终端中运行,使用标准'conio'函数,或者像'curses'一样支持lib – Textmode

相关问题