Cocos2D: подклассы спрайтов и анимации, поскольку CCLayer доставляет мне проблемы

Я начал экспериментировать с Cocos2D с Tiled, и спрайт игрока и действия были закодированы в CCLayer вместе со всем остальным. Прежде чем продолжить, я хотел создать подкласс плеера в 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 спрайта героя и присвоил ему свойство. Здесь нет ошибок, но это может быть началом того, где я ошибаюсь:

#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, когда я синтезирую героя, выдается ошибка «Тип свойства «герой» не соответствует типу ивара «герой»

@synthesize 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

person Chewie The Chorkie    schedule 29.04.2011    source источник


Ответы (2)


Попытка изменить ваше свойство в классе DebugZoneLayer с:

@property(nonatomic, retain) CCSprite *hero;

To:

@property(nonatomic, retain) HeroClass *hero;
person Michael Fredrickson    schedule 29.04.2011
comment
Ха-ха! Спасибо. Это ОГРОМНЫЙ шаг вперед в развитии Cocos2D. - person Chewie The Chorkie; 29.04.2011

Это не на 100% связано с вашей проблемой ... но у вас есть другие проблемы с вашими свойствами.

Вы определяете свое свойство как сохранение и освобождаете его в функции Dealloc, но на самом деле вы никогда не сохраняете объект.

_heroSprite = [CCSprite spriteWithSpriteFrameName:@"heroFrame1.png"];

в этой позиции переменная _heroSprite содержит спрайт с включенным автовыпуском... вы его не сохраняете.

Конечно, вы не потеряете его, потому что он будет сохранен этой строкой:

[heroSpriteSheet addChild:_heroSprite];

но он будет выпущен, когда ребенок будет удален с листа.

так что это не нужно в Dealloc: self.heroSprite = nil; и [_heroSprite release]; могут даже привести к сбою вашего кода.

Как было сказано ранее, код работает, но когда вы посмотрите на него позже, вы можете запутаться.

Вы должны объявить свойство как (nonatomic, assign) или правильно сохранить его с помощью

self.herosprite = [CCSprite spriteWithSpriteFrameName:@"heroFrame1.png"];
person Bastian    schedule 29.04.2011
comment
Я сделал обновление выше в своем вопросе. Это все еще применяется таким же образом? - person Chewie The Chorkie; 30.04.2011
comment
Почти уверен, что я могу просто закомментировать все вещи в Dealloc в HeroClass.m - person Chewie The Chorkie; 30.04.2011