Стрельба из снаряда по движущимся объектам в игре - PullRequest
0 голосов
/ 16 июня 2019

Я делаю игру для iOS, где герой находится в самом левом углу экрана (ландшафтный режим), и она стреляет в монстров, идущих с правой стороны.Сейчас я следую этому уроку, потому что я новичок в играх для iOS: https://www.raywenderlich.com/71-spritekit-tutorial-for-beginners

Проблема, с которой я столкнулся, состоит в том, что код урока относится к 2013 году. Это влияет на положение CGPoints на сцене.(потому что центр теперь является серединой, а не левым краем), но также могут быть функции, которые облегчают его.Например, в уроке они объявляют

func +(left: CGPoint, right: CGPoint) -> CGPoint {
  return CGPoint(x: left.x + right.x, y: left.y + right.y)
}

func -(left: CGPoint, right: CGPoint) -> CGPoint {
  return CGPoint(x: left.x - right.x, y: left.y - right.y)
}

func *(point: CGPoint, scalar: CGFloat) -> CGPoint {
  return CGPoint(x: point.x * scalar, y: point.y * scalar)
}

func /(point: CGPoint, scalar: CGFloat) -> CGPoint {
  return CGPoint(x: point.x / scalar, y: point.y / scalar)
}

#if !(arch(x86_64) || arch(arm64))
  func sqrt(a: CGFloat) -> CGFloat {
    return CGFloat(sqrtf(Float(a)))
  }
#endif

extension CGPoint {
  func length() -> CGFloat {
    return sqrt(x*x + y*y)
  }

  func normalized() -> CGPoint {
    return self / length()
  }
}

Только для того, чтобы иметь возможность подсчитать смещение между двумя точками и указать место, куда должен попасть снаряд:

let offset = touchLocation - projectile.position
let direction = offset.normalized()

Есть лиобновленная версия кода для вышеуказанного кода и, пожалуйста, если есть какие-либо другие учебные пособия для начинающих, которые реализуют функциональность стрельбы снарядами, укажите их в ответах.Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Если вы еще этого не сделали, вы можете импортировать все вспомогательные функции SpriteKit через GitHub-репо, а не воспроизводить их самостоятельно.Они все еще работают, я сам недавно их использовал.

https://github.com/raywenderlich/SKTUtils/tree/master/SKTUtils

1 голос
/ 18 июня 2019

Кодовый блок, который вы включили, использует Функции оператора .CGPoint не имеет арифметических операторов.

Определение арифметических операторов, как указано в Swift Docs :

Арифметические операторы - это бинарный оператор, потому что он работает надве цели и, как говорят, infix , потому что он появляется между этими двумя целями.

Чтобы лучше понять, давайте выясним, что такое CGPoint .

CGPoint

Согласно Swift Docs , CGPoint:

Структура, которая содержит точку в двумерной системе координат.

Два измерения: x и y .Существует три метода инициализации для инициализации CGPoint.

init(x: Double, y: Double)
init(x: Int, y: Int)
init(x: CGFloat, y: CGFloat)

Как видите, x и y могут иметь тип Double, Int или CGFloat.Эти типы данных имеют арифметические операторы.

Хотя CGPoint не имеет встроенных арифметических операторов, вы можете создать их, и, следовательно, вам достаточно кодового блока.

...