Я делаю свою первую игру для iphone, используя cocos2d и box2d.Я только что реализовал кнопку паузы.Он вызывает меню паузы в верхней части игры и делает паузу CCDirector.Приостановка и приостановка отлично работает, пока вы остаетесь в приложении, но есть ошибка.Если вы свернете приложение, пока оно приостановлено, и вернетесь к нему, игра снова будет приостановлена, но перед ней все еще будет находиться меню паузы.Причина, по-видимому, заключается в том, что метод applicationDidBecomeActive в AppDelegate.mm выглядит следующим образом:
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[CCDirector sharedDirector] resume];
}
Я попытался просто изменить «возобновить» на «пауза», но затем игра останавливается при запуске в каждом случае.
Итак, я полагаю, что решение состоит в том, чтобы добавить код в этот метод, чтобы либо удалить слой паузы, либо (лучше) приостановить работу директора и убедиться, что слой паузы установлен, поэтому игра в любом случае автоматически ставит паузуесли игрок уходит и возвращается.Проблема в том, что я действительно новичок в target-c и не могу понять, как создать публичный метод в моем helloworldlayer и вызвать его из AppDelegate.Кто-нибудь может дать мне быстрое объяснение того, как это сделать?Я попробовал следующее:
- (void)applicationDidBecomeActive:(UIApplication *)application {
[[CCDirector sharedDirector] pause];
[HelloWorldLayer pause];
}
И затем добавил следующий код в мой HelloWorldLayer.mm:
+(void)pauseGame {
_paused = YES;
_pauseMenu.visible = YES;
_pauseLayer.visible = YES;
[[CCDirector sharedDirector] pause];
}
Но он дает мне ошибки - он говорит: «переменная экземпляра _paused доступ к классу»method "и аналогичная ошибка для двух других строк кода.
Как это исправить?Я попытался создать свойства трех переменных и синтезировать их, но это не помогло.Красные восклицательные знаки были заменены желтыми треугольниками (с такими же предупреждениями).Но программа все еще падает в этот момент в коде.
Спасибо за вашу помощь!
-James
РЕДАКТИРОВАТЬ: Woo!Я понял это!
Моя проблема заключалась в том, что я не понял, что метод + применяется к классу, а не к экземпляру, и поэтому не может получить доступ к переменным определенного экземпляра.Поскольку это то, что мне нужно было сделать, я искал способ связи между appDelegate и конкретным слоем Cocos2D.Этот урок оказался чрезвычайно полезным:
http://www.cocos2d -iphone.org / forum / topic / 9354
Вот код, который я использовал в итоге: В appDelegate.mm,Я заменил конец метода applicationDidFinishLaunching следующими строками:
// Run the intro Scene
CCLayer *layer = [HelloWorldLayer node]; //create and init layer
CCScene *scene = [CCScene node]; //create and init parent and empty scene
[scene addChild:layer z:0 tag:100]; //TAG EACH LAYER WITH A UNIQUE NUMBER!!!
[[CCDirector sharedDirector] runWithScene: scene];
Затем я добавил следующее к applicationDidResignActive:
- (void)applicationWillResignActive:(UIApplication *)application {
[[CCDirector sharedDirector] pause];
CCScene * scene = [[CCDirector sharedDirector] runningScene];
id layer = [scene getChildByTag:100];
[layer pauseGame];
}
И я удалил функцию отмены по умолчанию из applicationDidBecomeActive, так какЯ хочу, чтобы он оставался на паузе и загрузил экран паузы.
Наконец, в HelloWorldLayer.mm я восстановил функцию до того, что было изначально:
-(void)pauseGame {
_paused = YES;
_pauseMenu.visible = YES;
_pauseLayer.visible = YES;
[[CCDirector sharedDirector] pause];
}
Обратите внимание, что я изменил ее обратно на метод экземпляра, и все переменные снова являются переменными экземпляра.
Спасибо за ваш ответ, Чжан Чин, это заставило меня понять, что это.Надеюсь, это поможет кому-нибудь в будущем :-) -James