我想用 C++“模拟”一款流行的 Flash 游戏 Chrontron,并且需要一些入门帮助。(笔记:不是为了发布,只是为了自己练习)

Basics:
Player has a time machine. On each iteration of using the time machine, a parallel state
is created, co-existing with a previous state. One of the states must complete all the
objectives of the level before ending the stage. In addition, all the stages must be able
to end the stage normally, without causing a state paradox (wherein they should have
been able to finish the stage normally but, due to the interactions of another state,
were not).

所以,这可以解释游戏是如何运作的。您应该稍作播放一点,以真正了解我的问题是什么。

我认为解决此问题的好方法是使用链接列表存储每个状态,这可能是基于时间的哈希地图,或者是根据时间迭代的链接列表。我还是不确定。

实际问题:

现在我有了一些粗略的规范,我需要一些帮助来决定为此使用哪些数据结构以及原因。另外,我想知道应该使用什么 Graphics API/Layer 来执行此操作:SDL、OpenGL 或 DirectX(我当前的选择是 SDL)。我将如何实现并行状态?使用并行线程?

编辑(为了澄清更多):
操作系统——Windows(因为这是一个业余爱好项目,稍后可能会在Linux中进行)
图形 - 2D语言-C ++(必须是C ++ - 这是下学期课程的实践)

问-未答复:雪迪龙:OpenGL:直接X
问-回答:避免并行处理
问-回答:使用 STL 实现时间步操作。

So far from what people have said, I should:
1. Use STL to store actions.
2. Iterate through actions based on time-step.
3. Forget parallel processing -- period. (But I'd still like some pointers as to how it
could be used and in what cases it should be used, since this is for practice).

补充一下这个问题,我之前主要使用过 C#、PHP 和 Java,所以我不会将自己描述为一名热门程序员。哪些 C++ 特定知识可以帮助我更轻松地完成这个项目?(IE。矢量?)

有帮助吗?

解决方案

你应该做的是首先阅读并理解“固定时间步长”游戏循环(这里有一个很好的解释: http://www.gaffer.org/game-physicals/fix-your-timestep).

然后你要做的就是保存帧计数器和动作对的列表。STL示例:

std::list<std::list<std::pair<unsigned long, Action> > > state;

或者可能是成对列表的向量。要创建状态,对于每个操作(玩家交互),您存储帧编号以及执行的操作,如果操作只是“按下 <X> 键”或“释放 <X> 键”,您很可能会获得最佳结果”:

state.back().push_back(std::make_pair(currentFrame, VK_LEFT | KEY_PRESSED));

要回放以前的状态,您必须在每次玩家激活时间机器时重置帧计数器,然后迭代每个先前状态的状态列表,看看是否有与当前帧匹配的状态。如果有,则执行该状态的操作。为了优化,您可以保留一个迭代器列表,指向您在每个先前状态列表中的位置。这是一些 伪代码 为了那个原因:

typedef std::list<std::pair<unsigned long, Action> > StateList;
std::list<StateList::iterator> stateIteratorList;
//
foreach(it in stateIteratorList)
{
  if(it->first == currentFrame)
  {
    performAction(it->second);
    ++it;
  }
}

我希望你能明白...

单独的线程只会使问题变得非常复杂,这样你每次都会得到相同的结果,而你不能通过使用单独的线程(无法真正看到它是如何实现的)或非固定时间步长游戏循环来保证这一点。

当谈到图形 API 时,我会选择 SDL,因为它可能是最容易入门的。如果您想使用 3D,以后可以随时使用 SDL 的 OpenGL。

其他提示

这听起来很相似 编织. 。你真的不希望并行处理 - 并行编程是 难的, ,对于这样的事情,性能不应该成为问题。

由于游戏状态向量会增长得非常快(可能约为每秒几千字节,具体取决于帧速率和存储的数据量),因此您不需要链表,因为链表在方面有很大的开销空间(如果布局不当,可能会因缓存未命中而导致巨大的性能损失)。对于每个并行时间线,您需要一个矢量数据结构。您可以将每个并行时间线存储在链接列表中。每个时间线都知道它从什么时间开始。

要运行游戏,您需要遍历所有活动时间线,并同步执行每个时间线的一帧动作。无需并行处理。

我以前玩过这个游戏。我并不一定认为并行处理是正确的选择。您在游戏中拥有共享对象(杠杆、盒子、电梯等),这些对象需要在进程之间(可能是每个增量)共享,从而降低并行性的有效性。

我个人只会保留一个操作列表,然后对于每个后续迭代开始将它们交错在一起。例如,如果列表的格式为 <[iteration.action]>,则第三次将执行操作 1.1、2.1、3.1、1.2、2.2、3.3 等。

在简要概述了描述之后,我认为您的想法是正确的,我将有一个保存状态数据的状态对象,并将其放入链接列表中...我认为您不需要并行线程...

至于图形API,我只使用过opengl,可以说它非常强大并且具有良好的C / C++ API,opengl也将更加跨平台,因为您可以在*Nix计算机上使用messa库。

一个非常有趣的游戏想法。我认为你是对的,并行计算将有利于这种设计,但不会比任何其他高资源程序更有利。

这个问题有点模棱两可。我看到您将用 C++ 编写此代码,但是您要为什么操作系统编写它?您打算让它跨平台吗?您想要什么类型的图形,即 3D、2D、高端、基于网络。

所以基本上我们需要更多的信息。

并行处理不是答案。您应该简单地“记录”玩家的动作,然后回放“之前的动作”

因此,您创建一个包含动作的向量(单链表)。只需存储所采取操作的帧编号(或增量),并在该特定实例期间代表玩家的“虚拟机器人”上完成该操作即可。您只需循环遍历这些状态并依次触发它们即可。

当仅仅因为下一个动作失败而发生状态悖论时,您就会得到轻松“破坏”游戏的副作用。

除非您迫切希望使用 C++ 进行自己的教育,否则您绝对应该看看 XNA 用于您的游戏和图形框架(它使用 C#)。它完全免费,可以为您做很多事情,很快您就可以在 Xbox Live 上销售您的游戏。

为了回答您的主要问题,您在 Flash 中已经可以做的任何事情都不需要使用多个线程。只需将位置列表存储在数组中,并为每个机器人使用不同的偏移量进行循环。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top