我是SpriteKit和Swift的新手(过去在iOS中为Obj-C做了很多)但我正在努力做一些非常基本的事情......在屏幕上定位精灵!
在屏幕上居中标签似乎很容易:
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)
这是一个新项目,没有其他代码。我做错了什么,拜托?
答案 0 :(得分:0)
您必须记住的是,默认情况下SpriteKit场景占用的范围远远超过屏幕。它的默认大小是1024 x 768,除非你另有说明,否则所有内容都会按比例缩放。在视图控制器中,您可以看到场景的初始化方式。你会发现它可能有一个类似
的陈述scene.scaleMode = .AspectFill
这是这个的来源。文档中的Apple以直接的方式解释了当您使用AspectFill scaleMode时发生的情况:
计算每个维度的缩放因子,并选择两者中较大的一个。场景的每个轴都按相同的缩放因子缩放。这可以保证视图的整个区域都被填充,但可能会导致部分场景被裁剪。
还有其他可以探索的比例模式,您可以尝试,但Aspect Fill具有普遍性的巨大优势。
答案 1 :(得分: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)
顺便说一句,我从未看过一款iOS游戏,该游戏使用基于精灵的引擎(例如Sprite Kit或Cocos2d),它在同一设备上运行时支持设备旋转/多种屏幕尺寸( iPhone / iPad的)。