2010-02-12 51 views
4

我正在制作一款游戏,并且我终于完成了它的游戏性方面,但现在是我创建菜单和高分屏幕的时候了。我不完全确定该怎么做,游戏将处于不同的状态(MENU_STATE,GAMEPLAY_STATE,SCORESCREEN_STATE),并且在每种状态下我想要在屏幕上绘制不同的东西,对我来说做这样的事情可以吗?然后?将游戏逻辑放在绘图函数中可以吗?

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

我一直在关注抽奖功能没有严格的逻辑和它一直不错,但我实在想不出用不同的方式来做到这一点。

+0

规则不是“绘图函数中没有逻辑”,而是“绘图函数中没有游戏逻辑”。每个功能都会有一些逻辑。只要确保你所做的决定是在程序的正确部分完成的。 – Kylotan 2010-02-14 11:36:37

回答

0

绝对不是不是确定把游戏逻辑放在绘图函数中。

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

如果它变得混乱,你可以随时更改它。

3

您正在调用该例程中的一些绘图功能,但这并不意味着
您必须命名它绘制

也许这是你的情况更为合适:

// pseudocode 
on_game_state function(state) 
{ 
    select (state): 
     MENU_STATE: 
     draw menu 
     GAMEPLAY_STATE: 
     draw game 
     SCORESCREEN_STATE: 
     draw scores 
} 
+0

这仍然是绘图功能中的逻辑,不是吗? – 2010-02-12 17:19:59

+0

+1表示这不一定是绘图函数,或者它不一定是。还要注意的是,如果在函数的后面有实际的绘图,那么如果你想严格保持游戏逻辑不在任何绘图函数之外,那么它可以被踢到一个不同的函数(这实际上是一个绘图函数)。 – 2010-02-12 17:20:23

+1

@Andrew Aylett:不一定。如果这只是函数中的全部内容,那么它所做的只是调用其他函数来进行实际绘图,而不是执行任何绘图本身。 (编辑:我想我只是假设“绘制菜单”等是分开的函数调用) – 2010-02-12 17:21:07

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(); 
} 

这仍是不理想(你真的不希望在您的状态下画出的代码,你想要的东西多一点独立的),但是抽象是常见的一种,可能是相关的(如果不知道m,很难再提供建议你的建筑的矿石)。

+0

+1这正是虚拟函数(或者C函数指针)存在的原因。 – 2010-02-13 07:33:24

+0

@BlueRaja,以及为什么在游戏中使用虚拟函数来做这件事通常是一个坏主意,即我有100,000个对象需要更新和绘制 - 调用一个虚拟函数100,000次,这基本上是一个表查找会很快破坏我的表现 – zebrabox 2010-02-13 11:50:43

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; 
    } 
} 
0

是的,这很好,游戏程序员被允许弯曲性能提升的规则。游戏世界的观点和模型经常是同一件事,以避免视图和模型分离而产生延迟。

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

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的成员变量,主函数在循环开始时查询它切换到合适的场景。

如果您没有使用面向对象的编程语言(如C++,Java,C#,Python等)的奢华。),Colin'sNick D's的答案可能会有所帮助,但我试图在一个地方使用switch语句(比如说一个大的game_update函数),以允许通过在一个地方进行更改来添加新状态。或者,您可以在Colin的状态机设计上构建更通用的东西,并且不需要硬编码的switch语句。 (虽然说实话我现在想不出一个好办法)