Simon Moshenko
Simon Moshenko

Reputation: 2166

SpriteKit PhysicsBody: Could not create physics body

I have a player in my game, it has two states flying, falling. Each of them has an image: player_flying, player_falling correspondingly. I am also using a physical bodies to detect collision. It is completely normally functioning when I use one texture. But when I am trying to use both in different conditions using different textures, it shows me an error in the log. I am trying it like that:

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];
}

the error is:

2014-08-30 12:55:47.515 kalabaska[1569:50535] PhysicsBody: Could not create physics body.

Upvotes: 1

Views: 2088

Answers (3)

Dominic
Dominic

Reputation: 258

Check the image for stray pixels away from the main image. This can cause the 'could not create physics body' error.

Clean Image Clean Image Image is not clean - note extra pixel island to the bottom right Image is not clean - extra pixel island to the bottom right Typically this extra pixel island can be a very light / low alpha block that looks similar to the background or is just really difficult to spot.

I ran a loop through all of my images testing them as follows:

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

Upvotes: 1

Simon Moshenko
Simon Moshenko

Reputation: 2166

thanks 0x141E, i found out that my texture had some white shit around it, after I've deleted it, everything started to work. Now i am wondering how to hide stroke around my texture which represents my physical object.

Upvotes: 2

0x141E
0x141E

Reputation: 12753

You shouldn't change the texture and physics body of player at the update rate (up to 60 times a second). You should change them only when needed. Here's an example of how to do that:

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;
   }
}

Upvotes: 1

Related Questions