停止 SKSpriteNode 离开视图 (Swift)

Posted

技术标签:

【中文标题】停止 SKSpriteNode 离开视图 (Swift)【英文标题】:Stop SKSpriteNode from leaving view (Swift) 【发布时间】:2014-10-09 17:01:01 【问题描述】:

您好,我想防止 SKSpriteNode 离开屏幕或让节点在碰到屏幕边框时弹回。是否也可以在到达边界时调用函数?

如果发现这个问题Click

他在哪里使用此代码:

let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
self.physicsBody = borderBody
borderBody.friction = 0.0
borderBody.restitution = 1.0

但由于某种原因,它只会阻止我的节点(它是动态的)移出顶部和底部,但它能够移出侧面。

(请记住,我是 SpriteKit 和 Swift 的新手)

编辑:我找到了这段代码:

extension GameScene: SKPhysicsContactDelegate 
    func didBeginContact(contact: SKPhysicsContact!) 
        let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

        switch (contactMask) 
        case BodyType.pipe.toRaw() |  BodyType.bomb.toRaw():
            println("Contact with a bomb")
            if contact.bodyA.categoryBitMask == BodyType.pipe.toRaw() 
                explode(pipe: contact.bodyA.node as SKSpriteNode)
             else 
                explode(pipe: contact.bodyB.node as SKSpriteNode)
            
        case BodyType.pipe.toRaw() |  BodyType.bird.toRaw():
            println("Contact with a pipe")
            bird.pushDown()
        case BodyType.ground.toRaw() | BodyType.bird.toRaw():
            println("Contact with ground")
            for actor in actors 
                actor.stop()
            

            let shakeAction = SKAction.shake(0.1, amplitudeX: 20)
            screenNode.runAction(shakeAction)
        default:
            return
        

    

我读到它类似于设置类别?这段代码好用吗?

【问题讨论】:

您必须查看碰撞检测。请参阅 Apple 的文档:developer.apple.com/library/ios/documentation/GraphicsAnimation/… 您的场景比您的视野大。尝试在 GameViewController.swift 中将 scaleMode 从 .AspectFill 更改为 .ResizeFill。 @0x141E,我尝试了你的建议,它使屏幕左侧弹回,但在右侧它不起作用..? 更改你的物理体声明以使用视图的框架而不是场景的框架:let borderBody = SKPhysicsBody(edgeLoopF​​romRect: view.frame) @0x141E,由于通用视图控制器不起作用 【参考方案1】:

将物理体设置为屏幕大小

self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)

【讨论】:

嘿,我正在做一个横向卷轴游戏,有没有办法让这个物理体移动并在玩家移动时跟随玩家?【参考方案2】:

是的,这是可能的。

您必须设置一个 SKNode,其物理体类型为 rect,并为其设置 self.size 的大小。这将为屏幕边框创建一个物理体。

那么你必须在上面SKNode的物理体上设置一个categorybitmask。这是我们识别物理体的一种方式。

然后你必须给上面的 SKNode 一个碰撞位掩码,它等于你不想离开屏幕的节点的 categorybitmask。这会使节点崩溃到边界并反弹回来。

最后,如果将其中一个的contacttestbitmask设置为另一个的categorybitmask。将运行苹果函数“didBeginContact”,您可以在其中执行一些操作。

希望有帮助!

【讨论】:

以上是关于停止 SKSpriteNode 离开视图 (Swift)的主要内容,如果未能解决你的问题,请参考以下文章

jQuery 事件处理程序在离开视图时停止工作

SKSpriteNode 从场景中移除后如何停止音频(Swift)?

IB_DESIGNABLE 使 Xcode 在离开情节提要时停止响应

当您离开视图时如何在 Swift 中停用 AVPlayer

从 iBeacon 接近控制视图

UIImagePickerController 不会停止位置服务