【问题标题】:Game State manager, pausing and resuming游戏状态管理器,暂停和恢复
【发布时间】:2013-03-01 18:06:53
【问题描述】:

我试图在我的游戏中允许暂停。目前,我有一个运行良好的更改状态。对于暂停,我有:

void PushState(int newState)
{
    pauseID = stateID; ///save state number

    Gstates.push_back(currentState); ///Set Current state to vector

    nextState =  newState; ///acquire new state

    switch( nextState )
    {
    case STATE_INTRO:
        currentState = new CIntroState(); ///create new state
        break;
    }

    //Change the current state ID
    stateID = nextState;

    //NULL the next state ID
    nextState = STATE_NULL;
}

上面的部分似乎运行良好。

这是我的简历部分

void Resuming()
{
    nextState = pauseID;

    if( nextState != STATE_EXIT )
    {
         delete currentState; ///deletes current state
    }

    switch( nextState )
    {
    case STATE_INTRO:
        currentState = Gstates.back(); ///sets current state to the saved state
        Gstates.pop_back(); ///delets saved state 
        break;
    }

    //Change the current state ID
    stateID = nextState;

    //NULL the next state ID
    nextState = STATE_NULL;
}

我收到一些奇怪的多线程错误。大约 50% 的时间它按预期工作,但其余时间它会崩溃。

该错误基本上是说,“很可能这是一个多线程客户端,并且没有调用 XInitThreads。

客户端不是多线程的;)..无论如何,有没有人知道发生了什么?

【问题讨论】:

标签: c++ vector copy-constructor


【解决方案1】:

你那里有一些危险的代码。这个:

if( nextState != STATE_EXIT )
{
     delete currentState; ///deletes current state
}

会让你的“currentState”指向不存在的对象,因为它只有在 nextState 是 STATE_INTRO 时才会更新:

switch( nextState )
{
case STATE_INTRO:
    currentState = Gstates.back(); ///sets current state to the saved state
    Gstates.pop_back(); ///delets saved state 
    break;
}

这很可能是崩溃的原因。

【讨论】:

  • 是的,我认为这也是导致崩溃的原因。我不知道为什么。整个想法是保存旧的 currentState,运行新的 currentState,而不是恢复到旧的 currentState。也许我需要使用向量以外的东西来存储对象?
  • 但是你会恢复到 currentState 吗?您确定执行 Resuming 时,从 pauseID 恢复的 'nextState' 是 STATE_INTRO 吗?因为在 pushState 中,您将复制 stateID 保存到 pauseID 中,如果我正确理解逻辑,它是运行状态的 ID,因此可能是 not STATE_INTRO。
  • 我已经做了一些 couts 并且持有的值是 pauseID 和 State_Intro。 pauseID 旨在存储正在保存的状态的值。在这种情况下,它是介绍状态,因为我只使用那个活动状态。我有一个增加的计数器,所以我切换状态并观察计数器重新开始。然后恢复暂停状态,看看计数器是否继续。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多