对于含糊不清的标题感到抱歉。我想知道的是,在主菜单,选项菜单和“在游戏中”之间交替渲染的有效方法是什么。
到目前为止我提出的唯一两种方法是使用1个渲染函数,每个部分的代码(菜单,...)和控制绘制内容的变量,或者具有多个渲染函数,并使用函数指针指向适当的指针,然后只需调用函数指针。
我一直想知道更多专业游戏是如何做到的。
答案 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的绝佳机会,但根据经验,我会建议反对。你不想最终处于你有一百万个来来去去的小状态的情况;你想将它限制在主要的“运行模式”,并且每个模式应该能够在数据上运行,告诉它要显示什么。例如。整个游戏内菜单的一个状态,“加载”数据(通常,“更新其指向数据的指针”)以指示当前屏幕的行为。没有什么比拥有一百个微类更糟糕了,并且不知道哪一个触发了,更不用说通常来自这种设计的重复逻辑(游戏开发人员通过重构减少重复)非常糟糕。