【发布时间】:2014-12-31 08:19:23
【问题描述】:
我仍在尝试在 iOS 中学习 SpriteKit,并且进行了大量的阅读和实验。我对我发现的关于坐标、框架和子节点的其他内容感到困惑。
考虑一下这段代码,其中我试图在我的飞船精灵周围画一个绿色框以进行调试:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
// VERSION 1
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
let debugFrame = SKShapeNode(rect: spaceship.frame)
debugFrame.strokeColor = SKColor.greenColor()
spaceship.addChild(debugFrame)
// VERSION 2
// spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
spaceship.setScale(0.50)
self.addChild(spaceship)
}
如果我用上面标记为“VERSION 1”的行添加宇宙飞船精灵的集合,我会得到:
这显然是错误的。但是,如果我将上面标记为“VERSION 1”的行注释,而使用标记为“VERSION 2”的行,我会得到我想要的:
请注意,标记为版本 1 和版本 2 的行的实际代码是相同的: spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
那么为什么我设置飞船精灵的位置很重要呢?
在我看来,飞船精灵的位置与 debugFrame 的位置无关,因为 debugFrame 是飞船精灵的子节点,因此,它的坐标应该是相对于飞船精灵的框架的 - 对?
谢谢 WM
*这和我昨天问的一个问题有点相关:
In SpriteKit on iOS, scaling a textured sprite produces an incorrect frame?
但是a)我现在明白了,b)这是一个足够不同的问题,值得自己提出问题。
更新:
嗯 - 谢谢大家提供以下想法,但我还是不明白,也许这会有所帮助。
我修改了我的代码以打印出相关的位置和框架:
func addSpaceship()
{
let spaceship = SKSpriteNode.init(imageNamed: "rocketship.png")
spaceship.name = "spaceship"
println("Spaceship0 Pos \(spaceship.position) Frame = \(spaceship.frame)")
// VERSION 1 (WRONG)
spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
println("Spaceship1 Pos \(spaceship.position) Frame = \(spaceship.frame)")
let debugFrame = SKShapeNode(rect: spaceship.frame)
println("DEBUG Pos \(debugFrame.position) Frame = \(debugFrame.frame)")
debugFrame.strokeColor = SKColor.greenColor()
spaceship.addChild(debugFrame)
// VERSION 2 (RIGHT)
// spaceship.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
// println("Spaceship2 Pos \(spaceship.position) Frame = \(spaceship.frame)")
spaceship.setScale(0.50)
self.addChild(spaceship)
}
然后,我双向运行得到了这些结果。既然我了解第 2 版,那我们就从这里开始吧。
使用“VERSION 2 (RIGHT)”代码运行,我得到:
Spaceship0 Pos (0.0,0.0) Frame = (-159.0,-300.0,318.0,600.0)
DEBUG Pos (0.0,0.0) Frame = (-159.5,-300.5,319.0,601.0)
Spaceship2 Pos (384.0,512.0) Frame = (225.0,212.0,318.0,600.0)
默认情况下,spaceship 节点的起始位置位于屏幕的左下角 (Spaceship0)。它的框架也用它的锚点(中心)表示在屏幕的左下角,因此它的框架矩形的原点是负数。
然后创建调试框架,其位置设置为 0,默认为 0,并且其框架设置为与飞船的相同。
代码 (Spaceship2) 然后将宇宙飞船节点移动到视图坐标 (384.0,512.0) 中的位置,并通过将新位置添加到旧原点来移动其框架的原点(即 384 + -159 = 225) .
一切都好。
很遗憾,我仍然没有获得第 1 版。
当我使用“VERSION 1 (WRONG)”代码运行时,我得到了
Spaceship0 Pos (0.0,0.0) Frame = (-159.0,-300.0,318.0,600.0)
Spaceship1 Pos (384.0,512.0) Frame = (225.0,212.0,318.0,600.0)
DEBUG Pos (0.0,0.0) Frame = (0.0,0.0,543.5,812.5)
如上,飞船节点默认从屏幕左下角的位置开始(Spaceship0)。它的框架也用它的锚点(中心)表示在屏幕的左下角,因此它的框架矩形的原点是负数。
然后,代码 (Spaceship1) 将飞船节点移动到视图坐标 (384.0,512.0) 中的某个位置,并通过将新位置添加到旧原点来移动其框架的原点(即 384 + -159 = 225) .
然后创建调试框架,并将其位置设置为 0,默认情况下为 0,并将其框架设置为具有奇怪的宽度 (543.5) 和奇怪的高度 (812.5)。由于我正在使用 spaceship.frame 初始化 debugFrame.frame(我 认为 这是默认初始化程序所做的),我希望新的 debugFrame.frame 与飞船的框架相同 - 但它不是!调试框架的宽度和高度值显然来自将实际宽度和高度添加到飞船节点框架的原点 (543.5 = 225 + 318.5)。但是如果是这样的话,为什么t的frame rect origin还是0, 0 & not the same add (225.0 + 0 = 225.0)???
我不明白。
【问题讨论】:
-
记录 spaceship.frame,你会注意到它的起源取决于位置。由于形状是宇宙飞船的子对象,因此形状的位置是相对于它的。因此,如果 frame.origin 为 0,0 则一切正常,但如果为 200,200,则形状将相应偏移。
-
非常感谢 - 但恐怕我还是不明白。请参阅上面的更新。
标签: ios swift sprite-kit skspritenode skshapenode