向游戏中的移动物体发射弹丸
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 Functions。 CGPoint
没有算术运算符。
算术运算符的定义如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 是 x 和 y。初始化CGPoint有3种init方法。
init(x: Double, y: Double)
init(x: Int, y: Int)
init(x: CGFloat, y: CGFloat)
如您所见,x
和 y
可以是 Double
、Int
或 CGFloat
类型。这些数据类型具有算术运算符。
虽然 CGPoint
没有 built-in 算术运算符,但您可以创建它们,因此您拥有的代码块就足够了。
如果您还没有,您可以通过 GitHub 存储库导入所有 SpriteKit 辅助函数,而不是自己复制它们。它们仍然有效,我最近自己也在使用它们。
https://github.com/raywenderlich/SKTUtils/tree/master/SKTUtils
我正在制作一个 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 Functions。 CGPoint
没有算术运算符。
算术运算符的定义如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 是 x 和 y。初始化CGPoint有3种init方法。
init(x: Double, y: Double)
init(x: Int, y: Int)
init(x: CGFloat, y: CGFloat)
如您所见,x
和 y
可以是 Double
、Int
或 CGFloat
类型。这些数据类型具有算术运算符。
虽然 CGPoint
没有 built-in 算术运算符,但您可以创建它们,因此您拥有的代码块就足够了。
如果您还没有,您可以通过 GitHub 存储库导入所有 SpriteKit 辅助函数,而不是自己复制它们。它们仍然有效,我最近自己也在使用它们。
https://github.com/raywenderlich/SKTUtils/tree/master/SKTUtils