阻止SKSpriteNode离开视图(Swift)

5

你好,我想防止一个SKSpriteNode离开屏幕或者在它触碰到屏幕边界时使其弹回来。当它触碰到屏幕边界时,是否也可以调用一个函数?

我在这里找到了一个相关问题点击

他使用了以下代码:

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
        }

    }

我看到有人说可以设置分类来解决这个问题?这段代码好用吗?


1
你必须查看碰撞检测。请参阅苹果文档:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Physics/Physics.html - chrs
你的场景比你的视图大。尝试在GameViewController.swift中将scaleMode从.AspectFill更改为.ResizeFill。 - 0x141E
@0x141E,我尝试了您的建议,它确实让屏幕左侧弹回,但是在右侧却不起作用。 - Egghead
将物理体声明更改为使用视图的框架而不是场景的框架:let borderBody = SKPhysicsBody(edgeLoopFromRect:view.frame) - 0x141E
由于通用视图控制器不起作用,@0x141E。 - Egghead
显示剩余2条评论
2个回答

3

将物理体设置为屏幕大小

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

嘿,我正在尝试制作一个横向滚动的游戏,有没有办法让这个物理体在玩家移动时跟随他移动? - Frank Boccia

0

是的,这是可能的。

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

  • 然后,您必须在上述SKNode的物理体上设置类别掩码。这是我们可以识别物理体的一种方式。

  • 然后,您必须将上述SKNode的碰撞掩码设置为不希望离开屏幕的节点的类别掩码。这将使节点撞到边框并弹回。

  • 最后,如果将任一对象的contacttestbitmask设置为另一个对象的categorybitmask,则将运行apple函数“didBeginContact”,在其中您可以对其进行处理。

希望能有所帮助!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接