2014-12-15 1 views
1

Я пытаюсь настроить свою сцену в файле сцены SpriteKit (.sks). Я устанавливал свои узлы как цветные прямоугольники, а использование childNodeWithName отлично подходит для десериализации в объекты SKNode.Файлы сценария SpriteKit: как использовать childNodeWithName с пользовательским подклассом?

Но я пытаюсь десериализоваться в пользовательский подкласс BadGuyZagNode. Код строит отлично, но сбой во время выполнения.

Код:

GameScene.m

-(void)didMoveToView:(SKView *)view { 
    BadGuyZagNode *badGuy = (BadGuyZagNode *)[self childNodeWithName:@"badguy"]; 
    [badGuy setupBadGuyZagNode]; 
} 

BadGuyZagNode.h

@interface BadGuyZagNode : SKSpriteNode 
- (void) setupBadGuyZagNode; 
@end 

BadGuyZagNode.m

@implementation BadGuyZagNode 

- (void) setupBadGuyZagNode { 
    self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:self.frame.size]; 
    self.physicsBody.categoryBitMask = GMCollisionCategoryMinorBadGuy; 
    self.physicsBody.collisionBitMask = GMCollisionCategoryLaser; 
    self.physicsBody.contactTestBitMask = GMCollisionCategoryLaser; 
    self.physicsBody.affectedByGravity = NO; 
    self.physicsBody.dynamic = NO; 
} 

@end 

Ошибка

'NSInvalidArgumentException', reason: '-[SKSpriteNode setupBadGuyZagNode]: unrecognized selector sent to instance 

Все работает, если я не использую childNodeWithName и просто инициализации в spriteNodeWithColor.

Я попытался добавить метод init без каких-либо параметров и вызвал [super init], но это не полетело.

Я рассмотрел оба этих ответов, но ни применяться:

Subclassing SKNodes created with SpriteKit .sks scene file

Subclassing SpriteKit classes in Swift

Я также смотрел видео WWCD SpriteKit Best Practices, но примеры не используют какой-либо пользовательские классы.

ответ

1

Возможно, недостаточно кода отправлено, чтобы дать вам более подробный ответ. Но суть его в том, что

[self childNodeWithName:@"badguy"]; 

не возвращает экземпляр BadGuyZagNode

Вы можете проверить это, выполнив:

BadGuyZagNode *badGuy = (BadGuyZagNode *)[self childNodeWithName:@"badguy"]; 
NSLog(@"badGuy is %@", NSStringFromClass([badGuy class])); 

я полностью не читал Subclassing SKNodes created with SpriteKit .sks scene file, но основанный на вопросе/ответе, если вы хотите подкласс SKNode s в SKS, вам нужно будет выполнить некоторую работу (см. ответ). Если вы не делаете этого, поэтому ваш узел не является BadGuyZagNode

Я немного неясно, вы имеете в виду

Все работает, если я не использую childNodeWithName и просто инициализации в spriteNodeWithColor ,

Как вы это называете (т. Е. Показывать больше кода)?

+0

Так звучит так, будто вы говорите «Это невозможно», что является правильным ответом. Я не знал достаточно о SpriteKit, чтобы узнать, возможно ли это. – gmoore

+0

Я не говорю, что это невозможно. Но если вы используете SKS прямо из коробки без дополнительной поддержки кода, тогда да. Я читал http://stackoverflow.com/questions/25123264/subclassing-sknodes-created-with-spritekit-sks-scene-file. Исходя из этого, это представляется возможным. Как сейчас у вас есть свои вещи, это не сработает, поэтому вы получаете сообщение «непризнанный селектор, отправленный на экземпляр». –

Смежные вопросы