#iphone #ipad #cocos2d-iphone #subclass #cclayer
#iPhone #iPad #cocos2d-iphone #подкласс #cclayer
Вопрос:
Я начал экспериментировать с Cocos2D с помощью Tiled, и спрайт плеера и действия были закодированы в CCLayer вместе со всем остальным. Прежде чем продолжить, я хотел подкласс player в CCLayer, что, я надеюсь, правильно.
Мой заголовок и основной код выглядят следующим образом:
HeroClass.h
#import <Foundation/Foundation.h>
#import "cocos2d.h"
@interface HeroClass : CCLayer {
CCSprite *_hero;
CCAction *_heroSpriteFlyAction;
}
@property(nonatomic, retain) CCSprite *hero;
@property(nonatomic, retain) CCAction *heroSpriteFlyAction;
@end
HeroClass.m
#import "HeroClass.h"
@implementation HeroClass
@synthesize hero =_hero;
@synthesize heroSpriteFlyAction = _heroSpriteFlyAction;
-(id) init{
self = [super init];
if (!self) {
return nil;
}
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"heroTestSheet.plist"];
CCSpriteBatchNode *heroSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"heroTestSheet.png"];
[self addChild:heroSpriteSheet];
NSMutableArray *heroSpriteFlyAnimFrames = [NSMutableArray array];
for(int i = 1; i <= 2; i) {
[heroSpriteFlyAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:@"heroFrame%d.png", i]]];
}
CCAnimation *heroSpriteFlyAnim = [CCAnimation animationWithFrames:heroSpriteFlyAnimFrames delay:0.03f];
self = [CCSprite spriteWithSpriteFrameName:@"heroFrame1.png"];
_heroSpriteFlyAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:heroSpriteFlyAnim restoreOriginalFrame:NO]];
[self runAction:_heroSpriteFlyAction];
[heroSpriteSheet addChild:self];
return self;
}
- (void) dealloc{
self.hero = nil;
self.heroSpriteFlyAction = nil;
[super dealloc];
}
@end
Я думаю, идея, которой я хочу достичь, заключается в том, что я могу получать доступ к объектам этого класса как к свойствам в других файлах. Приведенный выше код не выдает никаких ошибок при его сборке, но, возможно, я что-то сделал не так. Проблема, с которой я сталкиваюсь при миграции, заключается в том, что сейчас происходит в моем классе CCLayer DebugZoneLayer, который создает карту и должен добавить мой спрайт проигрывателя, но выдает мне ошибки.
В DebugZoneLayer.h Я импортировал HeroClass.h и создал указатель из HeroClass спрайта hero и присвоил ему свойство. Здесь нет ошибок, но это может быть началом того, где я ошибаюсь:
#import "cocos2d.h"
#import "HeroClass.h"
@class HeroClass;
// DebugZone Layer
@interface DebugZoneLayer : CCLayer {
HeroControl *heroControl;
HeroClass *hero;
CCTMXTiledMap *theMap;
CCTMXLayer *blocksCollidable;
CCTMXLayer *invisiblePropertiesLayer;
}
@property(nonatomic, retain) CCSprite *hero;
В DebugZoneLayer.m, когда я синтезирую hero, он выдает ошибку «Тип свойства ‘hero’ не соответствует типу ivar ‘hero’
@synthesize hero;
Остальная часть файла выдает мне больше ошибок, связанных с чем-либо, ссылающимся на hero, но, по крайней мере, это то, с чего все начинается.
РЕДАКТИРОВАТЬ (обновлено)
Просто хотел упомянуть, что, поскольку это было решено, я устранил некоторые серьезные проблемы в HeroClass.m, которые вызывали сбой:
#import "HeroClass.h"
@implementation HeroClass
@synthesize heroSprite =_heroSprite;
@synthesize heroSpriteSheet =_heroSpriteSheet;
@synthesize heroSpriteFlyAction = _heroSpriteFlyAction;
-(id) init{
self = [super init];
if (!self) {
return nil;
}
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"heroTestSheet.plist"];
_heroSpriteSheet = [CCSpriteBatchNode batchNodeWithFile:@"heroTestSheet.png"];
//[self addChild:_heroSpriteSheet];
NSMutableArray *heroSpriteFlyAnimFrames = [NSMutableArray array];
for(int i = 1; i <= 2; i) {
[heroSpriteFlyAnimFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:
[NSString stringWithFormat:@"heroFrame%d.png", i]]];
}
CCAnimation *heroSpriteFlyAnim = [CCAnimation animationWithFrames:heroSpriteFlyAnimFrames delay:0.03f];
_heroSprite = [CCSprite spriteWithSpriteFrameName:@"heroFrame1.png"];
_heroSpriteFlyAction = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:heroSpriteFlyAnim restoreOriginalFrame:NO]];
[self runAction:_heroSpriteFlyAction];
[_heroSpriteSheet addChild:_heroSprite];
return self;
}
- (void) dealloc{
self.heroSprite = nil;
self.heroSpriteSheet = nil;
self.heroSpriteFlyAction = nil;
[super dealloc];
}
@end
Ответ №1:
Это не на 100% связано с вашей проблемой.. но у вас есть другие проблемы с вашими свойствами.
Вы определяете свое свойство как retain и освобождаете его в функции dealloc, но на самом деле вы никогда не сохраняете объект.
_heroSprite = [CCSprite spriteWithSpriteFrameName:@"heroFrame1.png"];
в этой позиции переменная _heroSprite содержит спрайт с включенным авторелизом… вы не сохраняете это.
Конечно, вы не потеряете его, потому что он будет сохранен в этой строке:
[heroSpriteSheet addChild:_heroSprite];
но он будет выпущен, когда дочерний элемент будет удален с листа.
так что в dealloc: в этом нет необходимости, self.heroSprite = nil;
и [_heroSprite release];
это даже приведет к сбою вашего кода.
Как говорилось ранее, код работает, но когда вы посмотрите на него позже, вы можете запутаться.
Вы должны объявить вероятность как (неатомную, назначить) или сохранить ее должным образом с помощью
self.herosprite = [CCSprite spriteWithSpriteFrameName:@"heroFrame1.png"];
Комментарии:
1. Я внес обновление выше в свой вопрос. Применяется ли это по-прежнему таким же образом?
2. Уверен, я могу просто прокомментировать все вещи в dealloc в HeroClass.m
Ответ №2:
Пытаюсь изменить ваше свойство в DebugZoneLayer
классе из:
@property(nonatomic, retain) CCSprite *hero;
Для:
@property(nonatomic, retain) HeroClass *hero;
Комментарии:
1. Ха-ха! Спасибо. Это ОГРОМНЫЙ шаг вперед в развитии Cocos2D