根据不同的显示大小调整SpriteKit视图中的节点大小

时间:2017-10-10 13:57:05

标签: swift sprite-kit

我想用spriteKit视图创建一个通用应用程序 但iPad的显示屏比iPhone显示屏更大!

1)如何根据显示尺寸定位调整大小的节点?我的意思是当我为iPhone屏幕添加一个节点时,我不希望在iPad上这个节点的尺寸等于iPhone上的尺寸,我想要为每个不同的屏幕设置不同大小的相同节点。

2)还有我如何定位这些节点以进行不同的显示?

非常感谢

2 个答案:

答案 0 :(得分:0)

首先为您的应用设置自动保证金:

var gameArea: CGRect

override init(size: CGSize) {

    let maxAspectRatio: CGFloat = 16.0/9.0
    let playableWidth = size.height / maxAspectRatio
    let margin = (size.width - playableWidth) / 2
    gameArea = CGRect(x: margin, y: 0, width: playableWidth, height: size.height)

    super.init(size: size)
}

然后你可以实现你的SKNode

player.physicsBody = SKPhysicsBody(polygonFrom: path)
player.physicsBody!.affectedByGravity = false
player.physicsBody!.categoryBitMask = PhysicsCategories.Player
player.physicsBody!.collisionBitMask = PhysicsCategories.None
player.physicsBody!.contactTestBitMask = PhysicsCategories.Enemy
player.constraints = [SKConstraint.positionX(SKRange(lowerLimit: gameArea.minX + player.size.width/2, upperLimit: gameArea.maxX - player.size.width/2))]`

答案 1 :(得分:0)

  

我希望每个不同的节点具有不同大小的相同节点   屏幕。

如果我理解你想要什么,请在这里答案:

您有两种选择:

1 - https://www.raywenderlich.com/49695/sprite-kit-tutorial-making-a-universal-app-part-1

2 - 以编程方式调整大小:

// code in objc

// defines global
#define IS_IPAD      ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad )
#define IS_IPHONE    ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone )

#define SCALE_FACTOR ( IS_IPAD ? 2 : 1 ) // what ever you want

// usage in  the code
sprite.size = CGSizeMake(width * SCALE_FACTOR, height * SCALE_FACTOR);  

// etc...

修改

该职位始终相对于父母。锚点在这里也很重要。这是一个如何将标签直接添加到场景的示例。标签位置为中间

func addBestScoreLabel(bestScore: Int) {
        let bestScoreLabel = SKLabelNode()

        bestScoreLabel.text = "Best Score: " + String(bestScore)
        bestScoreLabel.fontSize = 20 // what ever
        bestScoreLabel.fontColor = .red // what ever
        bestScoreLabel.zPosition = 10 // what ever
        bestScoreLabel.position = CGPoint(x: self.frame.width/2, y: self.frame.height - bestScoreLabel.frame.height)

        // add the label to the scene
        self.addChild(bestScoreLabel)
    }

// call the function
addBestScoreLabel(bestScore: 1234)