Текстура для спрайта не найдена и спрайт не отображается при использовании SKSpriteNode с категорией

Я начал использовать систему категорий SKSpriteNode для расширения базовой функциональности SKSpriteNode, и спрайты, добавленные в сцену .sks через редактор, теперь отсутствуют в сцене (а не те, которые программно добавляются в сцену дополнительно, во время выполнения). Когда я зарегистрировал некоторые из спрайтов в .sks, я увидел их правильное расположение и параметры масштаба, но текстура всегда ['nil'] в консоли отладки в XCode. Это происходит (см. ниже строку NSLog), когда я, например, регистрирую элемент с именем «house1» внутри статики SKNoe в редакторе сцен для GameScene1.sks. В редакторе сцен я вижу все элементы (включая этот элемент house1) в порядке, но когда я запускаю проект, ни один из спрайтов, добавленных в этот файл .sks, не отображается. Вот соответствующий код:

Заголовочный файл GameScene:

//GameScene.h

#import "Hero.h"
#import "SKSpriteNode+StaticLevelElement.h"

@interface GameScene : SKScene <SKPhysicsContactDelegate>

-(void) initStaticLevelElements;

@end

Файл реализации GameScene:

//GameScene.m
#import "SKSpriteNode+StaticLevelElement.h" 

@implementation SKScene (Unarchive)

+ (instancetype)unarchiveFromFile:(NSString *)file {
    /* Retrieve scene file path from the application bundle */
    NSString *nodePath = [[NSBundle mainBundle] pathForResource:file ofType:@"sks"];
    /* Unarchive the file to an SKScene object */
    NSData *data = [NSData dataWithContentsOfFile:nodePath
                                      options:NSDataReadingMappedIfSafe
                                        error:nil];
    NSKeyedUnarchiver *arch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    [arch setClass:self forClassName:@"SKScene"];
    SKScene *scene = [arch decodeObjectForKey:NSKeyedArchiveRootObjectKey];
    [arch finishDecoding];

    return scene;
}  

@end

@implementation GameScene

-(void)didMoveToView:(SKView *)view {

    //Overriden in each level scene
    [self initStaticLevelElements];

}

-(void) initStaticLevelElements {
}

@end

GameScene1.m это:

//  GameScene1.m
#import "GameScene1.h"
#import "Customer.h"
#import "Competitor.h"

@implementation SKScene (Unarchive)

+ (instancetype)unarchiveFromFile:(NSString *)file {
    NSString *nodePath = [[NSBundle mainBundle] pathForResource:file ofType:@"sks"];

    NSData *data = [NSData dataWithContentsOfFile:nodePath
                                      options:NSDataReadingMappedIfSafe
                                        error:nil];
    NSKeyedUnarchiver *arch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    [arch setClass:self forClassName:@"SKScene"];
    SKScene *scene = [arch decodeObjectForKey:NSKeyedArchiveRootObjectKey];
    [arch finishDecoding];

    return scene;
}

@end

@implementation GameScene1

#include "GoodsConstants.h"

-(void) initStaticLevelElements {
    self.staticLevelElements = [[NSMutableArray alloc] init];

    self.name = @"name for scene one";

    SKNode * statics = [self childNodeWithName:@"statics"];

    statics.zPosition = 100;
    SKSpriteNode * e = (SKSpriteNode *)[statics childNodeWithName:@"house1"];
    NSLog(@"house one is: %@", e);

}

GameScene1.h это:

//  GameScene1.h

#import <SpriteKit/SpriteKit.h>
#import "GameScene.h"


@interface GameScene1 : GameScene

@end

SKSpriteNode+StaticLevelElement.h:

//  SKSpriteNode+StaticLevelElement.h  

#import <SpriteKit/SpriteKit.h>
#import <SpriteKit/SKSpriteNode.h>

@interface SKSpriteNode (StaticLevelElement)

-(void) initWithSKNode:(SKNode *)node;

@property NSNumber * pseudoDepth;

@end

SKSpriteNode+StaticLevelElement.m:

//SKSpriteNode+StaticLevelElement.m

#import <objc/runtime.h>
#import "SKSpriteNode+StaticLevelElement.h"

NSString * const pseudoDepthSelector = @"pseudoDepth";

@implementation SKSpriteNode (StaticLevelElement)

@dynamic pseudoDepth;

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    self.userInteractionEnabled = YES;

    return self;
}

- (void)setPseudoDepth:(NSNumber *)pseudoDepth
{
objc_setAssociatedObject(self, (__bridge const void *)(pseudoDepthSelector), pseudoDepth, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSNumber *)pseudoDepth
{
    return objc_getAssociatedObject(self, (__bridge const void *)(pseudoDepthSelector));
}

-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

-(void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

}

@end

Для установки конкретных данных для каждой сцены (уровня) я использую наследование базового класса GameScene — таким образом я получаю GameScene1, GameScene2 и т. д. Кто-нибудь знает, чего мне не хватает, чтобы иметь возможность видеть текстуры?


person Vladimir Despotovic    schedule 22.06.2016    source источник


Ответы (1)


Я удалил метод переопределения initWithCoder из SKSpriteNode+StaticLevelElement.m, и теперь все работает нормально, текстуры отображаются, а все спрайты отображаются на экране.

person Vladimir Despotovic    schedule 28.06.2016