我在尝试将敌人节点添加到场景时遇到以下错误。错误消息为: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;
答案 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
行更改为:
哪一个取决于你在头文件中做了什么,但我建议第一个选项,因为这是obj-c编程普遍接受的最佳实践。
答案 1 :(得分:0)
如果更改会发生什么:
@interface enemigo()
@property (nonatomic) SKSpriteNode *cobra;
@end
到
@interface enemigo()
@property (nonatomic,strong) SKSpriteNode *cobra;
@end