Sprite Kit - 使用 textureFromNode 时 Retina 上的低分辨率纹理

Posted

技术标签:

【中文标题】Sprite Kit - 使用 textureFromNode 时 Retina 上的低分辨率纹理【英文标题】:Sprite Kit - Low Resolution Texture on Retina when using textureFromNode 【发布时间】:2013-12-30 10:17:18 【问题描述】:

对于我的游戏,我正在尝试从其他两个纹理创建自定义纹理。这是为了在我的精灵中允许各种颜色等。

为此,我通过将两个纹理添加在一起来创建一个精灵,然后通过使用将其应用于新的 SKTexture

SKTexture *texture = [self.view textureFromNode:newSprite];

这总体上效果很好,我得到了一个很好的自定义纹理。除了在 Retina 设备上尝试我的游戏时,纹理在屏幕上的大小是正确的,但显然分辨率较低。

纹理都在那里并且命名正确,所以我不认为这是一个问题。

有没有人遇到过这种情况,或者知道如何创建正确的@2x 纹理?

【问题讨论】:

你也可以使用颜色属性和/或组成一个覆盖主精灵的多个精灵的精灵,我不明白你为什么需要为此创建一个新纹理 嗯,我制作纹理的部分不能只是着色。它们是我们的艺术家制作的特定设计。就像 Jetpack Joyride 必须结合不同的喷气背包和不同的服装一样。 仍然,假设一个喷气背包由多个设计独特的部件组成,您可以为每个部件创建一个精灵节点并将它们组合在一个 SKNode 中,并可能根据需要为每个单独的部件着色,然后您d 无需将其作为单独的纹理即可获得相同的效果。此外,您还可以为各个部分设置动画,例如在碰撞时使它们分开或单独着色以显示损坏。 我也注意到了这一点。对于使用textureFromNode 将节点层次结构blit 到尚未添加到场景中的纹理的人来说,这是一个真正的问题,用于粒子效果等。您可以在SKView 上使用drawViewHierarchyInRect,但这需要节点层次结构已经画。我不知道这是一个错误,还是与返回的纹理的大小和位置有关。 【参考方案1】:

我终于(意外地)想出了如何解决这个问题。您从中创建纹理的节点必须添加到场景中。否则,您的纹理将获得非视网膜尺寸。

这并不理想,因为创建纹理而不必将它们添加到屏幕上会很好。

【讨论】:

Stuart,您能否提供一个示例来说明您所做的工作?我在***.com/questions/25186397/… 尝试了您的建议,但获得的纹理仍然是低分辨率的。任何提示我错过了什么? 在场景中添加源节点是不够的。另一个条件是从update: 函数内部调用textureFromNode 或在至少调用一次update: 之后(未测试)。场景中必须添加源节点的解决方法: 1.调用textureFromNode后删除节点;它永远不会以这种方式呈现; 2. 将源节点定位在屏幕外(scene.anchorPoint+1024, 768+一点);屏幕外节点确实会消耗一些资源,但它们不会发送到 GPU 并且绝对不可见。【参考方案2】:

我发现了另一种提高从 ShapeNodes 创建的纹理保真度的方法,与这个问题不太相关 - 但很有用。

以 x2 的大小和宽度创建形状。 以相同的超大比例创建所有字体和其他形状。 确保您的定位是相对于这个整体大小的,(例如,不要使用绝对大小,使用容器的相对大小。)

当您将纹理创建为精灵时,它会很大 - 但随后应用

sprite.scale = 0.5; // if you were using 2x

我发现这使它看起来分辨率更高,没有颗粒感,字体没有模糊,锐角。

我也用过tex.filteringMode = SKTextureFilteringNearest;

因此:不必将其添加到场景中然后将其移除。

【讨论】:

以上是关于Sprite Kit - 使用 textureFromNode 时 Retina 上的低分辨率纹理的主要内容,如果未能解决你的问题,请参考以下文章

Sprite-kit 主要角色选择器

Sprite Kit - 使用 Switch Case 将随机 Sprite 节点添加到场景中

Sprite-Kit 为单个接触注册多个碰撞

使用 Swift 在 sprite kit 中的多个场景中重用相同的 sprite 节点

Sprite Kit,删除 Sprite 以进行碰撞

使用 Sprite Kit 移动背景