Swift 在SpriteKit中放大怪异

Swift 在SpriteKit中放大怪异,swift,sprite-kit,position,skspritenode,Swift,Sprite Kit,Position,Skspritenode,我正在使用Swift和SpriteKit构建一个应用程序。应用程序加载一个与屏幕大小完全相同的SKSpriteNode,并将其放置在完全覆盖屏幕的位置。但是,用户可以随意移动和缩放此SKSpriteNode。我关心SKSpriteNode的绝对位置,因为如果节点移动太多,我喜欢将其移回中心,或将其“捕捉”到屏幕边缘。(SKSpriteNode最终将拥有一张地图) 当节点的比例正好为1.0时,位置值的工作方式与我预期的相同。但是,当我缩放节点(使用收缩手势)并且比例增长到1.0以上时,位置值没有意

我正在使用Swift和SpriteKit构建一个应用程序。应用程序加载一个与屏幕大小完全相同的SKSpriteNode,并将其放置在完全覆盖屏幕的位置。但是,用户可以随意移动和缩放此SKSpriteNode。我关心SKSpriteNode的绝对位置,因为如果节点移动太多,我喜欢将其移回中心,或将其“捕捉”到屏幕边缘。(SKSpriteNode最终将拥有一张地图)

当节点的比例正好为1.0时,位置值的工作方式与我预期的相同。但是,当我缩放节点(使用收缩手势)并且比例增长到1.0以上时,位置值没有意义。这里有一些图片来说明我的意思

在这里,可以看到未缩放的节点的尺寸和位置与放置该节点的场景完全相同。对于贴图和场景,X和Y均为0:

但是,正如您在下一幅图像中所看到的,当我将贴图缩放为更大的SKSpriteNode,并移动它以使贴图的左下角正好位于屏幕的左下角时,缩放节点的X和Y值将关闭。我希望X为0,Y为0,但事实并非如此


这里发生了什么,如何计算缩放节点的绝对位置?当我说“绝对”位置时,也许我的意思是相对于场景的位置??不管怎样,我很感激你的想法。

我发现了这一点,尽管这并不容易。结果是一个“多尔基蒂斯锚点”的案例。这种情况的主要症状是基于错误的假设编写代码,在我的情况下,使我陷入困境的假设是:

我的节点的(X,Y)点是节点的左下角。(错)

我一直都知道我将我的主播点(场景和SKSpriteNode的主播点)设置为(x:0.5,y:0.5),但我还没有意识到这也改变了(x,y)坐标在屏幕上的实际位置(提示:中心)

对于那些感兴趣的人,我制定了一套很好的计算属性,用于返回场景和SKSpriteNode的X、Y、高度、宽度、顶部、底部、左侧和右侧值。我在这里与你分享:

var map_x: Int {
    get {
        return Int(self.position.x)
    }
}

var map_y: Int {
    get {
        return Int(self.position.y)
    }
}

var map_h: Int {
    get {
        return Int(self.frame.height)
    }
}

var map_w: Int {
    get {
        return Int(self.frame.width)
    }
}

var map_t: Int {
    get {
        return Int(self.position.y + self.frame.height/2)
    }
}

var map_b: Int {
    get {
        return Int(self.position.y - self.frame.height/2)
    }
}

var map_l: Int {
    get {
        return Int(self.position.x - self.frame.width/2)
    }
}

var map_r: Int {
    get {
        return Int(self.position.x + self.frame.width/2)
    }
}

var scene_x: Int {
    get {
        return Int((scene?.position.x)!)
    }
}

var scene_y: Int {
    get {
        return Int((scene?.position.y)!)
    }
}

var scene_h: Int {
    get {
        return Int((scene?.frame.height)!)
    }
}

var scene_w: Int {
    get {
        return Int((scene?.frame.width)!)
    }
}

var scene_t: Int {
    get {
        return Int((scene?.position.y)! + (scene?.frame.height)!/2)
    }
}

var scene_b: Int {
    get {
        return Int((scene?.position.y)! - (scene?.frame.height)!/2)
    }
}

var scene_l: Int {
    get {
        return Int((scene?.position.x)! - (scene?.frame.width)!/2)
    }
}

var scene_r: Int {
    get {
        return Int((scene?.position.x)! + (scene?.frame.width)!/2)
    }
}

我本可以让它们成为CGFloat值,而不是将它们包装在Int()中,但我需要在代码的其他地方使用Int,所以我想在这里也可以这样做。我想我下一步要做的是找出如何在更少的代码行中实现这一点:)

您可以从这些属性中删除get。如果我删除了get,它们还会是计算属性吗?《苹果开发者指南》中说,只有Set是可选的。如果你删除
get
,而离开
return
,你也会有同样的行为。这样,这些属性仍然是计算得到的。