我一直在尝试获取以下代码,以横向模式在iPhone模拟器的底部显示一个矩形:

let size = CGSize(width: 100, height: 10)

let myRect = SKShapeNode(rectOf: size)
myRect.position = CGPoint(x:self.frame.midX, y:self.frame.maxY - 50)
myRect.strokeColor = SKColor(red: 0.0/255.0, green: 0.0/255.0, blue: 200.0/255.0, alpha: 1.0)
myRect.lineWidth = 4

myRect.physicsBody = SKPhysicsBody(rectangleOf: size)

myRect.physicsBody?.affectedByGravity = false
myRect.physicsBody?.isDynamic = true

结果是该矩形未在可见屏幕内绘制。然后,我插入了此调试语句:
print(self.frame.minY, self.frame.maxY, self.frame.minX, self.frame.maxX, self.frame.width, self.frame.height)

哪个输出:
-667.0 667.0 -375.0 375.0 750.0 1334.0

此外,当我将坐标更改为y:100时,我注意到形状向上移动,而不是向下移动。所以,我的问题是:当手机处于横向模式时,我是否需要手动转换X和Y坐标,并且是否需要知道它的旋转方向,以便我可以向下看?

最佳答案

尝试了解SceneScreen之间的区别。这是iPhone开发中的2个独立构造。

在XCode 11中创建SpriteKit游戏时(其他可能会有所不同),默认的场景大小为750x1334。这是现在的“标准”大小。

这意味着在标准尺寸的iPhone设备上,您将获得像素完美的图形,其他所有内容将缩放或调整场景大小以适合屏幕。

有4种模式可以完成此任务,.aspectFill,.aspectFit,.fill,.resize并通过scaleMode进行设置。我不打算讨论所有这些内容,您可以查找一下,但是模板中的默认值为.aspectFill。

.aspectFill的意思是保留长宽比并缩放图像,直到所有边缘都被覆盖,而没有黑条。这意味着如果场景不符合屏幕的宽高比,则会进行裁剪。

现在,在处理方向时,您需要找到某种方法来处理此问题,因为场景仍将保持相同的大小,并被迫缩放或调整大小。

因此,正在发生的情况是您的场景的纵横比为9:16,而屏幕的纵横比为16:9。这意味着它将把您的场景缩放到16:28.44〜的比例,以确保覆盖所有屏幕边缘。这意味着您的场景中有68%(19.44〜/ 28.44〜)正在被裁剪以适合场景。

为了解决这个问题,您有几种选择。

1)您只能支持1个方向,并设置场景大小以适合它。

2)您可以将场景设计成正方形,并在两侧进行裁剪。

3)您可以设计多个场景以处理纵横比

4)您可以手动不断更改尺寸并进行基于百分比的定位。

在这些选择中,我建议选择1或2

10-06 13:04