首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Swift 3中删除SKNode与SKPhysicsWorld边界的接触

在Swift 3中删除SKNode与SKPhysicsWorld边界的接触
EN

Stack Overflow用户
提问于 2016-06-30 16:53:02
回答 1查看 228关注 0票数 0

我期待创造一个独特的IOS应用程序的开放屏幕,我希望有一个球下降的背景,以创造视觉兴趣。我正在didMove()函数中创建球,它们工作得很好,但只有一些时间。我认为这个框架太大,不能显示,这使得随机的X和Y坐标有时出现在屏幕外。

代码语言:javascript
复制
self.physicsWorld.gravity = CGVector.init(dx: 0, dy: -9.8)

    let sceneBody = SKPhysicsBody(edgeLoopFrom: self.frame)
    sceneBody.friction = 0
    self.physicsBody = sceneBody

    let minXValue: CGFloat = 0
    let maxXValue: CGFloat = self.frame.size.width

    let minYValue: CGFloat = 0
    let maxYValue: CGFloat = self.frame.size.height

    let wait = SKAction.wait(forDuration: 0.4)
    let run = SKAction.run {


        let randomXNumber = (CGFloat(arc4random()).truncatingRemainder(dividingBy: maxXValue)) + minXValue
        let randomYNumber = (CGFloat(arc4random()).truncatingRemainder(dividingBy: maxYValue)) + minYValue

        print("Random Y Number: \(randomYNumber)")
        print("Random X Number: \(randomXNumber)")

        let ball = SKShapeNode(circleOfRadius: 20)
        ball.fillColor = SKColor(colorLiteralRed: 212.0, green: 217.0, blue: 128.0, alpha: 1)
        ball.position = CGPoint.init(x: randomXNumber, y: randomYNumber)
        ball.physicsBody = SKPhysicsBody(circleOfRadius: 20)
        ball.physicsBody?.affectedByGravity = true
        self.addChild(ball)

    }

    self.run(SKAction.repeatForever(SKAction.sequence([wait, run])))

这是我的随机球代码。

我还希望这些球在到达容器底部时从视图中移除,以便提高所有设备的性能,而不存在冗余节点。

我需要哪些函数或代码块来实现这个概念?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-01 15:30:44

设置场景大小

在GameViewController.swift中,找到函数viewDidLoad,并在skView.presentScene(场景)上方添加以下一行

代码语言:javascript
复制
scene.size  = skView.bounds.size 

视图中删除球

要将球从场景中移除,您可以检测到场景周围的edgeLoop与球之间发生了冲突。那就打电话给removeFromParent。

首先,将类声明更改如下:

class GameScene: SKScene, SKPhysicsContactDelegate

然后添加

physicsWorld.contactDelegate = self in didMoveToView.

其次,在GameScene.swift中的类声明之上,创建物理类别:

代码语言:javascript
复制
enum PhysicsCategory:UInt32
{
    case edge = 1
    case ball = 2
}

接下来,将这些类别分配到边缘和球。(在sceneBody下添加前两行并插入第三行,其中定义了其他球物理属性):

代码语言:javascript
复制
self.physicsBody?.categoryBitMask = PhysicsCategory.edge.rawValue
self.physicsBody?.contactTestBitMask = PhysicsCategory.ball.rawValue
ball.physicsBody?.categoryBitMask = PhysicsCategory.ball.rawValue

最后,检查碰撞情况:

代码语言:javascript
复制
func didBeginContact(contact: SKPhysicsContact) {
   let firstBody = contact.bodyA
   let secondBody = contact.bodyB

   if firstBody.categoryBitMask == PhysicsCategory.edge.rawValue && secondBody.categoryBitMask == PhysicsCategory.ball.rawValue || firstBody.categoryBitMask == PhysicsCategory.ball.rawValue && secondBody.categoryBitMask == PhysicsCategory.edge.rawValue
   {
      if firstBody.categoryBitMask == PhysicsCategory.ball.rawValue {
         firstBody.node?.removeFromParent()
         } else {
         secondBody.node?.removeFromParent()
      }
   }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38129175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档