如何在Swift中计算坐标

时间:2017-11-06 09:15:47

标签: ios iphone swift sprite-kit

我一直试图让以下代码在横向模式下在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坐标,我是否需要知道它被旋转的方式,以便我可以从下来说出来?

1 个答案:

答案 0 :(得分:2)

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

在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