2014-10-09 28 views
3

你好,我想阻止SKSpriteNode离开屏幕或使它在点击屏幕边界时弹回。当它触及边界时是否也可以调用一个函数?停止SKSpriteNode离开视图(Swift)

如果发现这个问题Click

在那里他使用此代码:

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

但由于某些原因,它只能从移出顶部和bottem的挡住了我的节点(这是动态的),但它能够移出一边。

(记住,即时通讯新SpriteKit和斯威夫特保持)

编辑:我发现这个代码:

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

你不得不考虑碰撞检测的大小。请参阅Apple的文档:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/SpriteKit_PG/Physics/Physics.html – chrs 2014-10-09 17:04:38

+0

您的场景比您的视图大。尝试将.AspectFill中的scaleMode更改为GameViewController.swift中的.ResizeFill。 – 0x141E 2014-10-09 17:25:29

+0

@ 0x141E,我试过你的建议,它使屏幕左侧反弹回来,但在右侧它不起作用..? – Egghead 2014-10-09 20:56:37

回答

0

是的,这是可能的。

  • 你必须设置一个带有rect类型的物理体的SKNode,并赋予它self.size的大小。这将为屏幕边界创建一个物理主体。

  • 然后你必须在上面的SKNode的物理体上设置一个类别位掩码。这是我们可以识别我们的物理机构的一种方式。

  • 然后,你必须给上面的SKNode一个collisionbitmask,它等于你不想离开屏幕的Node的categorybitmask。这将使节点崩溃到边界并弹回。

  • 最后,如果将contacttestbitmask设置为另一个的categorybitmask。苹果功能“didBeginContact”将运行,并在那里你可以做一些事情。

希望帮助!

1

物理体设置在屏幕

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