在我的游戏中,相机以英雄为中心,但仅限于x轴。当他向左或向右移动时,相机(场景)与他一起移动,但当他跳跃时保持不变。
可以简单地复制设置:
import SpriteKit
class GameScene: SKScene {
let ship = SKSpriteNode(imageNamed: "Spaceship")
let ground = SKShapeNode(rectOfSize: CGSizeMake(600, 30))
let world = SKNode()
override func didMoveToView(view: SKView) {
self.anchorPoint = CGPointMake(0.5, 0.5)
self.ship.setScale(0.2)
self.ship.physicsBody = SKPhysicsBody(circleOfRadius: self.ship.size.width / 2)
self.ground.position = CGPointMake(0, -200)
self.ground.fillColor = SKColor.redColor()
self.ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(600, 30))
self.ground.physicsBody?.dynamic = false
world.addChild(self.ship)
world.addChild(self.ground)
self.addChild(world)
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.ship.physicsBody?.applyImpulse(CGVectorMake(0, 60))
}
override func didFinishUpdate() {
let cameraPositionInScene = self.convertPoint(self.ship.position, fromNode: world)
// the position is updated only in the x axis
self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
self.world.position.y)
}
}
然而,一旦英雄达到一定高度,我希望相机在y轴上移动(这样他可以继续升高,以防水平上升“在云中”)。
我尝试将didFinishUpdate()函数中的位置更新更改为:
if self.ship.position.y > 100 {
self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
self.world.position.y - cameraPositionInScene.y)
} else {
self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
self.world.position.y)
}
它确实开始跟随船高于一定高度,但从未完全回到原来的位置,我无法弄清楚原因。
答案 0 :(得分:1)
在didFinishUpdate()
方法中,只有当船舶的y坐标高于100时才会改变世界的y坐标。在船舶从105下降到95的情况下,世界&#39; sy坐标不再更新。
我希望删除if语句并始终更新世界位置以考虑您的相机位置以帮助您。
编辑:
我已经提出了一些示例代码,我将使用SKCameraNode,因为我真的认为这样可以避免将来的麻烦。我没有运行这个,所以你可能不得不在这里和那里抵消一些东西。无论有没有SKCameraNode,我都为这样的相机功能编写了代码,这是一个很好的类,框架基本上是免费的。
override func didMoveToView(view: SKView) {
// ...
camera = SKCameraNode()
// ...
}
override func didFinishUpdate() {
var cameraPosition = CGPointMake(self.ship.position)
cameraPosition.y = MAX(0,cameraPosition.y - 100)
self.camera.position = cameraPosition
}