#objective-c #cocos2d-iphone #spritebuilder
#objective-c #cocos2d-iphone #spritebuilder
Вопрос:
У меня есть игра с кнопкой меню паузы на ней. Когда я нажимаю кнопку в своей игровой сцене, все обычно приостанавливается, появляется мое меню паузы, затем я могу возобновить работу одной кнопкой, и это тоже работает.
У меня есть другая кнопка для перезапуска уровня. Поскольку я загружаю в игру определенные объекты, при перезапуске сцены уровня мне нужно удалить все эти объекты, иначе я получаю сообщение об ошибке добавления дочернего элемента, который уже был добавлен. Это означает, что мне нужно каким-то образом связаться с моей игровой сценой, когда я нажимаю restart, чтобы удалить все эти объекты.
Ниже приведен мой код. Обычно я бы создал переменную в сцене паузы, доступную для моей игровой сцены. Когда нажата кнопка перезапуска, я бы изменил значение переменной в моей сцене паузы, а используя метод обновления в моей игровой сцене, я мог бы узнать, когда изменяется значение этой переменной. К сожалению, при выполнении этого с Spritebuilder возникает пара проблем. Обычно вы создаете новую сцену, выполняя следующие действия в Spritebuilder
CCScene *pauseScene = [CCBReader loadAsScene:@"PauseScene"];
Если я сделаю это и создам переменную в моей сцене паузы (как показано ниже), то у меня не будет к ней доступа, поскольку я создаю pauseScene как экземпляр CCScene, а не моего класса PauseScene.
PauseScene.h
#import "CCScene.h"
@interface PauseScene : CCScene
@property (nonatomic, assign) BOOL restartTapped;
@end
Теперь, если я попытаюсь вместо этого создать свой pauseScene как экземпляр моего класса PauseScene, то я получу предупреждение о несовместимых типах указателей, присваивающих ‘PauseScene *’ из ‘CCScene *’. Во время выполнения, если я игнорирую это предупреждение, всякий раз, когда я пытаюсь получить доступ restartTapped
, он немедленно выдает ошибку и сообщает, что нераспознанный селектор отправлен в экземпляр …. Очевидно, что это не работает.
Я не совсем уверен, что делать. У меня есть аккуратный пример этой проблемы ниже, просто используйте PauseScene.h
как приведенные выше, так и приведенные ниже. Если у вас есть решение, пожалуйста, дайте мне знать! Думаю, я, честно говоря, просто спрашиваю, как получить доступ к переменным из одного класса в другой с помощью Spritebuilder.
PauseScene.m
#import "PauseScene.h"
@implementation PauseScene
-(void)restartFromPause{
[self removeFromParent];
[[CCDirector sharedDirector] resume];
}
@end
Главная сцена.m
#import "MainScene.h"
#import "PauseScene.h"
@implementation MainScene
PauseScene *pauseScene;
float totalTime;
-(void)pauseFromMain {
pauseScene = [CCBReader loadAsScene:@"PauseScene"];
[[CCDirector sharedDirector] pause];
[self addChild:pauseScene];
}
-(void)update:(CCTime)delta{
totalTime = delta;
CCLOG(@"total time %f", totalTime);
CCLOG(@"value of other variable %i", pauseScene.restartTapped); //gives an error, details given in my post
}
@end
Ответ №1:
CCScene* pauseSceneCCScene = [CCBReader loadAsScene:@"PauseScene"];
PauseScene *pauseScene = (PauseScene *)[pauseSceneCCScene children][0];
Теперь вы можете получить доступ к pauseScene
переменным, просто выполнив pauseScene.variableName
.
Комментарии:
1. ПОТРЯСАЮЩИЙ ОТВЕТ!!! Я пытался найти другой способ сделать это, но это намного проще, чем то, что я намеревался сделать. И просто для справки на будущее, если вам нужно добавить эту сцену в качестве дочерней, вы должны добавить pauseSceneCCScene, а не pauseScene.