向游戏中的移动物体发射弹丸

Shooting a projectile at moving objects in game

我正在制作一个 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()

是否有上述代码的更新版本,如果有任何其他针对初学者的实现射击弹丸功能的教程,link 请在答案中提供。谢谢!

您包含的代码块使用了Operator FunctionsCGPoint 没有算术运算符。

算术运算符的定义如Swift Docs:

Arithmetic Operators is a binary operator because it operates on two targets and is said to be infix because it appears in between those two targets.

为了更好地理解,让我们弄清楚 CGPoint 是什么。

CG点

根据Swift Docs,CGPoint是:

A structure that contains a point in a two-dimensional coordinate system.

two-dimensions 是 xy。初始化CGPoint有3种init方法。

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

如您所见,xy 可以是 DoubleIntCGFloat 类型。这些数据类型具有算术运算符。

虽然 CGPoint 没有 built-in 算术运算符,但您可以创建它们,因此您拥有的代码块就足够了。

如果您还没有,您可以通过 GitHub 存储库导入所有 SpriteKit 辅助函数,而不是自己复制它们。它们仍然有效,我最近自己也在使用它们。

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