Спрайты нерестятся прямо на старте - PullRequest
0 голосов
/ 16 января 2020

В настоящее время я делаю игру на Xcode 11, у меня возникла проблема, при которой мой спрайт сразу появляется сразу при старте, даже через их задержку ожидания, но после первого появления спрайты появляются при их текущее время. Как я могу сделать так, чтобы спрайты не появлялись в течение 3 секунд после начала сцены. Любая помощь будет принята с благодарностью.

На прилагаемой фотографии показано, что происходит в начале игры.

Ph

Я приложил часть своего кода для одного из спрайты по настройке похожи друг на друга.

//Setup Bird
func setupBird() {
    bird = SKSpriteNode(imageNamed: "bird-1")
    bird.name = "Bird"
    bird.zPosition = 20.0
    bird.setScale(1.5)
    let birdHeight = bird.frame.height
    let random = CGFloat.random(min: -birdHeight, max: birdHeight*2.0)
    bird.position = CGPoint(x: cameraRect.maxX + bird.frame.width, y: size.height/2.0 + birdHeight + random)
    bird.physicsBody = SKPhysicsBody(circleOfRadius: bird.size.width/2.0)
    bird.physicsBody!.affectedByGravity = false
    bird.physicsBody!.isDynamic = false
    bird.physicsBody!.categoryBitMask = PhysicsCategory.Bird
    bird.physicsBody!.contactTestBitMask = PhysicsCategory.Player
    addChild(bird)
    bird.run(.sequence([.wait(forDuration: 15, withRange: 5), .removeFromParent()]))

    //Animation For Birds
    var textures: [SKTexture] = []
    for i in 1...3 {
        textures.append(SKTexture(imageNamed: "bird-\(i)"))
    }

    bird.run(.repeatForever(.animate(with: textures, timePerFrame: 0.15)))

}
func spawnBird() {
    let random = CGFloat.random(min: 15.0, max: 30.0)
  run(.repeatForever(.sequence([
      .wait(forDuration: TimeInterval(random)),
      .run { [weak self] in
          self?.setupBird()
      }
  ])))
}

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Я исправил проблему, добавив frame.width / 2.0 в позицию, которая перемещает исходную позицию птицы.

bird.position = CGPoint(x: cameraRect.maxX + frame.width/2.0 + bird.frame.width, y: size.height/2.0 + birdHeight + random)
0 голосов
/ 16 января 2020

Если я правильно понимаю, вы хотите периодически появляться птицы, начиная с начальной задержки.

Вы можете отложить повторяющееся действие либо с помощью другого действия SpriteKit, либо с помощью DispatchQueue.

func spawnBirds() {
    let spawnBirdAfterDelayAction = SKAction.sequence([
        .wait(forDuration: 22.5, withRange: 7.5),
        .run { [weak self] in self?.setupBird() }
    ])

    run(
        .sequence([
            .wait(forDuration: 3), // initial delay
            .repeatForever(spawnBirdAfterDelayAction)
        ])
    )  
}
/// As Knight0fDragon pointed out, this approach is inferior because it circumvents the SpriteKit runtime.
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
    self.spawnBirds()
}
...