将游戏逻辑放在绘图函数中是否可以?

时间:2010-02-12 16:58:40

标签: language-agnostic

我正在制作游戏,我终于完成了它的游戏方面,但是现在是我创建菜单和高分屏幕的时候了。我不完全确定如何做到这一点,游戏将处于不同的状态(MENU_STATE,GAMEPLAY_STATE,SCORESCREEN_STATE),并且在每种状态下我想要在屏幕上绘制不同的东西,我可以做这样的事情吗然后?

draw function()
{
    if MENU_STATE
        draw menu
    if GAMEPLAY_STATE
        draw game
    if SCORESCREEN_STATE
        draw scores
}

我在绘制函数中一直遵循严格的逻辑,到目前为止一直很好,但我真的无法想出一个不同的方法来做到这一点。

6 个答案:

答案 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'sNick D's答案可能会有所帮助,尽管我试着将switch语句放在一个地方(比如一个大的game_update函数),以允许通过在一个地方进行更改来添加新状态。或者,您可以在Colin的状态机设计的基础上构建更通用的东西,并且不需要硬编码的switch语句。 (虽然老实说我现在想不出一个好方法)

答案 4 :(得分:0)

将游戏逻辑放在绘图功能中绝对确定。

但是,如果它在这种特定情况下让你的生活更轻松,那么无论如何都可以。

如果它变得一团糟,你可以随时更改它。

答案 5 :(得分:0)

是的,没关系,允许游戏程序员改变规则以提高性能。游戏世界的视图和模型通常是同一件事,以避免通过分离视图和模型而产生的延迟。

没有理由不能将菜单和高分对象作为游戏世界的一部分,这已经在很多游戏中完成了。