我创建了一个名为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;
}然后在我的场景中,我有一个方法,每隔几秒钟一次产生两个障碍物。
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'也许SKPhysicsNode%s需要有一个唯一的名称?
发布于 2014-02-14 00:09:42
我找到解决方案了!因为我为高度生成了一个随机数,并从另一个障碍物的视图高度中减去了这个数字,有时高度是一个负值,这会导致创建物理体的错误。我希望这对其他人有帮助,因为我整天都在苦苦思索。
https://stackoverflow.com/questions/21745797
复制相似问题