gpt4 book ai didi

swift - 为什么同一 SKNode 层中的对象不相互交互?

转载 作者:搜寻专家 更新时间:2023-10-31 08:32:03 24 4
gpt4 key购买 nike

我使用 SpriteKit 还不到 1 年,所以直到最近我才使用 SKNode 作为图层。

我有一个 SKNode 层,它包含所有的鱼和用户的位置,例如:

var layerMainGame = SKNode()
layerMainGame.zPosition = 50
layerMainGame.addChild(userPosition)
layerMainGame.addChild(pipFish)
addChild(layerMainGame)

用户是否触摸鱼的交互是用这个函数处理的,它基本上是检查它们的框架是否交叉:

if CGRectIntersectsRect(CGRectInset(node.frame, delta.dx, delta.dy), self.userPosition.frame) {
print("You got hit by \(name).")
gameOver()
}

它有效。 userPosition 和 pipFish 之间的交互有效。不起作用的是随着游戏的进行而添加的鱼。我有一个函数,可以像这样每隔一段时间产卵不同类型的鱼:

func spawnNew(fish: SKSpriteNode) {
layerMainGame.addChild(fish)
}

用户与稍后在游戏中添加到同一层的那些鱼之间的交互不起作用。我可以直接穿过它们而不会发生游戏结束。当我完全删除整个 layerMainGame 变量并像往常一样将它们添加到场景时,所有交互都有效。将它们全部添加到同一个 SKNode 层是行不通的。

这是为每条鱼创建碰撞碰撞的函数。

func createHitCollisionFor(name: String, GameOver gameOver: String!, delta: (dx: CGFloat, dy: CGFloat), index: Int = -1) {
enumerateChildNodesWithName(name) { [unowned me = self] node, _ in
if CGRectIntersectsRect(CGRectInset(node.frame, delta.dx, delta.dy), self.userPosition.frame) {
me.gameOverImage.texture = SKTexture(imageNamed: gameOver)
didGetHitActions()
me.runAction(audio.playSound(hit)!)
if index != -1 {
me.trophySet.encounterTrophy.didEncounter[index] = true
}
print("You got hit by \(name).")
}
}
}

我这样调用它:

createHitCollisionFor("GoldPiranha", GameOver: model.gameOverImage["Gold"], delta: (dx: 50, dy: 50), index: 1)

当鱼不在图层中时有效,但当它们被添加到图层中时无效。

最佳答案

当一个节点被放置在节点树中时,它的位置属性将它放置在其父节点提供的坐标系中。

Sprite Kit 使用从屏幕左下角 (0, 0) 开始的坐标方向,x 和 y 值随着您向上和向右移动而增加。

  • 对于SKScene,原点-anchorPoint的默认值为(0, 0),对应于 View 框架的左下角长方形。要将其更改为中心,您可以指定 (0.5, 0.5)

  • 对于 SKNode,坐标系原点由其 anchorPoint 定义,默认情况下为 (0.5, 0.5),即节点的中心。

在你的项目中,你有 layerMainGame 添加到场景中,他的 anchorPoint 默认是 (0.5,0.5) 所以像你的鱼这样的 child 的原点是中心,你可以看到如果你像这样改变鱼的位置:

func spawnNew(fish: SKSpriteNode) {
layerMainGame.addChild(fish)
fish.position = CGPointZero // position 0,0 = parent center
}

希望它有助于了解如何解决您的问题。


更新:(在您对主要问题进行更改之后)

为了帮助您更好地理解会发生什么,我将立即举一个例子:

override func didMoveToView(view: SKView) {
var layerMainGame = SKNode()
addChild(layerMainGame)

let pipFish = SKSpriteNode(color: UIColor.yellowColor(), size: CGSizeMake(50,50))
pipFish.name = "son"
self.addChild(pipFish)

let layerPipFish = SKSpriteNode(color: UIColor.yellowColor(), size: CGSizeMake(50,50))
layerPipFish.name = "son"
layerMainGame.addChild(layerPipFish)

enumerateChildNodesWithName("son") { [unowned me = self] node, _ in
print(node)
}
}

输出:

enter image description here

现在我将简单地更改行:

layerMainGame.addChild(layerPipFish)

与:

self.addChild(layerPipFish)

输出:

enter image description here

发生了什么?

如你所见enumerateChildNodesWithName写成你和我的代码只打印直接添加到 self 的 child (因为实际上我们启动 enumerateChildNodesWithName 它等于启动 self.enumerateChildNodesWithName )

如何在全节点树中搜索?

如果您有一个名为“GoldPiranha”的节点,那么 you can search through all descendants通过在名称前加上//。所以你会搜索“//GoldPiranha”:

enumerateChildNodesWithName("//GoldPiranha") { [unowned me = self] ...

关于swift - 为什么同一 SKNode 层中的对象不相互交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39113789/

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