如何在spawning spritekitnodes上设置physicsBody

时间:2017-03-15 18:17:34

标签: ios swift xcode sprite-kit skphysicsbody

我有物理身体的问题。我有大约20个节点随机产生查看。每次节点产生时我都会设置对象的物理,如下所示:

        this.router.navigate(['/']);
      }
    });
  }

  ngOnInit() {
    this.firebaseService.getListings().subscribe(listings => {
      this.listings = listings;
      console.log(listings);
    });
  }

}

我认为这不是最优的,因为每次生成节点时都会设置physicsBody。因此,我有时几乎没有闪烁 - 应用程序运行时降低fps。物理关闭什么时候关闭,一切都好。所以我有一个简单的问题。如何在游戏开始后为所有20个节点设置物理主体,而不是仅在不创建physicsBody的情况下生成它们。我尝试将带有纹理的物理体直接设置为SKView,但在此之后,应用程序崩溃,出现nil错误。

感谢您的任何提示。

有我的spawn:

{ {2}}

1 个答案:

答案 0 :(得分:2)

有很多不同的方法可以解决这个问题,如果我产生多个相同的对象,我喜欢做的事情就是将对象预加载到数组中,并在需要时从数组中拉出它们,当你是完成对象,你可以从场景中删除它们,但将它们保存在数组中。然后,您可以再次使用该对象,而无需重新创建它,也无需重新创建导致滞后的物理主体

private var moveAndRemove = SKAction()
private var objects = [SKSpriteNode]()
private let objectCount = 20

override func didMove(to view: SKView) {

    for x in 0..<objectCount {
        let texture =  SKTexture(imageNamed: "A")
        let object = SKSpriteNode(texture: texture)
        object.name = "A"
        object.isHidden = true
        object.setScale(0.7)
        object.zPosition = 2

        object.physicsBody = SKPhysicsBody(texture: texture, size: texture.size())
        object.physicsBody?.categoryBitMask = 0
        object.physicsBody?.collisionBitMask = 0
        object.physicsBody?.contactTestBitMask = 0
        object.physicsBody?.affectedByGravity = false
        object.physicsBody?.isDynamic = true

        objects.append(object)
    }

    let distance = CGFloat(self.frame.height + 200)
    let moveObject = SKAction.moveBy(x:0 - distance, y: 0, duration: Double(0.004 * distance))
    let removeObject = SKAction.removeFromParent()
    let hideObject = SKAction.hide()
    moveAndRemove = SKAction.sequence([moveObject, hideObject, removeObject])

    let SpawnObject = SKAction.run( {

        let randomResult = Int(arc4random_uniform(UInt32(self.objects.count)))
        self.showObject(objectIndex: randomResult)
    })

    let delay1 = SKAction.wait(forDuration: 0.9)
    let SpawnDelay1 = SKAction.sequence([SpawnObject, delay1])
    let SpawnDelayForever1 = SKAction.repeatForever(SpawnDelay1)
    self.run(SpawnDelayForever1)
}

func showObject(objectIndex: Int) {

    let object = objects[objectIndex]

    guard object.isHidden == true else { return }

    object.isHidden = false
    object.position = CGPoint(x: 0, y: self.frame.width)
    object.zPosition = 10000
    addChild(object)
    object.run(moveAndRemove)
}

我编辑了答案以反映您的产卵代码。请注意,我只是通过检查对象的隐藏状态来检查数组中的对象是否已被使用。还有很多其他方法可以检查对象是否已被使用,但您必须找出最适合您的方法。