Как сохранить сцену SpriteKit на паузе, когда приложение становится активным?
Есть ли способ предотвратить автоматическую отмену приостановки SpriteKit сцены при входе на передний план / становится активным?
Я поставил paused = true
и хотите, чтобы он оставался таким, даже когда приложение снова становится активным после отправки в фоновый режим.
Я должен добавить, что я делаю это быстро, хотя я бы не ожидал, что поведение в этом отношении будет другим.
5 ответов
Не уверен, что это то же самое в цели C, но в быстром мне пришлось "переопределить" функцию обратного вызова, которую SKView вызывает за кулисами,
func CBApplicationDidBecomeActive()
{
}
Эта функция вызывала паузу для сброса.
(ключевое слово override не должно применяться)
В некоторых случаях, когда вы хотите просто сохранить состояние паузы, создайте новую переменную и переопределите метод isPaused.
class GameScene:SKScene
{
var realPaused = false
{
didSet
{
isPaused = realPaused
}
}
override var isPaused : Bool
{
get
{
return realPaused
}
set
{
//we do not want to use newValue because it is being set without our knowledge
paused = realPaused
}
}
}
Я внес некоторые изменения в решение от Knight0fDragon, чтобы оно работало на меня. Это делает так, чтобы isPaused всегда был равен realPaused. Чтобы приостановить игру, переменная "realPaused" должна быть только изменена, которая автоматически изменит также переменную isPaused.
var realPaused: Bool = false {
didSet {
self.isPaused = realPaused
}
}
override var isPaused: Bool {
didSet {
if (self.isPaused != self.realPaused) {
self.isPaused = self.realPaused
}
}
}
К сожалению, это предотвратит приостановку сцены, когда приложение работает в фоновом режиме. Чтобы предотвратить это, я изменил условие на "self.isPaused!= Self.realPaused && self.isPaused == false", чтобы сцена по-прежнему автоматически приостанавливалась, когда приложение переводилось в фоновый режим, но только повторно Активизировать, если realPaused также true:
var realPaused: Bool = false {
didSet {
self.isPaused = realPaused
}
}
override var isPaused: Bool {
didSet {
if (self.isPaused == false && self.realPaused == true) {
self.isPaused = true
}
}
}
Pinxaton вы правы но вы можете приостановить приложение, добавив небольшую задержку
(void)theAppIsActive:(NSNotification *)note
{
self.view.paused = YES;
SKAction *pauseTimer= [SKAction sequence:@[
[SKAction waitForDuration:0.1],
[SKAction performSelector:@selector(pauseTimerfun)
onTarget:self]
]];
[self runAction:pauseTimer withKey:@"pauseTimer"];
}
-(void) pauseTimerfun
{
self.view.paused = YES;
}
Этот вопрос, возможно, был довольно стар, но я столкнулся с той же проблемой сегодня, и я думаю, что нашел довольно хорошее решение:
В AppDelegate я делаю следующее:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
SKView *view = (SKView *)self.window.rootViewController.view;
if ([view.scene isKindOfClass:[GameScene class]])
{
XGGameScene *scene = (GameScene *)view.scene;
[scene resumeGame];
}
}
А потом в GameScene
Сам класс, я обновляю BOOL, чтобы отразить, что приложение только что возобновилось из фона:
- (void)resumeGame
{
// Do whatever is necessary
self.justResumedFromBackground = YES;
}
И, наконец, в цикле обновления: я запускаю следующее:
- (void)update:(NSTimeInterval)currentTime
{
// Other codes go here...
// Check if just resumed from background.
if (self.justResumedFromBackground)
{
self.world.paused = YES;
self.justResumedFromBackground = NO;
}
// Other codes go here...
}
Надеюсь это поможет!
Вы должны использовать свой делегат приложения, в частности метод applicationDidBecomeActive. В этом методе отправьте уведомление, которое прослушивает ваш вид SpriteKit.
Итак, в методе applicationDidBecomeActive ваш код должен выглядеть примерно так:
// Post a notification when the app becomes active
[[NSNotificationCenter defaultCenter] postNotificationName:@"appIsActive" object:nil];
Теперь в вашем методе didMoveToView в вашем файле SKScene поместите следующее:
// Add a listener that will respond to the notification sent from the above method
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(theAppIsActive:)
name:@"appIsActive" object:nil];
Затем просто добавьте этот метод в ваш файл SKScene:
//The method called when the notification arrives
(void)theAppIsActive:(NSNotification *)note
{
self.view.paused = YES;
}