Как вызвать метод в helloworldlayer.mm из appdelegate.mm - PullRequest
2 голосов
/ 01 февраля 2012

Я делаю свою первую игру для 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

1 Ответ

1 голос
/ 01 февраля 2012

Вам нужно + pauseGame, например:

+(void)pauseGame {
    CCDirector *sharedDirector = [CCDirector sharedDirector];

    sharedDirector.paused = NO;
    sharedDirector.pauseMenu.visible = NO;
    sharedDirector.pauseLayer.visible = NO;
    [sharedDirector resume];    
}

Также вам может потребоваться @synthesize или написать методы установки для этих свойств.

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