gpt4 book ai didi

swift - enumerateChildNodes 在 Sprite 工具包中找不到子节点 - Swift 4

转载 作者:搜寻专家 更新时间:2023-11-01 07:04:55 24 4
gpt4 key购买 nike

我正在尝试创建一个球在屏幕上移动的 SpriteKit 游戏。当球离开屏幕时,我想将其从父级移除并切换到不同的场景 (GameOverScene)。

我正在使用 enumerateChildNodes 但是它好像不起作用。我不太确定问题出在哪里,但我认为这可能与父/子关系有关...

func createBall(forTrack track: Int) {

setupTracks()

player?.physicsBody?.linearDamping = 0

player = SKSpriteNode(imageNamed: "small")
player?.name = "BALL"
player?.size = CGSize(width: 100, height: 100)
ballValue = 1
randFloat = Float(arc4random()) / Float(UINT32_MAX)

if randFloat > 0.001 {
ballSpeed = randFloat / 50
}
else {
ballSpeed = randFloat / 50
}

let ballPosition = trackArray?[track].position

player?.position = CGPoint(x: (ballPosition?.x)!, y: (ballPosition?.y)!)
player?.position.y = (ballPosition?.y)!

if ballDirection == "right" {
player?.position.x = 0
moveRight()
}
else {
player?.position.x = (self.view?.frame.size.height)!
moveLeft(speed: ballSpeed)
}

self.addChild(player!)

self.enumerateChildNodes(withName: "BALL") { (node: SKNode, nil) in
if node.position.x < -100 || node.position.x > (self.size.width) + 100 {
print("balls Out")
node.removeFromParent()
let transition = SKTransition.fade(withDuration: 1)
self.gameScene = SKScene(fileNamed: "GameOverScene")
self.gameScene.scaleMode = .aspectFit
self.view?.presentScene(self.gameScene, transition: transition)
}
}

}

我调用这个函数两次,第一次是在 override func didMove() 中:

override func didMove(to view: SKView) {

createHUD()
createBall(forTrack: track)

}

第二个是 override func touchesBegan:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let location = touch.previousLocation(in: self)
let node = self.nodes(at: location).first

if node?.name == "BALL" {
currentScore += ballValue
player?.removeFromParent()
createBall(forTrack: track)
}
else {
let transition = SKTransition.fade(withDuration: 1)
gameScene = SKScene(fileNamed: "GameOverScene")
gameScene.scaleMode = .aspectFit
self.view?.presentScene(gameScene, transition: transition)
}
}
}

更新:

中的 self.enumerateChildNodes(withName: "BALL") { (node: SKNode, nil) 行有效,因此这不是子父关系问题。 if 语句 不工作。

最佳答案

阅读您的代码我认为这与解决方案无关,而是一种不同的方法。这些建议将使您的生活更轻松:

  1. 从较小的代码开始,避免或注释掉所有不需要的代码(如 if randFloat)
  2. ! 强制展开 player = SKSpriteNode(imageNamed: "small")! 因为如果初始化失败你真的想崩溃,那么你可以摆脱全部?
  3. 在 touchesBegan 中,最好使用 for touch in touches { 因为它更易于管理
  4. let location = touch.previousLocation(in: self) 你的意思可能是let location = touch.location(in: self)
  5. 当球离开屏幕时,我想将它从父级中移除,所以这是游戏中某个时间发生的事情。您希望将您的 self.enumerateChildNodes(withName: "BALL") { 调用到更新调用中,而不是每次触摸屏幕时

如果这还不够,请随时发布最少量的代码来制作 Playground ,让我为您测试一下:]

关于swift - enumerateChildNodes 在 Sprite 工具包中找不到子节点 - Swift 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48673372/

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