为什么同一 SKNode 层中的对象彼此不交互?

2024-01-05

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

我有一个 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 值随着向上和向右移动而增加。

  • For SKScene,原点的默认值 –anchorPoint是 (0, 0),它对应于视图框架矩形的左下角。要将其更改为中心,您可以指定 (0.5, 0.5)

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

在你的项目中你有layerMainGame例如添加到场景中,他的锚点默认为(0.5,0.5),因此像你的鱼这样的孩子的原点是中心,如果你改变鱼的位置,你可以看到它,例如:

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

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


Update:(在更改主要问题后)

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

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)
        }
}

Output:

现在我将简单地更改该行:

layerMainGame.addChild(layerPipFish)

with:

self.addChild(layerPipFish)

Output:

发生了什么?

如你看到的枚举ChildNodesWithName https://developer.apple.com/reference/spritekit/sknode/1483024-enumeratechildnodeswithname?language=objc编写为你和我的代码,仅打印直接添加到的子项self(因为实际上我们推出enumerateChildNodesWithName它等于启动self.enumerateChildNodesWithName )

如何在全节点树中进行搜索?

如果您有一个名为“GoldPiranha”的节点,那么您可以搜索所有后代 https://developer.apple.com/reference/spritekit/sknode#1654468在名称前添加 //。所以你会搜索“//GoldPiranha”:

enumerateChildNodesWithName("//GoldPiranha") { [unowned me = self] ...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么同一 SKNode 层中的对象彼此不交互? 的相关文章

  • Swift 将十进制坐标转换为度、分、秒、方向

    我怎样才能将其转换为快速 我最好的猜测是所有 int 都变成了 var 删除所有导致 的 此外 如果有的话可以给我指出一个很好的来源来了解事物如何转换 那就太好了 NSString coordinateString int latSecon
  • 使用 Core Data Swift 对 TableView 和行进行分区

    我在 sqlite 中有两个表 代码由 XCode Generation 生成 class Event NSManagedObject NSManaged var startDate NSDate NSManaged var details
  • 如何在运行时更改 UIMenu 内 UIAction 的状态?

    如何更改 UIAction 的状态 目标是切换 UIMenu 内 UIAction 旁边的状态复选标记 更改 UIAction 的state通过存储在视图控制器中的引用似乎根本不会改变状态 我错过了什么吗 View Controller i
  • Swift 为 .toInt 提供Optional(3) 而不是 3

    尝试从字段中提取数字并继续获取可选 数字 而不是数字 IBOutlet weak var years UITextField IBAction func calculateYear sender AnyObject var a years
  • 如何使用 Unicode 十六进制值 (UTF-16) 在 Swift 中表达字符串

    我想在 Swift 中使用十六进制值编写 Unicode 字符串 我已阅读文档 https developer apple com library prerelease ios documentation Swift Conceptual
  • 为什么我的matchedGeometryEffect根据右下点移动?

    我只是尝试使用matchedGeometryEffect 制作一些动画 但是 存在一个错误 即该对象是根据右下点而不是中心进行动画处理的 我使用的代码在这里 import SwiftUI struct Test View Namespace
  • 平滑地将渐变应用于 UIImage

    我正在尝试使用 CoreGraphic 将渐变应用于 UIImage 然而 我得到的结果不是很好 我想在图像底部创建一个黑色到透明的渐变 以便为我放置一些文本创建对比度 然而 我能够实现的渐变与图像不能很好地融合 你可以清楚地看到中心的分离
  • 在 Swift 中使用 Obj-C 完成块

    在 Objective C 中 我有一个完成块类定义为 File h typedef void MYCompletionBlock BOOL success NSDictionary result NSError error 然后 在 Sw
  • Swift iOS 9.2 中的每日本地通知

    尝试快速发送每日本地通知 然而 由于某种原因 它只是每分钟发送一次 我希望第一个通知在应用程序打开后 30 分钟发送 然后每天重复此通知 在 swift fie 中我有以下代码 每日通知代码 同时在应用程序委托中添加部分 让 Date NS
  • 签名根框架中嵌入的子框架不起作用(Xcode 11.2.1)

    我有一个小型的概念验证应用程序 我试图在我的框架 AequumPOCFramework framework 中嵌入 并签名 一个框架 Alamofire 但是 当我尝试部署到我的设备时 它不断给出我的错误 在使用库验证的进程中使用无效 映射
  • 精灵套件的方向键

    我有兴趣尝试创建一些游戏 即新的精灵套件 然而 对于我想要的游戏 我宁愿使用方向键而不是操纵杆 由于我将从 Cocos 转移过来 我的旧程序不再起作用 所以那个 dpad 也不起作用 遗憾的是 我还没有遇到任何可能有助于在新的精灵套件中实现
  • 呈现 UIActivityViewController 时发出警告

    当我提出一个UIActivityController使用我得到的下面的代码 它被呈现 但控制台显示 Warning Attempt to present
  • 如何在 Swift 中证明 String 类型的“写时复制”

    正如标题所说 我试图证明自己 Swift 中的 String 支持 COW copy on write 但我找不到证据 在尝试以下代码后 我在数组和字典上证明了 COW func address of object UnsafeRawPoi
  • 如何在 tvOS 中添加检测按钮按下情况?

    我已经遵循这个tutorial http jamesonquave com blog developing tvos apps for apple tv with swift 一切正常 我遇到的唯一问题是我不知道如何检测何时按下按钮 提前致
  • 无法发出桥接标头的预编译标头

    我从 GitHub 下载了一个项目 然后 pod 了以下文件 其中一些文件是由 OBJ C 编写的 我使用了桥接头 pod SnapKit pod MJRefresh pod Alamofire pod Kingfisher pod MBP
  • UIView 内的 UIButton 目标操作

    我有一个习惯UIView我创建了一个UIButton 在该视图中 我有以下代码 func setupViews menuControlButton addTarget self action toggleButton forControlE
  • 如何在 Swift 编程中获得基于导航的模板功能

    我的项目需要一个导航控制器 并且我的应用程序最初有一个社交登录 一旦验证通过 用户将被推送到另一个视图 我在其中显示一个具有 2 个选项卡的选项卡控制器 我不知道如何在 Swift 编程中做到这一点 我已将视图控制器嵌入到导航控制器中 一旦
  • AVPlayerLooper 每次迭代后黑闪

    我正在使用 Apple 的示例代码在UICollectionViewCell背景 我在用着AVPlayerLooper 因为它是同一视频的迭代 我的问题是 当视频结束时 它会显示轻微的黑屏闪烁 也许它正在将视频搜索到0时间 我不确定 这是代
  • xCode 7.1 中警报的 UITesting

    我正在 xCode 7 1 中编写 UITests 并且在测试警报时遇到问题 在我的情况下允许通知 创建测试时 xCode 会写入以下代码 app alerts U201cAppName U201d Would Like to Send Y
  • 滚动视图下的iOS swift 4 imageview:双击缩小

    我已经应用了图像视图来通过捏合来放大 缩小 那很容易 当在图像视图上应用双击时 无法检测到选择方法 我使用 Xcode 9 和 swift 4 您能告诉我滚动视图是否应该应用双击手势吗 var previewImage UIImage ni

随机推荐