调整和缩放 SKSpriteNode

Posted

技术标签:

【中文标题】调整和缩放 SKSpriteNode【英文标题】:Sizing and scaling SKSpriteNode 【发布时间】:2014-11-23 09:02:51 【问题描述】:

我的 ios 游戏中有多个游戏对象,其中一些具有比其他更大的分辨率。用于游戏对象的图形是在运行时随机选择的。我想确保它们在使用时都不会超过一定的大小,所以我设计了以下算法:

while self.spriteNode.rSize.width > 100 && self.spriteNode.rSize.height > 100 
    self.xScale -= 0.01
    self.yScale -= 0.01

其中 spriteNode 是纹理为图形的对象,rSize 是 SKSpriteNode 上的扩展计算属性,它返回节点累积帧的大小。

这通常会导致无限循环。有什么问题?

更新 1

根据LearnCocos2D的评论,我尝试了以下方法:

let reqXScale = 50/self.spriteNode.rSize.width
let reqYScale = 50/self.spriteNode.rSize.height
self.xScale = reqXScale
self.yScale = reqYScale

虽然这解决了无限循环问题,但某些对象会被压扁,而不是保持其原始纵横比。

另外,这里是定义 rSize 的代码:

var rSize: CGSize 
    return self.calculateAccumulatedFrame().size

我以前多次可靠地使用过它。

【问题讨论】:

如果您发布定义 rSize 的代码会很有帮助。 哇,这真是糟糕的代码,您可以从实际大小与所需大小之间的比率得出所需的比例因子并分配结果。 while 循环只会阻塞程序一段时间(或者如果你有像这种情况下的错误:永远)。还要考虑纵横比,您可能需要单独更新 x/y 比例。 为什么是accumulatedFrame?如果节点没有任何子节点,则与 frame 相同。如果它确实有孩子,它不会将精灵的内容缩放到新的大小,而是缩放到精灵及其孩子的总大小。 @LearnCocos2D 使用 self.frame.size 使节点根本不出现。 【参考方案1】:

我能够弄清楚。我使用的是随机宽度,因为这是我需要的。

// Scaling
let aspectRatio = self.spriteNode.rSize.width/self.spriteNode.rSize.height
let randWidth = CGFloat(rand(60, 90))
self.spriteNode.size = CGSize(width: randWidth, height: randWidth/aspectRatio)

【讨论】:

如何绘制一个宽度正好为 60px 的对象?它以巨大的尺寸绘制 @VyachaslavGerchicov 我意识到我在回答一个小问题,但你明白了吗?如果没有,请查看 GameViewController 以查看您将 GameScene 设置为的大小。可能是图像尺寸合适,但您的场景不合适。调试两个 size 值,fwiw。

以上是关于调整和缩放 SKSpriteNode的主要内容,如果未能解决你的问题,请参考以下文章

SKSpriteNode 没有正确缩放

iOS Swift:无需调整大小即可旋转和缩放 UIView

Qt QGraphicsSvgItem 缩放和调整大小

响应浏览器窗口 (CSS) 调整、缩放和居中图像

缩放和调整谷歌地图V3

ffmpeg调整缩放裁剪视频的基础