SKSpriteNode 的 SpriteKit 奇怪行为 属性
SpriteKit weird behaviour of SKSpriteNode property
我正在迈向 SpriteKt 的第一步,发现 SkSpriteNode.position
属性 的这种明显奇怪的行为:它应该是 CGPoint
,但是当分配和读回时,它的行为与任何其他 CGPoint 不同。
在接下来的代码中,我测试了一些随机选择的点。其中一些可以分配给 SkSpriteNode.position
属性 并再次阅读,一切似乎都正常。
其他一些在分配时四舍五入为其他一些(接近)值。
这可能是一个浮点值表示舍入问题,但随之而来的是超级奇怪的事情:完全相同的 CGPoint
,当分配给另一个 CGPoint
(而不是 position
属性, 顺便说一下,它声称是 CGPoint
) 四舍五入没有出现
有人知道怎么回事吗?
check(position: CGPoint.zero)
check(position: CGPoint(x: 1, y: 1))
check(position: CGPoint(x: 100, y: 700))
check(position: CGPoint(x: -500, y: 200))
check(position: CGPoint(x: 0.5, y: 0.5))
check(position: CGPoint(x: 1.12, y: 1.14))
check(position: CGPoint(x: 1.12, y: 1.1415161718))
func check(position: CGPoint) {
let sprite = SKSpriteNode(color: .cyan, size: CGSize(width: 32, height: 32))
let point = position
sprite.position = position
print("position = \(position)")
print("point = \(point)")
print("sprite = \(sprite.position)")
if sprite.position == position {
print("✅ they match")
} else {
print("❌ they don't match")
}
assert(position == point, "assign \(position) to point result in \(point)")
}
在我的系统上(Xcode 版本 12.5 (12E262))输出是:
position = (0.0, 0.0)
point = (0.0, 0.0)
sprite = (0.0, 0.0)
✅ they match
position = (1.0, 1.0)
point = (1.0, 1.0)
sprite = (1.0, 1.0)
✅ they match
position = (100.0, 700.0)
point = (100.0, 700.0)
sprite = (100.0, 700.0)
✅ they match
position = (-500.0, 200.0)
point = (-500.0, 200.0)
sprite = (-500.0, 200.0)
✅ they match
position = (0.5, 0.5)
point = (0.5, 0.5)
sprite = (0.5, 0.5)
✅ they match
position = (1.12, 1.14)
point = (1.12, 1.14)
sprite = (1.1200000047683716, 1.1399999856948853)
❌ they don't match
position = (1.12, 1.1415161718)
point = (1.12, 1.1415161718)
sprite = (1.1200000047683716, 1.1415162086486816)
❌ they don't match
精灵内部使用 32 位单精度浮点数。正常的 CGPoint 是 64 位双精度。分配 sprite.position 是将 64 位四舍五入到 32 位,然后为了打印和比较它从 32 位返回到 64 位。您的初始示例都恰好是 32 位和 64 位都可以精确表示的数字,因此不会出现精度损失。
我正在迈向 SpriteKt 的第一步,发现 SkSpriteNode.position
属性 的这种明显奇怪的行为:它应该是 CGPoint
,但是当分配和读回时,它的行为与任何其他 CGPoint 不同。
在接下来的代码中,我测试了一些随机选择的点。其中一些可以分配给 SkSpriteNode.position
属性 并再次阅读,一切似乎都正常。
其他一些在分配时四舍五入为其他一些(接近)值。
这可能是一个浮点值表示舍入问题,但随之而来的是超级奇怪的事情:完全相同的 CGPoint
,当分配给另一个 CGPoint
(而不是 position
属性, 顺便说一下,它声称是 CGPoint
) 四舍五入没有出现
有人知道怎么回事吗?
check(position: CGPoint.zero)
check(position: CGPoint(x: 1, y: 1))
check(position: CGPoint(x: 100, y: 700))
check(position: CGPoint(x: -500, y: 200))
check(position: CGPoint(x: 0.5, y: 0.5))
check(position: CGPoint(x: 1.12, y: 1.14))
check(position: CGPoint(x: 1.12, y: 1.1415161718))
func check(position: CGPoint) {
let sprite = SKSpriteNode(color: .cyan, size: CGSize(width: 32, height: 32))
let point = position
sprite.position = position
print("position = \(position)")
print("point = \(point)")
print("sprite = \(sprite.position)")
if sprite.position == position {
print("✅ they match")
} else {
print("❌ they don't match")
}
assert(position == point, "assign \(position) to point result in \(point)")
}
在我的系统上(Xcode 版本 12.5 (12E262))输出是:
position = (0.0, 0.0)
point = (0.0, 0.0)
sprite = (0.0, 0.0)
✅ they match
position = (1.0, 1.0)
point = (1.0, 1.0)
sprite = (1.0, 1.0)
✅ they match
position = (100.0, 700.0)
point = (100.0, 700.0)
sprite = (100.0, 700.0)
✅ they match
position = (-500.0, 200.0)
point = (-500.0, 200.0)
sprite = (-500.0, 200.0)
✅ they match
position = (0.5, 0.5)
point = (0.5, 0.5)
sprite = (0.5, 0.5)
✅ they match
position = (1.12, 1.14)
point = (1.12, 1.14)
sprite = (1.1200000047683716, 1.1399999856948853)
❌ they don't match
position = (1.12, 1.1415161718)
point = (1.12, 1.1415161718)
sprite = (1.1200000047683716, 1.1415162086486816)
❌ they don't match
精灵内部使用 32 位单精度浮点数。正常的 CGPoint 是 64 位双精度。分配 sprite.position 是将 64 位四舍五入到 32 位,然后为了打印和比较它从 32 位返回到 64 位。您的初始示例都恰好是 32 位和 64 位都可以精确表示的数字,因此不会出现精度损失。