ios - SpriteKit 纹理 "scaling"彼此不同

标签 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> 'seven.png' (512 x 512)

如果您想测试一下,这里是进入“atlas”的图像文件...

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

最佳答案

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

在下面的代码中,我创建了四个节点。顶部两个圆圈是 SKShapeNode,底部两个圆圈是 SKSpriteNode。

  • 左上角 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

关于ios - SpriteKit 纹理 "scaling"彼此不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39927067/

相关文章:

Swift 3 prepare for segue 未被调用

ios - swift 仅满足某些要求时如何进入另一个segue?

swift - 应用程序内购买在 Swift 2 中有效,但现在我已更新到 Swift 3 和 Xcode 8

swift - SpriteKit SKAction.runBlock 传递参数问题

swift - 如何从父级 SKSpriteNode 中删除子级 SKSpriteNode 而不杀死子级

ios - 从服务器监听 iCal 事件变化

ios - 如何在结构定义中定义CGPoints数组?

ios - Xcode 不在表格单元格上使用 NSMutableArray

ios - 除了推送来唤醒 iOS 应用程序之外的其他方式?

arrays - 在此过程中创建包含 UIBezierPath 和 NSArray x Array 的 CGRect