swift - iOS Sprite 接触检测

标签 swift sprite-kit

我正在开发一款角色可以爬梯子的平台游戏。由于每个梯子的总长度各不相同,因此我在 SceneEditor 中将多个梯子堆叠在一起。进入梯子后,联系人代表工作正常,我的代码允许角色向上移动。我遇到的问题是,一旦角色离开第一个阶梯段,didEnd 方法就会触发,即使角色已经进入下一个阶梯段。我已经通过给定阶梯段不同的类别掩码来绕过它。这是唯一的方法吗?

最佳答案

尝试将阶梯重叠 1 个梯级,然后设置一个计数,每当触发 didBegin 接触时将值增加 1 每当调用 didEnd 时将值减 1。在 didEnd 函数结束时检查是否 onladderCount = = 0。如果是,则触发当玩家不在梯子上时应该触发的任何代码。

这假设您有一个阶梯类,并且必须在阶梯类中为 onLadder 放置一个属性,以确保 += 1 不会被多次调用。

var onladderCount: Int = 0

func didBegin(_ contact: SKPhysicsContact) {

    let contactAName = contact.bodyA.node?.name
    let contactBName = contact.bodyB.node?.name

    if (contactAName == "ladder") || (contactBName == "ladder") {

        let ladder: Ladder? = (contact.bodyA.categoryBitMask == PhysicsCategory. ladder ? (contact.bodyA.node as? Ladder) : (contact.bodyB.node as? Ladder))
        if !ladder.onLadder {
            ladder.onLadder = true
            onladderCount += 1
        }
    }
}

func didEnd(_ contact: SKPhysicsContact) {

    let contactAName = contact.bodyA.node?.name
    let contactBName = contact.bodyB.node?.name

    if (contactAName == "ladder") || (contactBName == "ladder") {

        let ladder: Ladder? = (contact.bodyA.categoryBitMask == PhysicsCategory. ladder ? (contact.bodyA.node as? Ladder) : (contact.bodyB.node as? Ladder))
        if ladder.onLadder {
            ladder.onLadder = false
            onladderCount -= 1
        }
    }

    if onladderCount == 0 {
        //trigger whatever code happens when they leave a ladder
    }
}

关于swift - iOS Sprite 接触检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48176197/

相关文章:

ios - 向游戏中的移动物体发射弹丸

swift - 如何在 Swift 3.0 中拖放 Sprite ?

objective-c - 由于 iOS9 升级 SpriteKit 图片不再正确显示

ios - 用户界面测试 : Simulate a shake gesture with Swift

ios - UIView 的宽度不会根据约束改变

ios - Segue 在 iOS 中首次调用时非常慢

swift - 如何在 Swift 中添加按钮来关闭模式

ios - 检测触摸是否在 Sprite 边界内,但忽略 child

sprite-kit - Sprite 套件 SKAction repeatActionForever 随机等待持续时间

swift - 在 XCode 9.3 上运行 UnitTest 时 RxSwift 崩溃