SpriteKit PhysicsBody:无法创建物理体

时间:2014-08-30 07:10:00

标签: objective-c sprite-kit

我的游戏中有一个玩家,有两个状态在飞行,下降。他们每个人都有一个图像:player_flying,player_falling相应的。我也使用物理身体来检测碰撞。当我使用一个纹理时它完全正常运行。但是当我尝试在不同的条件下使用不同的纹理时,它会在日志中显示错误。我这样想:

if (self.player.physicsBody.velocity.dy > 30) {
    self.player.texture = [SKTexture textureWithImageNamed:@"player_flying"];
    self.player.physicsBody = [SKPhysicsBody bodyWithTexture:self.player.texture
                                                        size:self.player.size];        
}
else
{
    self.player.texture = [SKTexture textureWithImageNamed:@"player_falling"];
    self.player.physicsBody = [SKPhysicsBody bodyWithTexture:self.player.texture
                                                        size:self.player.size];
}

错误是:

  

2014-08-30 12:55:47.515 kalabaska [1569:50535] PhysicsBody:无法创建物理身体。

3 个答案:

答案 0 :(得分:2)

感谢0x141E,我发现我的纹理周围有一些白色的东西,在我删除之后,一切都开始起作用了。现在我想知道如何在我的纹理周围隐藏描边,代表我的物体。

答案 1 :(得分:1)

你不应该以更新速率(每秒高达60次)改变播放器的纹理和物理体。您应该只在需要时更改它们。以下是如何执行此操作的示例:

if (self.player.physicsBody.velocity.dy > 30) {
    // Change texture/body only if not already flying
    if (!isFlying) {
        self.player.texture = [SKTexture textureWithImageNamed:@"player_flying"];
        self.player.physicsBody = [SKPhysicsBody bodyWithTexture:self.player.texture
                                                        size:self.player.size];
        isFlying = YES;
    }      
}
else
{
    // Change texture/body only if not already falling
    if (isFlying) {
        self.player.texture = [SKTexture textureWithImageNamed:@"player_falling"];
        self.player.physicsBody = [SKPhysicsBody bodyWithTexture:self.player.texture
                                                        size:self.player.size];
        isFlying = NO;
   }
}

答案 2 :(得分:0)

检查图像是否偏离主图像。这可能会导致“无法创建物理物体”错误。

清洁图像 Clean Image 图像不干净-注意右下角有多余的像素岛 Image is not clean - extra pixel island to the bottom right 通常,这个额外的像素岛可以是非常轻/低的alpha块,看起来与背景相似,或者很难发现。

我对所有图像进行了循环测试,如下所示:

                    let t = SKTexture(imageNamed: filename)
                    let physics = SKPhysicsBody(texture: t, size: t.size())
                    if physics.area == 0.0 {
                        print("File \(filename) - failed")
                    }