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

时间:2019-06-16 14:12:41

标签: ios swift sprite-kit

我正在制作一个iOS游戏,其中英雄位于屏幕的最左侧(横向模式),并且她射击来自右侧的怪物。现在,我正在学习本教程,因为我是iOS游戏的初学者:https://www.raywenderlich.com/71-spritekit-tutorial-for-beginners

我遇到的问题是本教程中的代码来自2013年。这会影响CGPoint在场景中的位置(因为中心现在位于中间而不是左边),而且可能已经存在使它更容易的功能。例如,在本教程中,他们声明

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 个答案:

答案 0 :(得分:2)

如果还没有,可以通过GitHub存储库导入所有SpriteKit帮助程序函数,而不用自己复制它们。它们仍然有效,我最近才亲自使用它们。

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

答案 1 :(得分:1)

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

Swift Docs中所述的算术运算符定义:

  

算术运算符 是二进制运算符,因为它在两个目标上运算,并且被称为中缀,因为它出现在两个目标之间这两个目标。

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

CGPoint

根据Swift Docs,CGPoint为:

  

在二维坐标中包含点的结构   系统。

这两个维度是 x y 。初始化CGPoint的三种初始化方法。

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

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

尽管CGPoint没有内置的算术运算符,但是您可以创建它们,因此您所拥有的代码块就足够了。