gpt4 book ai didi

ios - 在 iOS 上的 SpriteKit 中,缩放带纹理的 Sprite 会产生不正确的帧?

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:32 26 4
gpt4 key购买 nike

我学习 SpriteKit 游戏开发是为了好玩,但我遇到了一个看似简单的问题,却让我很困惑。

基本上,在我缩放一个带纹理的 SKSpriteNode 之后,框架不是我所期望的。我已经想出了一些技巧来强制它达到我想要的效果,但我试图了解发生了什么。任何想法表示赞赏!

这是我没有缩放的代码:

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)


}

我的应用程序如下所示: Unscaled ship with green debug frame

现在,如果我在缩放它的代码行 (spaceship.setScale(0.50)) 中回复评论,我会得到:

Scaled ship with green debug frame

请注意,第二张图片中的宇宙飞船缩小了,但框架缩小得更小。为什么?

如果我将比例线移动到之后,我将宇宙飞船添加到场景中,它会按照我的预期进行,但这似乎是错误的:

这是在将宇宙飞船添加到场景后调用 setScale 的代码:

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)


}

下面是运行我的应用程序时的样子:

Scaling after adding to the scene

这行得通,但为什么有必要?

有人在下面建议,这是 SKShapeNode 的错误。但是,用 SKLabelNode 替换 SKShapeNode 有同样的问题:

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

这给了我们:

Same problem with an SKLabelNode

目的是让得分标签 (scoreNode) 居中于火箭上方,但如您所见,它位于顶部舷窗的顶部。在我调用 spaceship.setScale 之后,飞船的框架出了点问题。

我还有一个额外的发现: setScale 调用不需要在我将宇宙飞船添加到场景之后进行。它只需要在我将 debugFrame/scoreNode 添加到宇宙飞船之后。如果我在那之后设置比例尺,一切都很好:

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

结果是:

This worked

最佳答案

你的问题可能是这两行的顺序:

  spaceship.setScale(0.50)
let debugFrame = SKShapeNode.init(rect: spaceship.frame)

您按比例缩小了宇宙飞船,然后用缩放后的宇宙飞船计算了矩形的大小。然后在渲染时矩形被缩小到它的一半大小,即原始宇宙飞船大小的四分之一。

如果你交换线路,它应该按预期工作。

一般来说,最好以真实大小进行合成,然后在将其添加到场景之前缩放整体。

关于ios - 在 iOS 上的 SpriteKit 中,缩放带纹理的 Sprite 会产生不正确的帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27701705/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com