SpriteKit纹理"缩放"彼此不同

时间:2016-10-07 23:25:08

标签: ios swift sprite-kit textures sprite

完全相同的纹理,不同的结果

此处SKSpriteNodeSKShapeNode从纹理图集中获得相同的纹理。

SKSpriteNode在右边,它做对了。

enter image description here

SKShapeNode位于左侧,做错了。

请问,我做错了什么?

这里是代码......

override func didMove(to view: SKView) {


    let myTextureAtlas = SKTextureAtlas(named: "demoArt")
    let arrayOfFileNames = myTextureAtlas.textureNames
    let myTexture = myTextureAtlas.textureNamed(arrayOfFileNames.last!)

    let circleShape = SKShapeNode(circleOfRadius: 180)
    circleShape.fillColor = SKColor.white
    circleShape.fillTexture = myTexture
    circleShape.position = CGPoint(x: 256, y: 384)
    addChild(circleShape)

    let circleSprite = SKSpriteNode(color: SKColor.white, size: CGSize(width: 320, height: 320))
    circleSprite.texture = myTexture
    circleSprite.position = (CGPoint(x: 768, y: 384))
    addChild(circleSprite)

    print(myTexture)

print(myTexture)的结果是正确的:

  

<SKTexture>&#39; seven.png&#39; (512 x 512)

如果你想测试一下,这里的图像文件会进入&#34; atlas&#34; ...

enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

我实现了你的代码并使用了一组不同的纹理(字母而不是数字),我得到了完全相同的行为。我怀疑SKShapeNode实现的fillTexture与SKSpriteNode不同。

在下面的代码中,我创建了四个节点。前两个圆圈是SKShapeNodes,后两个圆圈是SKSpriteNodes。

  • 左上角SKShapeNode使用SKTexture(imageNamed: "a.png")
  • 右上角SKShapeNode使用myTexture
  • 左下角SKSpriteNode使用myTexture
  • 右下角SKSpriteNode使用SKTexture(imageNamed: "a.png")

要解决您的问题,而不是使用纹理图集,只需使用单个SKTexture,例如我示例中的左上角。

这是我的GameScene.swift文件:

import SpriteKit
import GameplayKit

class GameScene: SKScene {

    override func didMove(to view: SKView) {

        let myTextureAtlas = SKTextureAtlas(named: "8bitfont")
        let arrayOfFileNames = myTextureAtlas.textureNames
        print(arrayOfFileNames)
        let myTexture = myTextureAtlas.textureNamed("a.png")

        // Top left circle
        let circleShape1 = SKShapeNode(circleOfRadius: 160)
        circleShape1.fillColor = SKColor.white
        circleShape1.fillTexture = SKTexture(imageNamed: "a.png")
        circleShape1.position = CGPoint(x: -180, y: 180)
        addChild(circleShape1)

        // Top right circle
        let circleShape2 = SKShapeNode(circleOfRadius: 160)
        circleShape2.fillColor = SKColor.white
        circleShape2.fillTexture = myTexture as SKTexture
        circleShape2.position = CGPoint(x: 180, y: 180)
        addChild(circleShape2)

        // Bottom left circle
        let circleSprite1 = SKSpriteNode(color: SKColor.white, size: CGSize(width: 320, height: 320))
        circleSprite1.texture = myTexture
        circleSprite1.position = (CGPoint(x: -180, y: -180))
        addChild(circleSprite1)

        // Bottom right circle
        let circleSprite2 = SKSpriteNode(color: SKColor.white, size: CGSize(width: 320, height: 320))
        circleSprite2.texture = SKTexture(imageNamed: "a.png")
        circleSprite2.position = (CGPoint(x: 180, y: -180))
        addChild(circleSprite2)

        print(myTexture)
    }
}

以下是我得到的结果:

Result

以下是github上的完整项目:

https://github.com/starkindustries/SKShapeNodeVsSKSpriteNode

答案 1 :(得分:0)

这不是一个错误(它原来是想要的),SKShapeNode默认缩放填充纹理,而不是重复模式,你不能直接控制这种缩放。

正如API参考文献所述:

  

形状节点对于无法轻易分解的内容非常有用   到简单的纹理精灵。形状节点也非常有用   在游戏之上构建和显示调试信息   内容。但是, SKSpriteNode 类提供更高的性能   比这个类,所以请谨慎使用形状节点。

在这些指令之外使用SKShapeNode将不必要地降低性价比,并且可能产生视觉缺陷。