Ios Swift sprite套件垂直背景无限图像

Ios Swift sprite套件垂直背景无限图像,ios,swift,sprite-kit,Ios,Swift,Sprite Kit,我有3张图片: topBg.png midBg.png botBg.png 我想在顶部场景设置topBg.png,高度=200 middleBg.png应为无限比例或垂直重复 botBg.png-应位于底部,高度=200 我有下一个代码: override func didMove(to view: SKView) { self.bgTopSpriteNode = self.childNode(withName: "//bgTopNode") as? SKSpriteNode

我有3张图片:

topBg.png
midBg.png
botBg.png

我想在顶部场景设置
topBg.png
,高度=200

middleBg.png
应为无限比例或垂直重复

botBg.png
-应位于底部,高度=200

我有下一个代码:

override func didMove(to view: SKView) {
        self.bgTopSpriteNode = self.childNode(withName: "//bgTopNode") as? SKSpriteNode
        self.bgMiddleSpriteNode = self.childNode(withName: "//bgMiddleNode") as? SKSpriteNode
        self.bgBottomSpriteNode = self.childNode(withName: "//bgBottomNode") as? SKSpriteNode

        if let bgTopSpriteNode = self.bgTopSpriteNode,
            let bgMiddleSpriteNode = self.bgMiddleSpriteNode,
            let bgBottomSpriteNode = self.bgBottomSpriteNode {



            bgTopSpriteNode.size.width = self.frame.width
            bgTopSpriteNode.size.height = 200
            bgTopSpriteNode.position.x = 0

            bgMiddleSpriteNode.size.width = self.frame.width
            bgMiddleSpriteNode.size.height = self.frame.height-400
            bgMiddleSpriteNode.position.x = 0

            bgBottomSpriteNode.size.width = self.frame.width
            bgBottomSpriteNode.size.height = 200
            bgBottomSpriteNode.position.x = 0
        }

    }

但是如何设置图像的
Y
位置。因为坐标是从屏幕中心开始的,而不是从左上角开始的,我不知道如何转换它们。

有几种不同的方法来实现您想要做的事情

  • 首先,如果场景的锚点位于(0.5,0.5),可以使用简单的size.height/2计算屏幕顶部和底部的y位置。(不要使用帧-使用大小。这样,您就可以考虑场景的scaleMode。)

  • 听起来,场景的原点位于中心,让您感到沮丧。如果要将其移动到角点,可以通过将场景的anchorPoint属性设置为(0.0,0.0)来轻松地将其移动到左下角。然后,y值为0和size.height。如果您使用的是.sks编辑器,它将在界面中公开-您可以在那里设置它。否则,可以通过编程方式进行设置

  • 最后,您可以将场景的scaleMode设置为.aspectFill,直接设置场景的大小(例如,对于iPad设置为1024x768),然后将图像放在需要的地方。如果您正在使用.sks文件,这种方法尤其适用于它们;加载场景时,可以根据场景所在视图的纵横比设置场景的大小,以适应不同的纵横比。例如,您可以为iPhone场景采用320x480“参考尺寸”。无论何时加载场景,都可以将场景的大小设置为320点宽和多少点高,以匹配设备的纵横比。然后,所有图形都将以320磅的宽度生成,您可以在场景大小上按比例上下滑动它们以进行布局。这有点复杂,但比尝试处理多个设备的单独布局考虑要容易得多

我还应该指出几件事

  • 可以使用精灵的anchorPoint属性指定精灵坐标的测量起点。这对于希望图像与某个对象对齐的情况非常方便。例如,如果希望图像与屏幕左侧齐平,请将其位置设置为与屏幕左侧完全一致,然后将其anchorPoint.x设置为0.0;这将使精灵的左边缘紧靠屏幕的左边缘。这也适用于场景,正如您所遇到的-移动场景的锚点会相对于其大小移动场景中的所有内容

  • 你所描述的东西不需要三张图片。您可以使用单个精灵,只需设置其centerRect属性,告诉它使用图像的顶部和底部,并垂直拉伸中心部分。你需要做一点数学来设置正确的xScale和yScale(不是宽度和高度,IIRC),但是你可以用一个精灵而不是三个精灵来绘制所有这些。在您的情况下,这将非常方便,因为您可以将精灵保持在(0,0),将其比例设置为与整个场景的大小相匹配,并设置centerRect属性-您根本不需要进行任何定位计算


您可以提供有关此代码的更多信息,例如场景中采用的scaleMode。@AlessandroOrnano这是什么意思?我想要适合不同的尺寸:ipad iphone。@AlessandroOrnano这是我切割成3块的图像:理论上,在场景编辑器中,通过在中间纹理上设置“拉伸到边界/边”约束,这是可能的。但是我还没有试过。Arli,这是使用SKTileMapNode的一个很好的理由