Won*_*ter 7 ios sprite-kit skspritenode skshapenode swift
我还在玩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)
}
Run Code Online (Sandbox Code Playgroud)
如果我用上面标有"VERSION 1"的行添加太空船精灵的集合,我得到这个:

这显然是错的.但是,如果我评论了行上面标有"版本1",而是使用了行标"版本2",我得到我想要的东西:

请注意,标记为版本1和版本2的行的实际代码是相同的:spaceship.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))
那么为什么当我设置宇宙飞船精灵的位置时这很重要?
根据我的思维方式,宇宙飞船精灵的位置与debugFrame的位置无关,因为debugFrame是宇宙飞船精灵的孩子,因此,它的坐标应该相对于宇宙飞船精灵的框架 - 对吗?
谢谢WM
*这与我昨天提出的问题有些相关:
在iOS上的SpriteKit中,缩放纹理的精灵会产生不正确的帧?
但是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)
}
Run Code Online (Sandbox Code Playgroud)
然后,我用两种方式运行它得到了这些结果.由于我理解第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)
Run Code Online (Sandbox Code Playgroud)
默认情况下,宇宙飞船节点的位置位于屏幕的左下角(Spaceship0).它的框架也用它的锚点(中心)设置在屏幕的左下角,因此它的框架rect的原点是负数.
然后创建调试帧,其位置默认设置为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)
Run Code Online (Sandbox Code Playgroud)
如上所述,默认情况下,宇宙飞船节点的位置位于屏幕的左下角(Spaceship0).它的框架也用它的锚点(中心)设置在屏幕的左下角,因此它的框架rect的原点是负数.
然后代码(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并且不相同的添加(225.0 + 0 = 225.0)???
我不明白.
您正在使用精灵的框架创建形状节点,该框架位于场景坐标中.因为形状将是精灵的子元素,所以应该在精灵的坐标中创建节点.例如,如果您SKShapeNode使用太空船的大小创建
let debugFrame = SKShapeNode(rectOfSize: spaceship.size)
Run Code Online (Sandbox Code Playgroud)
debugFrame无论何时设置船的位置,都将以太空飞船为中心,而不是使用宇宙飞船的框架.此外,debugFrame将与船舶适当缩放/移动.