我正在制作游戏,我终于完成了它的游戏方面,但是现在是我创建菜单和高分屏幕的时候了。我不完全确定如何做到这一点,游戏将处于不同的状态(MENU_STATE,GAMEPLAY_STATE,SCORESCREEN_STATE),并且在每种状态下我想要在屏幕上绘制不同的东西,我可以做这样的事情吗然后?
draw function()
{
if MENU_STATE
draw menu
if GAMEPLAY_STATE
draw game
if SCORESCREEN_STATE
draw scores
}
我在绘制函数中一直遵循严格的逻辑,到目前为止一直很好,但我真的无法想出一个不同的方法来做到这一点。
答案 0 :(得分:5)
您可以为这三种状态使用单独的类,实现一个公共接口,而不是为状态设置常量,设置其中一个类的实例:
interface IState {
void draw();
}
class Menu implements IState {
void draw() {
// Draw menu
}
}
class Game implements IState {
void draw() {
// Draw game
}
}
void draw() {
state.draw();
}
这仍然不理想(你真的不想在你的州中绘制代码,你想要一些更独立的东西),但抽象是一个常见的并且可能是相关的(如果没有,则很难提出建议了解更多您的建筑。)
答案 1 :(得分:3)
你在那个例程中调用了一些绘图函数,但这并不意味着 你必须将它命名为 draw 。
也许这在你的情况下更合适:
// pseudocode
on_game_state function(state)
{
select (state):
MENU_STATE:
draw menu
GAMEPLAY_STATE:
draw game
SCORESCREEN_STATE:
draw scores
}
答案 2 :(得分:1)
使用状态机会使这更简单。每个状态都有自己的一组更新和绘制函数,当它位于状态堆栈之上时会被调用。您可以使用Game_Draw(),Menu_Draw(),HighScoreScreen_Draw()等,而不是使用内部状态切换的一个绘图功能。同样,您的更新功能可以分开。
static void StateMachine_DrawTopState()
{
switch(stateMachine_topState)
{
case STATE_GAMEPLAY:
{
Gameplay_Draw();
}
break;
case STATE_MENU:
{
Menu_Draw();
}
break;
}
}
答案 3 :(得分:1)
与Andrew Aylett's answer类似,假设是面向对象的语言,也许你可以这样做:
Interface IState {
void init();
void update();
void draw();
}
class GameplayScene implements IState {
void init() {
// initialize gameplay
}
void update() {
// update game logic
}
void draw() {
// draw game
}
}
class MenuScene implements IState {
void init() {
// initialize menu
}
void update() {
// update menu logic
}
void draw() {
// draw menu
}
}
class ScoresScene etc...
class TitleScene etc...
// Somewhere else, probably in the Game class
void Main() {
// Init game
Scene currentScene = new TitleScene;
while (Scene != null) {
Scene.init();
Scene.update();
Scene.draw();
}
// Exit game
}
您还需要考虑如何处理场景之间的转换。你可以让每个场景类都有一个名为nextScene的成员变量,main函数在循环开始时查询它以切换到正确的场景。
如果您不习惯使用面向对象的编程语言(如C ++,Java,C#,Python等),Colin's和Nick D's答案可能会有所帮助,尽管我试着将switch语句放在一个地方(比如一个大的game_update函数),以允许通过在一个地方进行更改来添加新状态。或者,您可以在Colin的状态机设计的基础上构建更通用的东西,并且不需要硬编码的switch语句。 (虽然老实说我现在想不出一个好方法)
答案 4 :(得分:0)
将游戏逻辑放在绘图功能中绝对不确定。
但是,如果它在这种特定情况下让你的生活更轻松,那么无论如何都可以。
如果它变得一团糟,你可以随时更改它。
答案 5 :(得分:0)
是的,没关系,允许游戏程序员改变规则以提高性能。游戏世界的视图和模型通常是同一件事,以避免通过分离视图和模型而产生的延迟。
没有理由不能将菜单和高分对象作为游戏世界的一部分,这已经在很多游戏中完成了。