节点在场景大小内的位置

时间:2016-08-07 12:11:21

标签: swift sprite-kit sprite skspritenode skscene

在我的SKScene中,我正在制作一个简单的太空射击游戏。我怎样才能确保我的敌人总是出现在屏幕尺寸内,无论游戏在哪个iphone上播放?

换句话说,如何计算场景大小的最大和最小X坐标,更重要的是我如何知道当前场景大小取决于运行游戏的iphone?

1 个答案:

答案 0 :(得分:0)

根据iPhone型号不要调整你的场景大小,让Sprite-kit做这样的工作:

scene.scaleMode = SKSceneScaleMode.ResizeFill
  

场景未缩放以匹配视图。相反,场景是   自动调整大小,使其尺寸始终与   观点。

关于大小,首次初始化场景时,其size属性由指定的初始化程序配置。场景的大小以点为单位指定场景的可见部分的大小。这仅用于指定场景的可见部分。

更新以帮助您定位:

如果您想设置您的位置而不是使用scaleMode,您可以 将scene.scaleMode设置为 .AspectFill ,以便在所有场景中使用,场景大小必须为 2048x1536 1536x2048 。这也将使其适用于iPad。

class StartScene: SKScene {
    let playableArea: CGRect!
}

override init(size: CGSize) {

    //1. Get the aspect ratio of the device
    let deviceWidth = UIScreen.mainScreen().bounds.width
    let deviceHeight = UIScreen.mainScreen().bounds.height
    let maxAspectRatio: CGFloat = deviceWidth / deviceHeight
    //2. For landscape orientation, use this
    let playableHeight = size.width / maxAspectRatio
    let playableMargin = (size.height - playableHeight) / 2.0
    playableArea = CGRect(x: 0, y: playableMargin, width: size.width, height: playableHeight)

    //3. For portrait orientation, use this
    let playableWidth = size.height / maxAspectRatio
    let playableMargin = (size.width - playableWidth) / 2.0
    playableArea = CGRect(x: playableMargin, y: 0, width: playableWidth, height: size.height)

    super.init(size: size)
}

因此,您可以使用以下方式定位对象:

ball.position = CGPoint(x: CGRectGetMidX(playableArea), y: CGRectGetMaxY(playableArea) - (ball.size.height * 0.90))

此代码适用于iPhone 4S,5,5S,6,6 Plus,6S,6S Plus和iPad

如果你想看到边框(无论是否调试):

func drawWorkArea() {
    let shape = SKShapeNode()
    let path = CGPathCreateMutable()
    CGPathAddRect(path, nil, workArea)
    shape.path = path
    shape.strokeColor = SKColor.redColor()
    shape.lineWidth = 8
    addChild(shape)
}