JKa*_*lio 8 xscale sprite-kit skphysicsbody ios7.1
我使用SKNode的xScale属性来水平翻转我的精灵.现在,在将iOS更新到版本7.1之后,水平翻转会导致我的对象沉入地下.(见下面的动画).只有xScale属性才会出现此问题.垂直翻转工作正常.
// Init
{
SKSpriteNode* ground = [SKSpriteNode spriteNodeWithColor:[UIColor blackColor] size:CGSizeMake(winSize.width, 150)];
ground.position = CGPointMake(winSize.width/2, ground.size.height/2);
ground.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:ground.size center:CGPointZero];
ground.physicsBody.dynamic = NO;
ground.physicsBody.categoryBitMask = 0x01;
ground.physicsBody.collisionBitMask = 0x02;
ground.physicsBody.contactTestBitMask = 0x02;
[self.world addChild:ground];
SKSpriteNode* turtle = [SKSpriteNode spriteNodeWithImageNamed:@"turtle.png"];
turtle.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:turtle.size.width/2];
turtle.physicsBody.categoryBitMask = 0x02;
turtle.physicsBody.collisionBitMask = 0x01;
turtle.physicsBody.contactTestBitMask = 0x01;
turtle.position = CGPointMake(winSize.width/2, winSize.height/2);
[self.world addChild:turtle];
self.turtle = turtle;
}
// Somewhere else
{
self.turtle.xScale *= -1;
}
Run Code Online (Sandbox Code Playgroud)

JKa*_*lio 12
我确信这是SpriteKit中的一个错误.
无论如何,这里有一个问题的解决方案(实际上,这是一个解决方法而不是真正的解决方案,但是......):将精灵包装在容器节点中.此外,容器节点保存physicsBody,而子节点仅是图形节点.这样,您可以使用xScale安全地翻转精灵,而不会影响节点的物理特性.
// Init
{
SKSpriteNode* turtleSprite = [SKSpriteNode spriteNodeWithImageNamed:@"turtle.png"];
self.turtleSprite = turtleSprite;
SKNode* turtleWrapper = [SKNode node];
turtleWrapper.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:turtleSprite.size.width/2];
turtleWrapper.physicsBody.categoryBitMask = 2;
turtleWrapper.physicsBody.collisionBitMask = 1;
turtleWrapper.physicsBody.contactTestBitMask = 1;
[turtleWrapper addChild:turtleSprite];
[self.world addChild:turtleWrapper];
}
// Elsewhere
{
self.turtleSprite.xScale *= -1;
}
Run Code Online (Sandbox Code Playgroud)
我几天前遇到过这个问题.我想根据它的移动(向右或向左)反转精灵,并发现设置xScale会禁用任何碰撞/接触.
但是,每次设置xScale属性时,我都使用了这一行,一切都恢复正常.
node.xScale = -1.0
node.physicsBody = node.physicsBody;
Run Code Online (Sandbox Code Playgroud)