我的 SKTexture 尺寸不适合我的 SKSpriteNode
Posted
技术标签:
【中文标题】我的 SKTexture 尺寸不适合我的 SKSpriteNode【英文标题】:My SKTexture is size wrong for my SKSpriteNode 【发布时间】:2020-01-08 16:01:22 【问题描述】:我有一个 200 x 100 类似于框的菜单按钮 SKSpriteNode 在下面声明。
menuBtn.size = CGSize(width: scrWidth * 1.5, height: 100)
menuBtn.texture = SKTexture(image: UIImage(named: "menuBtn")!)
问题是,按钮的hitbox仍然是正确的,SKTexture的宽度很好,但是SKTexture的高度大约是实际menuBtn大小的1/2。它是一个 png,我已经检查过了,精灵周围没有清晰的纹理(只有透明的 png 纹理),我做错了什么?
按钮图片:https://imgur.com/a/8BtXGLC
App中的按钮图片:https://imgur.com/a/ZfW3xDL
我希望它的外观图片:https://imgur.com/a/2zlSv8y
如果有任何影响,纹理的 png 图像大小为 1044x1044。
【问题讨论】:
你能把你提到的所有东西都拿出来看看吗? png的尺寸是多少? @Knight0fDragon 确定我会添加一个 imgur 链接 @LouFranco Idk,我该如何检查? 什么是scrWidth 【参考方案1】:首先,确保您将正确的大小从GameViewController
发送到您的场景,在本例中为GameScene
。
// without .sks
class GameViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
// ...
if let view = self.view as! SKView?
let scene = GameScene()
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFit
// Set anchorPoint and pass scene.size
scene.anchorPoint = CGPoint(x: 0.5, y: 0.5)
scene.size = view.bounds.size
// Present the scene
view.presentScene(scene)
// ...
// with .sks
class GameViewController: UIViewController
override func viewDidLoad()
super.viewDidLoad()
// ...
if let view = self.view as! SKView?
if let scene = SKScene(fileNamed: "GameScene.sks")
// Set the scale mode to scale to fit the window
scene.scaleMode = .aspectFit
// Pass scene.size
scene.size = view.bounds.size
// Present the scene
view.presentScene(scene)
// ...
在您的GameScene
创建对象。我建议在创建对象时使用 screenWidth
和 screenHeight
,以便它们可以扩展到所有 ios 设备。
class GameScene: SKScene
override func didMove(to view: SKView)
// ...
// scene width / height
let sceneWidth = size.width
let sceneHeight = size.height
// object
let menu : SKSpriteNode = SKSpriteNode()
menu.texture = SKTexture(imageNamed: "menu")
menu.size = CGSize(width: sceneWidth * 0.75, height: 100)
let y_pos : CGFloat = -sceneHeight * 0.5 + menu.size.height * 0.5
menu.position = CGPoint(x: 0, y: y_pos)
menu.zPosition = 1
addChild(menu)
// ...
【讨论】:
menuBtn = self.childNode(withName: "menuBtn") as! SKSpriteNode menuBtn.size = CGSize(width: scrWidth * 1.5, height: 100) menuBtn.color = UIColor(ciColor: .blue) menuBtn.position = CGPoint(x: 0, y: -scrHeight + safeArea.bottom + 50) menuBtn.zPosition = 2 menuBtn.texture = SKTexture(image: UIImage(named: "menuBtn")!)
是我声明我的对象的方式(因为它已经在 sks 中),但它似乎基本相同。我的所有方面在所有设备上都是相同的,但是这个按钮的纹理收缩只是它的 y 值。这就是我要问的。
您可以添加菜单图像的链接吗? menuBtn 一个。
您不应该将场景设置为您的视图大小,这违背了 Spritekit 缩放功能的基础。 SpriteKit 的设计方式是,您只需要设计 1 种尺寸,其余的交给硬件完成
我这样做时的问题是,如果我使用 .aspectFit,根据设备的不同,侧面和顶部会有很多额外的黑色空间,而 .aspectFill 会导致所有内容都变得太大。跨度>
【参考方案2】:
我遇到的问题是我的基本图像中有额外的透明像素,我所要做的就是使用 GIMP 将它们删除。
【讨论】:
当我们要求您向我们展示 png 文件时,我们有点想通了。 ? 是的,感谢您的帮助,但我无法对评论给出“答案”,如果其他人有这个问题,他们会感到困惑。以上是关于我的 SKTexture 尺寸不适合我的 SKSpriteNode的主要内容,如果未能解决你的问题,请参考以下文章