1

我是 SpriteKit 和 Swift 的新手(过去在 Obj-C 中为 iOS 做过很多工作),但我正在努力做一些应该非常基本的事情……在屏幕上定位精灵!

在屏幕上将标签居中似乎很容易:

myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

但是当我尝试放入屏幕的左下角或右上角时,它是不可见的:

//Bottom-left label
myLabel.horizontalAlignmentMode = .Left
myLabel.position = CGPoint(x: 0.0, y: self.size.height)

或者

//Top-right label
myLabel.horizontalAlignmentMode = .Right
myLabel.position = CGPoint(x: self.size.width, y: self.size.height)

这是一个新项目,没有其他代码。请问我做错了什么?

4

2 回答 2

0

您可以在创建时指定 SKScene 的大小。通常,您传递包含 SKView 的大小,以便它覆盖整个视图。如果设备旋转,您的视图会调整大小(如果您的应用允许新方向)。我不确定是否调整了 SKScene 的大小。但无论哪种方式,您都需要更新场景内容的位置,以便例如标签位于右上角的新尺寸。

视图呈现场景的视图控制器收到消息viewWillTransitionToSize(_ size:,withTransitionCoordinator coordinator:)。您可以将此方法子类化,以向呈现的 SKScene 的自定义方法发送一条消息,说明尺寸正在改变。然后,您可以简单地使用新大小重新定位节点,因为self.frame将会更新。

myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));

回到问题的核心!如何在场景的右上角定位标签?考虑到场景原点位于左下角。对于 SKLabelNode,中心确实在中心。因此,偏移标签尺寸的一半。

myLabel.position = CGPoint(x: self.size.width  - myLabel.size.width /2, 
                           y: self.size.height - myLabel.size.height/2)

顺便说一句,我从未见过使用基于精灵的引擎(例如 Sprite Kit 或 Cocos2d)的 iOS 游戏,它在同一设备(iPhone/iPad)上运行时支持设备旋转/多种屏幕尺寸。

于 2015-08-26T12:40:14.070 回答
0

您必须记住的是,默认情况下,SpriteKit 场景占用的空间远远超过屏幕。它的默认大小为 1024 x 768,除非您另有说明,否则所有内容都按通用性进行缩放。在您的视图控制器中,您可以看到场景是如何初始化的。你会看到它可能有一个声明,上面写着类似

scene.scaleMode = .AspectFill

这就是它的来源。Apple 在文档中以直截了当的方式解释了当您使用 AspectFill scaleMode 时会发生什么:

计算每个维度的比例因子,并选择两者中的较大者。场景的每个轴都按相同的比例因子进行缩放。这保证了视图的整个区域都被填充,但可能会导致部分场景被裁剪。

还有其他比例模式可供探索,您可以尝试,但 Aspect Fill 因其通用性而具有很大优势。

于 2015-08-24T17:55:25.270 回答