#iphone #ios #ipad #cocos2d-iphone
#iPhone #iOS #iPad #cocos2d-iphone
Вопрос:
Я хотел бы начать новую сцену на cocos2d, но я хочу передать изображение, которое будет использоваться в качестве фона самой сцены.
Если бы это было с UIImageViews, это было бы эквивалентно
UIImageView *myIV = [[UIImageView alloc] initWithimage: myImage];
то есть myImage — это изображение, которое заполнит весь myIV.
Говоря в терминах cocos2d,
Я бы назвал сцену, используя что-то вроде этого,
[[CCDirector sharedDirector] replaceScene:
[CCTransitionFade transitionWithDuration:0.5f scene:[myScene scene]]];
но если сцена появится на экране, как я могу указать изображение, чтобы оно создавалось на основе изображения (используя изображение в формате bg и в размере изображения).
Я думал о создании свойства в MyScene для передачи изображения, но это будет бесполезно, поскольку инициализация будет запущена до того, как свойство может быть установлено, и, насколько я понимаю, метод init должен выполняться с использованием изображения в качестве ссылки.
Комментарии:
1. «метод init должен выполняться с использованием изображения в качестве ссылки» почему это?
2. потому что, если я представлю сцену, не создав ее сначала, она будет представлена пустой.
3. как показано в моем ответе ниже, вы можете где-нибудь сохранить имя изображения, а затем извлечь его из метода init.
4. при использовании этого метода код будет жестко передан делегату. Мне нужно, чтобы это было свободно, потому что позже мне придется передать то же изображение другим классам, и в этом случае мне придется жестко связать каждый класс с одним и тем же делегатом, создавая путаницу.
Ответ №1:
Расширьте свой класс MyScene инициализатором, который принимает UIImage в качестве аргумента:
-(id) initWithUIImage:(UIImage*)image
{
if ((self = [super init]))
{
CCTexture2D* tex = [[[CCTexture2D alloc] initWithImage:image] autorelease];
CCSprite* bg = [CCSprite spriteWithTexture:tex];
[self addChild:bg];
// ...
}
return self;
}
(id) sceneWithUIImage:(UIImage*)image
{
return [[[self alloc] initWithUIImage:image] autorelease];
}
Затем вы можете создать эту сцену (предполагается, что ваш класс MyScene называется MySceneClass).:
MySceneClass* myScene = [MySceneClass sceneWithUIImage:image];
id trans = [CCTransitionFade transitionWithDuration:0.5f scene:myScene];
[[CCDirector sharedDirector] replaceScene:trans];
Ответ №2:
Вы всегда могли бы поместить некоторые методы в свой AppDelegate, чтобы задать свойство, а затем получить значение из вашего init?
-(void) setImageToUse:(NSString *)theImageString {
imageToUSe = theImageString;
}
-(int) returnImageToUse {
return imageToUSe;
}
или просто сохраните строку в nsuserdefaults и снова извлеките ее в методе init?
Комментарии:
1. Эта идея NSUserDefaults хороша, но не для моего случая, потому что пользователь выбирает изображение из библиотеки, и я хочу передать это изображение. Использование этого метода подразумевает запись изображения на диск только для того, чтобы прочитать его снова через несколько секунд, что делает приложение чертовски медленным … в любом случае, спасибо : ( использование идеи делегирования в моем случае нежелательно, потому что я хочу сделать код менее проводным и более независимым… что мне нужно, так это передать значение из одной сцены в другую, не подключая их.