【发布时间】:2014-02-13 05:13:04
【问题描述】:
我创建了SKSpriteNode 的一个名为Obstacle 的子类,并在init 中实现了物理体:
-(id)initWithHeight:(NSInteger)height flipped:(BOOL)flipped
{
if (self = [super initWithImageNamed: @"obstacle.png"])
{
[self setName: @"obstacle"];
[self setSize: CGSizeMake(OBSTACLE_WIDTH, height)];
[self setPosition: CGPointZero];
// rotate if needed
if (flipped)
{
[self runAction: [SKAction rotateByAngle: 3.14 duration: 0.0f]];
}
// physics
SKPhysicsBody* pb = [SKPhysicsBody bodyWithRectangleOfSize: self.size];
pb.dynamic = NO;
pb.affectedByGravity = NO;
[pb setCategoryBitMask: obstacleCategory];
[pb setContactTestBitMask: playerCategory];
[self setPhysicsBody: pb];
}
return self;
}
然后在我的场景中,我有一种方法可以每隔几秒钟一次产生 2 个障碍物。
Obstacle *ob0 = [[Obstacle alloc] initWithHeight: h0 flipped: NO];
[bottom setPosition: CGPointMake(x0, y0)];
Obstacle *ob1 = [[Obstacle alloc] initWithHeight: h1 flipped: YES];
[top setPosition: CGPointMake(x1, y1)];
NSArray* objs = @[ob0, ob1];
for (Obstacle* o in objs)
{
[self addChild: o];
[o runAction: [SKAction
moveToX: -OBSTACLE_WIDTH duration: SPAWN_SPEED*2]
completion:^{
[o removeFromParent];
}];
}
在随机运行一段时间后(几秒钟到几分钟之间),应用程序会崩溃
malloc: *** error for object 0x16553120: pointer being freed was not allocated
第一个代码块中的以下行引发了错误
SKPhysicsBody* pb = [SKPhysicsBody bodyWithRectangleOfSize: self.size];
在Obstacle 被实例化后,我尝试将物理实现移出子类并进入场景,但它会引发相同的错误。
编辑:
调试器让我对我的问题有了新的认识:
*** Terminating app due to uncaught exception 'Cant add body,
already exists in a world', reason: 'Cant add body <SKPhysicsBody>
type:<Rectangle> representedObject:[<SKSpriteNode> name:'obstacle'
texture:[<SKTexture> 'obstacle.png' (50 x 200)] position:{400, 446}
size:{50, 244} rotation:0.00], already exists in a world'
SKPhysicsNodes 可能需要一个唯一的名称吗?
【问题讨论】:
标签: ios iphone objective-c sprite-kit