Как я могу переместить спрайт, одновременно стреляя снарядом в SpriteKit? - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь написать некоторую логику, используя Swift 4 и SpriteKit, чтобы позволить пользователю перемещать космический корабль, используя действие перетаскивания, а также позволять ему стрелять снарядом. Я могу тащить космический корабль левым большим пальцем, но как только я начинаю стрелять правым большим пальцем, коснувшись, космический корабль перестает двигаться.

Я включил «enableMultiTouch» в viewDidLoad (). Я чувствую, как будто я очень близок к тому, чтобы это работало, я просто упускаю часть, чтобы позволить пользователю сделать оба одновременно. Заранее спасибо.

Вот что у меня есть:

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    let touch = touches.first
    let touchLocation = touch!.location(in: self)

    if player.contains(touchLocation) {
      playerIsTouched = true
    } else {
      // 2 - Set up initial location of projectile
      let projectile = SKSpriteNode(imageNamed: "projectile")
      projectile.position = player.position

      projectile.physicsBody = SKPhysicsBody(circleOfRadius: projectile.size.width/2)
      projectile.physicsBody?.isDynamic = true
      projectile.physicsBody?.categoryBitMask = PhysicsCategory.projectile
      projectile.physicsBody?.contactTestBitMask = PhysicsCategory.monster
      projectile.physicsBody?.collisionBitMask = PhysicsCategory.none
      projectile.physicsBody?.usesPreciseCollisionDetection = true

      // 3 - Determine offset of location to projectile
      let offset = touchLocation - projectile.position

      // 4 - Bail out if you are shooting down or backwards
      if offset.x < 0 {
        return
      } else {
        run(SKAction.playSoundFileNamed("laser-shot-basic.wav", waitForCompletion: false))
        shotsFired += 1
        accuracyLabel.text = "\(trunc((shotsHit/shotsFired*100) * 10)/10)% Accuracy"
      }

      // 5 - OK to add now - you've double checked position
      addChild(projectile)

      // 6 - Get the direction of where to shoot
      let direction = offset.normalized()

      // 7 - Make it shoot far enough to be guaranteed off screen
      let shootAmount = direction * 1000

      // 8 - Add the shoot amount to the current position
      let realDest = shootAmount + projectile.position

      // 9 - Create the actions
      let actionMove = SKAction.move(to: realDest, duration: 2.0)
      let actionMoveDone = SKAction.removeFromParent()
      projectile.run(SKAction.sequence([actionMove, actionMoveDone]))
    }

    if pauseButton.contains(touchLocation) {

      run(gameLostSound, completion: {
        let scene = LevelSelectScene(size: self.size)
        self.view?.presentScene(scene)
      })


    }
//    for touch: AnyObject in touches {
//      let pointOfTouch = touch.location(in: self)
//      let previousPointOfTouch = touch.previousLocation(in: self)
//
//      let amountDragged = pointOfTouch.x - previousPointOfTouch.x
//
//      player.position.x += amountDragged
//    }

  }

  override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    if (playerIsTouched == true) {
      player.position = (touches.first?.location(in: self))!
    }
  }

  override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
    // 1 - Choose one of the touches to work with
    guard let touch = touches.first else {
      return
    }
    let touchLocation = touch.location(in: self)


    if playerIsTouched {
      playerIsTouched = false
    }

  }

1 Ответ

0 голосов
/ 15 сентября 2018

Когда вы нажимаете на огонь, это вызывает два события: событие «начинается» и «заканчивается». Однако ваш метод touchesEnded не распознает , который touch только что закончил, и устанавливает для вашего параметра playerIsTouched значение false, поэтому дальнейшее движение прекращается.

Существует несколько способов исправить это, в зависимости от более крупной и будущей структуры приложения, но один из них будет следующим: в touchesEnded используйте местоположение касания, чтобы определить, является ли это перетаскиванием. коснитесь, которое закончилось, и сбросьте playerIsTouched только в этом случае.

...