将场景锁定到精灵节点 swift xcode
Locking scene to a sprite node swift xcode
基本上,我想移动角色(玩家)并让“相机”或场景跟随他们。问题是 Apple/xcode 没有内置相机节点,如果我尝试移动场景,我会收到一条错误消息,提示“无法移动 SKScene”。我不想只是移动背景并将玩家锁定到位,因为我希望能够对玩家节点施加力。我已访问 Apple 网站的“高级场景处理”页面并按照示例进行操作,但它不起作用。我只需要朝着正确的方向轻推。谢谢!
代码:
(I have deleted pieces of code that are irrelevant)
class PlayScene: SKScene, SKPhysicsContactDelegate {
let world = SKNode()
let player = SKShapeNode(circleOfRadius: 25)
var cannonRotation = 0.0
var fired = false
override func didMoveToView(view: SKView) {
physicsWorld.contactDelegate = self
self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.addChild(world)
//Adds the background to the world
//Adds the elements to the scene
player.fillColor = UIColor.whiteColor()
player.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMinY(self.frame)+65+25)
player.zPosition = 2
player.physicsBody = SKPhysicsBody(circleOfRadius: 25)
player.physicsBody?.dynamic = true
player.physicsBody?.restitution = 0.9
player.physicsBody?.categoryBitMask = BodyType.player.rawValue
//Adds the physics properties to GameScene
let physicsGround = SKPhysicsBody(edgeFromPoint: CGPoint(x: CGRectGetMinX(self.frame), y: CGRectGetMinY(self.frame)+65), toPoint: CGPoint(x: CGRectGetMaxX(self.frame), y: CGRectGetMinY(self.frame)+65))
self.physicsBody = physicsGround
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
powerLevel()
totalPower = powerReached * playCannon.powerMultiplier
self.addChild(player)
player.physicsBody?.applyImpulse(CGVector(dx: CGFloat(Float(totalPower)*cosf(Float(cannonRotation))), dy: CGFloat(Float(totalPower)*sinf(Float(cannonRotation)))))
fired = true
}
覆盖 didsimulatePhysics,并在该函数中调用此
self.centerOnNode(player);
它的作用是,它调用我们稍后将创建的函数并发送 SKNode 的参数,在您的情况下它是 player
节点。接下来创建一个名为 centerOnNede
的方法并添加以下参数
func centerOnNode(node: SKNode) {
}
在 centerOnNode
函数中添加以下代码行。
var cameraPosition: CGPoint = node.scene?.convertPoint(node.position, fromNode: node.parent!)
cameraPosition.x = 0
let posX = node.parent?.position.x
let posY = node.parent?.position.y
node.parent?.position = CGPointMake(posX! - cameraPosition.x, posY! - cameraPosition.y)
这将使相机在节点上居中并更新它的位置。从这里转换的代码。 How to make camera follow SKNode in Sprite Kit?
Apple Adventure参考游戏中有how to do this的详细示例。它有 Swift 和 Objective-C 个例子。
总而言之,他们推荐的是
- 将所有节点放在后台节点(SKNode)容器中。
- 实施 didSimulatePhysics 并向玩家相反的方向移动世界。这将使玩家保持在屏幕中间。如果你想让相机撞到你的世界的边缘,就需要特殊的逻辑。
相机节点会很有帮助,但尚未在 SpriteKit 中实现。
从 iOS9 开始,现在有一个 SKCameraNode 可以为您完成所有繁重的工作。
只需在您的 didMoveToView 函数中添加以下三行代码:
let cameraNode = SKCameraNode()
self.addChild(cameraNode)
self.camera = cameraNode
然后在您的 didFinishUpdate 函数中将 cameraNode 的位置设置为您希望它跟随的任何 SKSpriteNode。
基本上,我想移动角色(玩家)并让“相机”或场景跟随他们。问题是 Apple/xcode 没有内置相机节点,如果我尝试移动场景,我会收到一条错误消息,提示“无法移动 SKScene”。我不想只是移动背景并将玩家锁定到位,因为我希望能够对玩家节点施加力。我已访问 Apple 网站的“高级场景处理”页面并按照示例进行操作,但它不起作用。我只需要朝着正确的方向轻推。谢谢!
代码:
(I have deleted pieces of code that are irrelevant)
class PlayScene: SKScene, SKPhysicsContactDelegate {
let world = SKNode()
let player = SKShapeNode(circleOfRadius: 25)
var cannonRotation = 0.0
var fired = false
override func didMoveToView(view: SKView) {
physicsWorld.contactDelegate = self
self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
self.addChild(world)
//Adds the background to the world
//Adds the elements to the scene
player.fillColor = UIColor.whiteColor()
player.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMinY(self.frame)+65+25)
player.zPosition = 2
player.physicsBody = SKPhysicsBody(circleOfRadius: 25)
player.physicsBody?.dynamic = true
player.physicsBody?.restitution = 0.9
player.physicsBody?.categoryBitMask = BodyType.player.rawValue
//Adds the physics properties to GameScene
let physicsGround = SKPhysicsBody(edgeFromPoint: CGPoint(x: CGRectGetMinX(self.frame), y: CGRectGetMinY(self.frame)+65), toPoint: CGPoint(x: CGRectGetMaxX(self.frame), y: CGRectGetMinY(self.frame)+65))
self.physicsBody = physicsGround
}
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
powerLevel()
totalPower = powerReached * playCannon.powerMultiplier
self.addChild(player)
player.physicsBody?.applyImpulse(CGVector(dx: CGFloat(Float(totalPower)*cosf(Float(cannonRotation))), dy: CGFloat(Float(totalPower)*sinf(Float(cannonRotation)))))
fired = true
}
覆盖 didsimulatePhysics,并在该函数中调用此
self.centerOnNode(player);
它的作用是,它调用我们稍后将创建的函数并发送 SKNode 的参数,在您的情况下它是 player
节点。接下来创建一个名为 centerOnNede
的方法并添加以下参数
func centerOnNode(node: SKNode) {
}
在 centerOnNode
函数中添加以下代码行。
var cameraPosition: CGPoint = node.scene?.convertPoint(node.position, fromNode: node.parent!)
cameraPosition.x = 0
let posX = node.parent?.position.x
let posY = node.parent?.position.y
node.parent?.position = CGPointMake(posX! - cameraPosition.x, posY! - cameraPosition.y)
这将使相机在节点上居中并更新它的位置。从这里转换的代码。 How to make camera follow SKNode in Sprite Kit?
Apple Adventure参考游戏中有how to do this的详细示例。它有 Swift 和 Objective-C 个例子。
总而言之,他们推荐的是
- 将所有节点放在后台节点(SKNode)容器中。
- 实施 didSimulatePhysics 并向玩家相反的方向移动世界。这将使玩家保持在屏幕中间。如果你想让相机撞到你的世界的边缘,就需要特殊的逻辑。
相机节点会很有帮助,但尚未在 SpriteKit 中实现。
从 iOS9 开始,现在有一个 SKCameraNode 可以为您完成所有繁重的工作。
只需在您的 didMoveToView 函数中添加以下三行代码:
let cameraNode = SKCameraNode()
self.addChild(cameraNode)
self.camera = cameraNode
然后在您的 didFinishUpdate 函数中将 cameraNode 的位置设置为您希望它跟随的任何 SKSpriteNode。