翻转的x-scale中断碰撞处理(SpriteKit 7.1)

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)

x尺度翻转问题

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)

  • 解决方法确实是一种解决方案,而不是理想的解决方案. (3认同)

ZeM*_*oon 6

我几天前遇到过这个问题.我想根据它的移动(向右或向左)反转精灵,并发现设置xScale会禁用任何碰撞/接触.

但是,每次设置xScale属性时,我都使用了这一行,一切都恢复正常.

node.xScale = -1.0
node.physicsBody = node.physicsBody;
Run Code Online (Sandbox Code Playgroud)