Стрелка в направлении, что лук повернут - PullRequest
0 голосов
/ 16 мая 2019

Я создаю игру для iOS, в которой у игрока есть лук и стрела, которые вращаются в круге на 360 градусов, и игрок должен выстрелить из лука в нужное время, чтобы поразить цель.В настоящее время у меня возникают проблемы с тем, чтобы стрелка стреляла в направлении , с которым направлен лук, а также заставляла стрелу стрелять под прямым углом в этом направлении.


      let bullet = SKSpriteNode(fileNamed: "Bullet")
      bullet?.size = CGSize(width: 100, height: 100)
      bullet.zPosition = -5

      bullet.position = CGPointMake(player.position.x, player.position.y)
      bullet.zRotation = player.zRotation


      let action = SKAction.moveToY(self.size.height + 30, duration: 0.8)
      let actionDone = SKAction.removeFromParent()
      bullet.runAction(SKAction.sequence([action, actionDone]))

      bullet.physicsBody = SKPhysicsBody(rectangleOfSize: bullet.size)
      bullet.physicsBody?.affectedByGravity = false
      bullet.physicsBody?.dynamic = false
      self.addChild(bullet)

Игрок обращается к луку для справки.

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Вы можете получить искомое поведение, рассчитав вектор силы из пули zRotation, а затем использовать ее, чтобы применить силу к пули physicsBody.

Для этого мы будем использовать тригонометрию.

//adjust rotation by pi/2 radians to match spriteKits rotation system
let adjustedRotation = bullet.zRotation + .pi/2

//intensity scalar
let intensity:CGFloat = 4000 //adjust this value

//find x and y components using adjustedRotation and scale by intensity
let vx = intensity * cos(adjustedRotation)
let vy = intensity * sin(adjustedRotation)

//make vector using vx and vy components
let forceVector = CGVector(dx:vx, dy: vy)

//apply force to physicsBody
bullet.physicsBody?.applyForce(forceVector)
0 голосов
/ 16 мая 2019

Вместо перемещения маркера на self.size.height + 30 в направлении Y и 0 пикселей в направлении X, вы можете повернуть это направление движения на zRotation с помощью тригонометрии.

let amount = self.size.height + 30
let action = SKAction.moveTo(CGPointMake(bullet.position.x + amount * sin(bullet.zRotation), bullet.position.y + amount * cos(bullet.zRotation)), duration: 0.8)
...