Как Вы моделируете состояния приложения?

Вы можете подключиться к save_post, который вызывается после создания или обновления сообщения.

  $post_ID,
                    'post_status' => 'private'
                );
            } else {
                $postarr = array(
                    'ID' => $post_ID,
                    'post_status' => 'draft'
                );
            }

            // Update the post.
            wp_update_post( $postarr );

            // re-hook this function.
            add_action( 'save_post', 'callback_save_post', 10, 3);
        }
    }

Ссылка:

https://developer.wordpress.org/reference/hooks/save_post/

https: // код .wordpress.org / Function_Reference / wp_update_post

7
задан zyndor 22 September 2009 в 23:45
поделиться

4 ответа

Следующая статья дает хороший, простой способ управлять игровыми состояниями:

http://gamedevgeek.com/tutorials/managing-game-states-in-c/

В основном Вы поддерживаете стопку игровых состояний и просто выполняете главное состояние. Вы правы, что много состояний только имели бы один экземпляр, но это не действительно проблема. На самом деле, тем не менее, многие состояния, о которых Вы говорите, могли иметь несколько экземпляров. Например:

push TitleState
push MenuState
push LevelIntroState
change_to PlayingState
change_to GameOverState
pop (back to MenuState)

... и можно запустить с нового экземпляра LevelIntroState, и так далее.

10
ответ дан 6 December 2019 в 12:55
поделиться

Я использую некоторый тип шаблона "фабрика", объединенного с шаблоном состояния в моей перспективной игре.

Код мог бы быть немного грязным, но я попытаюсь очистить его.

Это - класс, Вы получите все состояния из, как меню, игра или что бы то ни было.

class GameState {
public:
    virtual ~GameState() { }

    virtual void Logic() = 0;
    virtual void Render() = 0;
};

Этот класс будет Вашим интерфейсом для обработки различных состояний. Можно динамично добавить и идентификатор динамично.

class State {
public:
    State();
    virtual ~State();

    void Init();
    void Shutdown();
    void SetNext( std::string next_state );
    void Exit();

    bool Logic();
    void Render();
protected:
    bool Change();

    std::string state_id;
    std::string next_state;

    GameState *current_state;
    std::vector<std::string> state_ids;

    StateFactory *state_factory;

    bool is_init;
};

Я использую функтор для обработки создания различных производных GameState.

class BasicStateFunctor {
public:
    virtual GameState *operator ()() = 0;
};

template<class T>
class StateFunctor : public BasicStateFunctor {
public:
    StateFunctor() { }
    GameState *operator ()() {
        return new T;
    }
    typedef T type;
};

Наконец фабрика, которая будет хранить и управлять различными состояниями.

class StateFactory {
public:
    StateFactory();
    virtual ~StateFactory();

    bool CheckState( std::string id );
    GameState *GetState( std::string id );
    template<class T> void AddState( std::string id );
private:
    typedef std::map<std::string, BasicStateFunctor*>::iterator StateIt;
    std::map<std::string, BasicStateFunctor*> state_map;
};

В Вашем файле определения: Здесь я действительно не учитывал много материала, но надо надеяться Вы получите идею.

bool StateFactory::CheckState( std::string id )
{
    StateIt it = state_map.find( id );
    if( it != state_map.end() )
        return true;
    else
        return false;
}

GameState *StateFactory::GetState( std::string id )
{
    StateIt it = state_map.find( id );
    if( it != state_map.end() )
    {
        return (*(*it).second)();
    } else {
        //handle error here
}

template<class T> void StateFactory::AddState( std::string id )
{
    StateFunctor<T> *f = new StateFunctor<T>();
    state_map.insert( state_map.end(), std::make_pair( id, f ) );
}

void State::Init()
{
    state_factory = new StateFactory();
    state_factory->AddState<Game>( "game" );
    current_state = state_factory->GetState( "game" );
    is_init = true;
}

void State::SetNext( std::string new_state )
{
    //if the user doesn't want to exit
    if( next_state != "exit" ) {
        next_state = new_state;
    }
}

bool State::Change()
{
    //if the state needs to be changed
    if( next_state != "" && next_state != "exit" ) 
    {

        //if we're not about to exit( destructor will call delete on current_state ),
        //call destructor if it's a valid new state
        if( next_state != "exit" && state_factory->CheckState( next_state ) ) 
        {
            delete current_state;

            current_state = state_factory->GetState( next_state );

        } 
        else if( next_state == "exit" ) 
        {
                return true;
        }

        state_id = next_state;

        //set NULL so state doesn't have to be changed
        next_state = "";
    }
    return false;
}

bool State::Logic()
{
    current_state->Logic();
    return Change();
}

И вот то, как Вы используете его: Инициализируйте и добавьте различные состояния, я делаю его в Init ().

State.Init();

//remember, here's the Init() code:
state_factory = new StateFactory();
state_factory->AddState<Game>( "game" );
current_state = state_factory->GetState( "game" );
is_init = true;

Для функции кадра

State.Logic(); //Here I'm returning true when I want to quit

И для функции рендеринга

State.Render();

Это не может быть прекрасно, но это хорошо работает для меня. Для дальнейшего усовершенствования дизайна, Вы хотели бы добавить Singleton для состояния и возможно сделать StateFactory как скрытый класс в состоянии.

3
ответ дан 6 December 2019 в 12:55
поделиться

Вот мое решение:

  • Каждое состояние похоже на маленькую игру, таким образом, я управляю рядом игр на стеке.
  • События пузырятся, стек вплоть до кого-то останавливает их (таким образом, "игры" далее больше не видят их). Это позволяет мне масштабировать карту через плюс/минус в то время как в меню. OTOH, Esc останавливает пузырение рано, так как первое открытое меню глотает его.
  • Каждая "игра" на стеке имеет те же методы: handleUserEvent (), keyDown (), keyUp (), mousePressed (), mouseReleased (), mouseMotion (), обновление () (внутренние вычисления прежде, чем представить), тянут () (рендеринг), готовятся () (оптимизируйте рендеринг путем кэширования чего-то в структуре, это просто штамповано на целевой поверхности в ничьей ()),

Для рендеринга я использую слои с приоритетами. Таким образом, каждая игра представит на прозрачном холсте, и рендерер слоя представит их в правильном порядке. Таким образом, каждая игра может обновить свой собственный слой, не беспокоя то, что все остальные делают.

2
ответ дан 6 December 2019 в 12:55
поделиться

Я использую Игрового менеджера по состоянию со списком GameStates, где каждый Объект в списке является "Объектом GameState", который реализует IGameState и имеет два метода .render () и.HandleInput ()

Этот GameStateManager реализован как одиночный элемент, таким образом, любое состояние может перейти к любому другому состоянию путем вызова

 GameStateManager.gi().setState("main menu")

И основной цикл выглядит примерно так

while(isRunning)
{
   GameStateManager.gi().getCurrentState().handleKeyboard(keysobject);
   GameStateManager.gi().getCurrentState().handleMouse(mouseobject);

   GameStateManager.gi().getCurrentState().render(screenobject);

}

Тот способ создать состояния, просто создайте новый класс, который реализует IGameState, и добавьте его к GameStateManager.

(Примечание: Это - действительно удобный способ сделать мини-игры в Вашей основной игре),

1
ответ дан 6 December 2019 в 12:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: