完全相同的纹理,不同的结果
此处SKSpriteNode
和SKShapeNode
从纹理图集中获得相同的纹理。
SKSpriteNode
在右边,它做对了。
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; ...
答案 0 :(得分:2)
我实现了你的代码并使用了一组不同的纹理(字母而不是数字),我得到了完全相同的行为。我怀疑SKShapeNode实现的fillTexture与SKSpriteNode不同。
在下面的代码中,我创建了四个节点。前两个圆圈是SKShapeNodes,后两个圆圈是SKSpriteNodes。
SKTexture(imageNamed: "a.png")
myTexture
myTexture
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)
}
}
以下是我得到的结果:
以下是github上的完整项目:
https://github.com/starkindustries/SKShapeNodeVsSKSpriteNode
答案 1 :(得分:0)
这不是一个错误(它原来是想要的),SKShapeNode
默认缩放填充纹理,而不是重复模式,你不能直接控制这种缩放。
正如API参考文献所述:
形状节点对于无法轻易分解的内容非常有用 到简单的纹理精灵。形状节点也非常有用 在游戏之上构建和显示调试信息 内容。但是, SKSpriteNode 类提供更高的性能 比这个类,所以请谨慎使用形状节点。
在这些指令之外使用SKShapeNode
将不必要地降低性价比,并且可能产生视觉缺陷。