如何在游戏中的不同时间有效地渲染不同的东西?

时间:2010-05-21 03:38:18

标签: c++

对于含糊不清的标题感到抱歉。我想知道的是,在主菜单,选项菜单和“在游戏中”之间交替渲染的有效方法是什么。

到目前为止我提出的唯一两种方法是使用1个渲染函数,每个部分的代码(菜单,...)和控制绘制内容的变量,或者具有多个渲染函数,并使用函数指针指向适当的指针,然后只需调用函数指针。

我一直想知道更多专业游戏是如何做到的。

4 个答案:

答案 0 :(得分:1)

尝试使用状态机/策略OOP模式。游戏应用程序处于不同的状态并呈现不同的内容,并在您正在播放和与菜单交互时对键盘/鼠标输入作出不同的反应。

答案 1 :(得分:1)

如果你想做得好,这有点复杂。 首先,我创建一个CScreen类,它是所有屏幕的基类。它是一个抽象类(使用纯虚函数),它有两个函数:Render和Update。然后我在需要的更多屏幕中导出它,例如CMainMenuScreen, COptionsScreen, CCreditsScreen, CGameScreen etc。让这些课程中的每一个都照顾好自己的东西。在每个界面中都有界面,然后按下主菜单屏幕中的选项按钮,然后将屏幕更改为COptionsScreen。为此,你必须在某个地方保留一个变量CScreen screen,并在每个帧调用screen->Update() and screen->Draw()记忆中调整,如果你不使用指针(很难我推荐这个)

答案 2 :(得分:0)

如果您的控件表示为类,那么多态API render将解决问题。根据对象(菜单类型),会发生相应的渲染。

class UIObject
{
public:
  virtual bool render() = 0;
  ~UIObject(){}
};

class MainMenu : pu{
public:
  virtual bool render()
  { //rendering for main menu
  }
 };
class OptuionMenu
{
public:
  virtual bool render() { //render for option menu}
};

答案 3 :(得分:0)

我已经发售的已经销售了大量副本的游戏已经拥有状态机并使用switch语句来选择适当的功能。虽然表面上不如“OOP”状态机灵活,但它比我后来经历的OOP设计更容易使用。

实际上只有一个渲染函数可能是合适的,但该函数不应该知道它正在做什么的具体细节。它将具有3D和2D通道(至少对于3D游戏,因为即使那些通常具有2D UI元素),但它不需要知道游戏所处的“模式”。

魔术发生在UpdateMainMenu或UpdateGame或UpdateInGameMenu函数中,以及与切换状态相关的启动和停止功能。选择哪一个在枚举上使用switch语句并使用它两个位置,切换状态(一个开关停止旧状态,另一个开始新状态)和更新。

当我写下我的警钟响起时,这是使用OOP的绝佳机会,但根据经验,我会建议反对。你不想最终处于你有一百万个来来去去的小状态的情况;你想将它限制在主要的“运行模式”,并且每个模式应该能够在数据上运行,告诉它要显示什么。例如。整个游戏内菜单的一个状态,“加载”数据(通常,“更新其指向数据的指针”)以指示当前屏幕的行为。没有什么比拥有一百个微类更糟糕了,并且不知道哪一个触发了,更不用说通常来自这种设计的重复逻辑(游戏开发人员通过重构减少重复)非常糟糕。