In SpriteKit unter iOS führt das Skalieren eines strukturierten Sprites zu einem falschen Frame?

Ich lerne SpriteKit-Spiele aus Spaß und bin auf ein scheinbar einfaches Problem gestoßen, das mich verblüfft hat.

Grundsätzlich ist der Frame nach dem Skalieren eines strukturierten SKSpriteNode NICHT das, was ich erwarte. Ich habe ein paar Hacks herausgefunden, um es zu erzwingen, was ich will, aber ich versuche zu verstehen, was los ist. Irgendwelche Ideen geschätzt!

Hier ist mein Code OHNE SKALIERUNG:

func addSpaceship()
{
    let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
    spaceship.name = "spaceship"
//  spaceship.setScale(0.50)

    let debugFrame = SKShapeNode.init(rect: spaceship.frame)
    debugFrame.strokeColor = SKColor.greenColor()
    spaceship.addChild(debugFrame)

    spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150)

    self.addChild(spaceship)


}

Und meine App sieht so aus:

Nun, wenn ich in der Codezeile, in der es skaliert wird, einen Kommentar hinterlasse (spaceship.setScale (0.50)), erhalte ich Folgendes:

Beachten Sie, dass das Raumschiff im zweiten Bild verkleinert ist, der Rahmen jedoch noch kleiner. Warum

Wenn ich die Skalierungslinie auf @ verschienac Ich füge das Raumschiff der Szene hinzu, es macht das, was ich erwarte, aber das scheint falsch zu sein:

Hier ist der Code mit setScale, der aufgerufen wird, nachdem das Raumschiff der Szene hinzugefügt wurde:

func addSpaceship()
{
    let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
    spaceship.name = "spaceship"

    let debugFrame = SKShapeNode.init(rect: spaceship.frame)
    debugFrame.strokeColor = SKColor.greenColor()
    spaceship.addChild(debugFrame)

    spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150)

    self.addChild(spaceship)
    spaceship.setScale(0.50)


}

Und hier ist, wie das Ausführen meiner App dann aussieht:

So funktioniert das, aber warum ist es notwendig?

Es wurde unten vorgeschlagen, dass dies ein Fehler mit SKShapeNode ist. Das Ersetzen des SKShapeNode durch einen SKLabelNode hat jedoch das gleiche Problem:

func addSpaceship()
{
    let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
    spaceship.name = "spaceship"
    spaceship.setScale(0.50)

    let scoreNode = SKLabelNode(text: "100")
    scoreNode.position = CGPointMake(CGRectGetMidX(spaceship.frame), CGRectGetMaxY(spaceship.frame))

    scoreNode.fontColor = SKColor.redColor()
    scoreNode.fontSize = 15.0
    scoreNode.fontName = "Monaco"
    scoreNode.zPosition = 10.0
    spaceship.addChild(scoreNode)


    spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150)

    self.addChild(spaceship)
}

was uns gibt:

Die Absicht ist es, das Score-Label (scoreNode) zentriert zu habenübe die Rakete, aber wie Sie sehen, ist es oben auf dem oberen Bullauge. Es stimmt einfach etwas nicht mit dem Frame des Raumschiffs, nachdem ich spaceship.setScale aufgerufen habe.

Ich habe eine weitere Entdeckung gemacht: der Aufruf von setScale muss nicht sein, nachdem ich das Raumschiff zur Szene hinzugefügt habe. Es muss nur sein, nachdem ich den debugFrame / scoreNode zum Raumschiff hinzugefügt habe. Wenn ich NACH diesem Punkt die Skalierung einstelle, ist alles in Ordnung:

func addSpaceship()
{
    let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
    spaceship.name = "spaceship"

    let scoreNode = SKLabelNode(text: "100")
    scoreNode.position = CGPointMake(CGRectGetMidX(spaceship.frame), CGRectGetMaxY(spaceship.frame))

    scoreNode.fontColor = SKColor.redColor()
    scoreNode.fontSize = 15.0
    scoreNode.fontName = "Monaco"
    scoreNode.zPosition = 10.0
    spaceship.addChild(scoreNode)

    spaceship.setScale(0.50)

    spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) - 150)

    self.addChild(spaceship)
}

was in ... endet

Antworten auf die Frage(4)

Ihre Antwort auf die Frage