添加子节点时出错

时间:2013-12-29 00:45:26

标签: ios objective-c cocoa sprite-kit

我在尝试将敌人节点添加到场景时遇到以下错误。错误消息为:Attemped to add nil node to parent: <SKNode> name:'(null)' position:{0, 0} accumulatedFrame:{{inf, inf}, {inf, inf}}

(
    0   CoreFoundation                      0x00007fff905a541c __exceptionPreprocess + 172
    1   libobjc.A.dylib                     0x00007fff8a101e75 objc_exception_throw + 43
    2   CoreFoundation                      0x00007fff905a52cc +[NSException raise:format:] + 204
    3   SpriteKit                           0x00000001000cc754 -[SKNode addChild:] + 161
    4   InvadersMacTest                     0x0000000100011fe0 -[MapScene initWithSize:] + 3552
    5   InvadersMacTest                     0x00000001000042fb -[OpcionesMenu handleKeyEvent:keyDown:] + 875
    6   InvadersMacTest                     0x0000000100004514 -[OpcionesMenu keyUp:] + 100
    7   SpriteKit                           0x000000010008ded8 -[SKView keyUp:] + 67
    8   AppKit                              0x00007fff8ee90f71 -[NSWindow sendEvent:] + 3721
    9   AppKit                              0x00007fff8ee31ca2 -[NSApplication sendEvent:] + 3395
    10  AppKit                              0x00007fff8ec81a29 -[NSApplication run] + 646
    11  AppKit                              0x00007fff8ec6c803 NSApplicationMain + 940
    12  InvadersMacTest                     0x0000000100003902 main + 34
    13  libdyld.dylib                       0x00007fff8d75a5fd start + 1

用于添加节点的代码如下,我没有做一些特殊或棘手的事情,只需创建一个模拟敌人的矩形。

SKScene方法

self.almacenEnemigos = [[NSMutableArray alloc] initWithCapacity:kNumEnemigos];

for(int i = 0; i < kNumEnemigos; i++)
{
     enemigo *nemesis = [[enemigo alloc] init];
     [nemesis pintarEnemigo:CGPointMake(200+5*i, 200+5*i)];
     [self.almacenEnemigos addObject:nemesis];
     [self.world addChild:nemesis->cobra];
}

和enemigo类中的方法pintarEnemigo

@interface enemigo()
    @property (nonatomic) SKSpriteNode *cobra;
@end

-(SKSpriteNode*)pintarEnemigo:(CGPoint) pos
{
    self.cobra = [[SKSpriteNode alloc] initWithColor:[SKColor orangeColor]
                                                        size:CGSizeMake(80.0f, 60.0f)];
    self.cobra.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:25];
    self.cobra.physicsBody.dynamic = YES;
    self.cobra.position = CGPointMake(pos.x, pos.y);
    self.cobra.name = @"Pulpo";

    return self->cobra;
}
按要求

和enemigo.f文件:

@interface enemigo : personaje
{
    @public
        SKSpriteNode *cobra;
}

-(id)init;
-(SKSpriteNode*)pintarEnemigo:(CGPoint) pos;

-(BOOL)enviarMensaje;
-(BOOL)mensajeRecibido;

2 个答案:

答案 0 :(得分:1)

什么是self->cobra?那是你的错。值为nil。它永远不会设置为您之前创建的对象。

我很确定你打算使用self.cobra

->运算符存在于Objective-C中,但几乎不会被使用,除非在十年的编程中可能只有一次或两次。你绝对不应该在self上使用它,尽管它在语法上是正确的。

您的类有两个实例变量,一个是cobra,另一个是_cobra。您将值设置为_cobra,然后返回cobra的值。

self.cobra将返回_cobra访问权限,而self->cobra将访问cobra

在* .h文件中,此行不正确:

 SKSpriteNode *cobra;

您有三种方法可以解决它:

  • 将其更改为名为_cobra,这是@property cobra的正确名称;
  • 完全删除该行,然后编译器将自动为您创建_cobra
  • 将一个@synthesize规则添加到enigmo.m文件中,告诉编译器使用cobra而不是_cobra(查找@synthesize的文档以了解具体方法)。< / LI>

完成后,您需要将return self->cobra行更改为:

  • return self.cobra;
  • return _cobra;
  • 返回眼镜蛇;

哪一个取决于你在头文件中做了什么,但我建议第一个选项,因为这是obj-c编程普遍接受的最佳实践。

答案 1 :(得分:0)

如果更改会发生什么:

@interface enemigo()
    @property (nonatomic) SKSpriteNode *cobra;
@end

@interface enemigo()
    @property (nonatomic,strong) SKSpriteNode *cobra;
@end