Вы можете подключиться к 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
Следующая статья дает хороший, простой способ управлять игровыми состояниями:
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
, и так далее.
Я использую некоторый тип шаблона "фабрика", объединенного с шаблоном состояния в моей перспективной игре.
Код мог бы быть немного грязным, но я попытаюсь очистить его.
Это - класс, Вы получите все состояния из, как меню, игра или что бы то ни было.
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 как скрытый класс в состоянии.
Вот мое решение:
Для рендеринга я использую слои с приоритетами. Таким образом, каждая игра представит на прозрачном холсте, и рендерер слоя представит их в правильном порядке. Таким образом, каждая игра может обновить свой собственный слой, не беспокоя то, что все остальные делают.
Я использую Игрового менеджера по состоянию со списком 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.
(Примечание: Это - действительно удобный способ сделать мини-игры в Вашей основной игре),