gpt4 book ai didi

ios - 当子类化(也许?)到另一个节点时,SpriteKit Node 给我 nil | swift

转载 作者:行者123 更新时间:2023-11-29 02:25:26 26 4
gpt4 key购买 nike

好吧,所以我正在尝试学习如何创建游戏...我想要一个节点作为相机,这样我就可以移动它并将 View 置于我的玩家节点的中心。当我将玩家节点子类化为世界节点时(我不知道说我子类化它是否正确,也许不是......),应用程序崩溃了。当玩家只是一个节点,GameScene 的“子类”(而不是“世界”节点)时,它会“很好”,我的意思是我可以移动我的玩家(是的,但相机不起作用)。

这是我的代码(//几行意大利语,但不相关)

import SpriteKit

class GameScene: SKScene {

var world: SKNode? //root node! ogni altro nodo del world dev'essere sottoclasse di questo
var overlay: SKNode? //node per l'HUD e altre cose che devono stare sopra al world
var camera: SKNode? //camera node. muovo questo per cambiare le zone visibili

//world sprites
var player: SKSpriteNode!

override func didMoveToView(view: SKView) {
self.anchorPoint = CGPoint(x: 0, y: 0) //center the scene's anchor point at the center of the screen

//world setup
self.world = SKNode()
self.world!.name = "world"
self.addChild(world!)

//camera setup
self.camera = SKNode()
self.camera!.name = "camera"
self.world!.addChild(self.camera!)

//UI setup
self.overlay = SKNode()
self.overlay?.zPosition = 10
self.overlay?.name = "overlay"
addChild(self.overlay!)

player = world!.childNodeWithName("player") as SKSpriteNode!

}

var directionToMove = CGVectorMake(0, 0)

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
for touch: AnyObject in touches {
let location = touch.locationInNode(self)

directionToMove = CGVectorMake((directionToMove.dx + (location.x - player!.position.x)), (directionToMove.dy + (location.y - player!.position.y)))
}
}

override func update(currentTime: CFTimeInterval) {
//*these both print the string*
if player == nil {
println("player is nil")
}
if player?.physicsBody == nil {
println("player.physicsBody is nil")
}
//*here it crashes*
player!.physicsBody!.applyForce(directionToMove)
}

override func didFinishUpdate() {
if self.camera != nil {
self.centerOnNode(self.camera!)
}
}

func centerOnNode(node: SKNode) {
let cameraPositionInTheScene: CGPoint = node.scene!.convertPoint(node.position, fromNode: node.parent!)
node.parent!.position = CGPoint(x: node.parent!.position.x - cameraPositionInTheScene.x, y: node.parent!.position.y - cameraPositionInTheScene.y)
}
}

提前致谢:)

最佳答案

您的播放器是nil,因为您正在从空的world 节点访问它。默认情况下,玩家是场景的 child 。您可以通过设置节点的父属性在场景编辑器中更改此设置(参见图 1)。

enter image description here

图 1. SpriteKit 场景编辑器的属性检查器

我建议您进行以下更改:

  1. 在场景编辑器中创建 worldoverlaycamera 节点,并使用 childNodeWithName 访问它们/li>
  2. 将玩家添加到场景中,而不是世界,并将其固定在场景中间
  3. 移动相机节点而不是玩家。 didFinishUpdate 中的代码将自动调整世界,使相机在场景中居中。您可以向相机添加一个物理体,并通过施加力/脉冲或设置其速度来移动它。
  4. 将其他 Sprite 添加到世界(而不是场景)

如果您将其他 Sprite 添加到世界中,当您调整世界位置以使相机居中时,它们会适当移动。然后您需要相对于世界移动其他 Sprite 。场景只是一次查看世界的一部分的窗口。

关于ios - 当子类化(也许?)到另一个节点时,SpriteKit Node 给我 nil | swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27611724/

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