gpt4 book ai didi

ios - SpriteKit - SKCameraNode 视差效果?

转载 作者:搜寻专家 更新时间:2023-10-31 22:02:58 25 4
gpt4 key购买 nike

我一直在试验 SKCameraNode,但我找不到任何关于用它创建视差效果的信息。

假设我在上面的代码中添加了一个 behindNode 在我的 baseNode 下面。然后我为相机设置动画。

let behindNode = SKNode()
addChild(behindNode)

let blueSquare = SKSpriteNode(color: SKColor.blueColor(), size: CGSize(width: 80, height: 80))
blueSquare.position = CGPoint(x: size.width/2+40, y: size.height/2+40)
behindNode.addChild(blueSquare)

let baseNode = SKNode()
addChild(baseNode)

let redSquare = SKSpriteNode(color: SKColor.redColor(), size: CGSize(width: 80, height: 80))
redSquare.position = CGPoint(x: size.width/2, y: size.height/2)
baseNode.addChild(redSquare)


let cameraNode = SKCameraNode()
camera = cameraNode
addChild(camera!)
camera!.position = redSquare.position

cameraNode.runAction(SKAction.sequence([
SKAction.waitForDuration(1),
SKAction.moveBy(CGVector(dx: 100, dy: 100), duration: 3),
SKAction.moveBy(CGVector(dx: -100, dy: 100), duration: 1),
SKAction.moveBy(CGVector(dx: 100, dy: -100), duration: 1)
]))

enter image description here

当相机移动时,我需要蓝色方 block 相对于红色方 block 以较慢的速度移动。我希望相机节点有一个相对位置字典或其他东西,但它没有......

最佳答案

我创建了一个不处理秒或帧的解决方案。

您可以创建 SKCameraNode 的子类并使用 Swift 的 didSet() 方法,该方法在类变量更改后被调用。在我们的例子中,我们想要监听相机节点位置变量的变化。

class CameraNodeParallax:SKCameraNode{

override var position : CGPoint {
didSet {
// Move our backgrounds
}
}

我们还想创建一个包含所有视差背景节点的数组和一个包含与相机移动速度相关的相应移动速度的数组。

var backgroundNodes:[SKNode] = []
var backgroundNodesSpeedFactor:[CGVector] = [] // in relation to camera nodes speed

func addParallaxBackgroundNode(background:SKNode, vector:CGVector) {
backgroundNodes.append(background)
backgroundNodesSpeedFactor.append(vector)
}

填充我们新变量的 init() 可能也很有用

init(position:CGPoint) {
super.init()
self.position = position
}

现在我们可以填充我们的 didSet() 监听器:

// Move our backgrounds
var i = 0
for node in backgroundNodes {

let positionChangeX = position.x-oldValue.x
let positionChangeY = position.y-oldValue.y
let changeX = positionChangeX*backgroundNodesSpeedFactor[i].dx
let changeY = positionChangeY*backgroundNodesSpeedFactor[i].dy
node.position = CGPointMake(node.position.x+changeX,node.position.y+changeY)

i += 1
}

最终代码如下所示:

class CameraNodeParallax:SKCameraNode{

var backgroundNodes:[SKNode] = []
var backgroundNodesSpeedFactor:[CGVector] = [] // in relation to camera nodes speed

init(position:CGPoint) {
super.init()
self.position = position
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override var position : CGPoint {
didSet {

// Move your parallax backgrounds
var i = 0
for node in backgroundNodes {

let positionChangeX = position.x-oldValue.x
let positionChangeY = position.y-oldValue.y
let changeX = positionChangeX*backgroundNodesSpeedFactor[i].dx
let changeY = positionChangeY*backgroundNodesSpeedFactor[i].dy
node.position = CGPointMake(node.position.x+changeX,node.position.y+changeY)

i += 1
}
}
}

func addParallaxBackgroundNode(background:SKNode, vector:CGVector) {
backgroundNodes.append(background)
backgroundNodesSpeedFactor.append(vector)
}
}

我在这里创建了一个不从 SKCameraNode 继承的替代实现 https://github.com/gitmalong/lovelySpriteKitHelpers/blob/master/ParallaxBackgroundMover.swift

关于ios - SpriteKit - SKCameraNode 视差效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32568356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com