在Allegro 5中处理游戏中消息的最有效方式是什么?

我有一个用Allegro制作的2D游戏,我想在游戏过程中引入string。 例如,我刚刚做了这个,所以需要一个钥匙来打开一扇门,所以当玩家与门碰撞时,需要一些教程文本,告诉他们首先需要钥匙。
这对我来说只是一个学习的经验 – 关键是非常明显,但我想学习如何处理这种消息,特别是在一个更大,更好的游戏中的教程目的。

现在,在游戏过程中,我已经运行了game_loop() (处理玩家移动,碰撞等)和game_render() ,这显然是在它之后运行的。 为了介绍这些消息,到目前为止,我已经成功完成了一项任务,即在适当的时候添加一个全局的std::vector<const char*>并向其中push_back消息。

我的message_renderer()然后是这样的:

 static double t = 0, c = 0; if (!messages.empty()) { for (unsigned int i = 0; i < messages.size(); i++) { al_draw_text(font18, al_map_rgb_f(255, 255, 255), wWidth / 2, wHeight - 50, ALLEGRO_ALIGN_CENTRE, messages[i]); if (t < 2) { t += get_dt(); c += get_dt(); if (c > 1) c = 1; } else { t = 0; c = 0; messages.pop_back(); } } } 

然后,在绘制其他所有内容之后,我会在我的game_render()调用此message_renderer() ,以确保消息显示在顶部。

现在,再次,这个工作 – 消息显示在渲染时间2秒,一旦它被添加到vector 。 但是,这个解决scheme对我来说看起来并不是特别的简单,因为据我所知,处理这类事件的方法是标准化的 – 我只是不知道它们是什么!

所以我的问题是 – 我目前的方法是否足够有效? 在Allegro(或者一般来说,在逻辑上!)可以改进吗?如果是这样,怎么办?

先谢谢你!

编辑 :我已经修改了自发布问题以来的代码,所以它现在应该像预期的一样 – 显示一条消息3秒钟。 它是这样做的,但是当我在向量中有两个string同时重叠时 – 我认为计时器将在每次迭代之间作为“暂停”,但是我猜不是…如果有人可以指向正确的方向这也是非常感谢:)

Solutions Collecting From Web of "在Allegro 5中处理游戏中消息的最有效方式是什么?"

您可以使用std::ostringstream将任何东西(甚至是非charvariables)推送到一个stream中,并将其转换为一个string:

 std::ostringstream ss; ss << "Some text: " << some_variable; //... al_draw_text(font28, al_map_rgb_f(255, 255, 255), wWidth / 2, (wHeight / 2) - 28, ALLEGRO_ALIGN_CENTRE, ss.str().c_str()); ss.str(""); //Clear stream contents. 

这是为了解决您编辑中描述的重叠string

al_draw_text包含参数,您可以指定开始编写string的位置。 通常,这意味着第一个字符将在指定的位置,其余的字符继续向右(尽管这 – 文本alignment – 可以通过flags参数来更改)。

但是,如果您重新使用此函数绘制第二个string而不更改位置,则不会将第二个string绘制到右侧或第一个string的下面。 它将在与第一个string相同的起始位置绘制第二个string,从而导致文本重叠。

你有两个select:

  • 如果您只是简单地将两个string绘制为一个string,请首先将string连接起来,然后一次绘制连接的string。
  • 如果要自己控制定位,请指定一个不同的位置来绘制第二个string。 如果要确保文本不重叠,或者要使布局适应不同的字体和大小,可以使用al_get_text_dimensions或相关函数使用第一个string的绘制大小。