【问题标题】:Zooming Weirdness in SpriteKitSpriteKit 中的缩放怪异
【发布时间】:2017-06-10 04:54:36
【问题描述】:

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

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

在这里,您可以看到未缩放节点的尺寸和位置与其所在的场景完全相同。X 和 Y 对于每个地图和场景都是 0:

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

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

【问题讨论】:

    标签: swift sprite-kit position skspritenode


    【解决方案1】:

    我想通了,虽然这并不容易。原来是“AnchorPoint Dorkitis”的案例。这种情况的主要症状是基于错误的假设编写代码,在我的例子中,我的假设是这样的:

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

    我一直都知道我将我的 AnchorPoints(场景和 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() 中,但我需要在代码中的其他地方使用整数,所以我想也可以在这里这样做。我认为下一步对我来说是弄清楚如何用更少的代码行来做到这一点:)

    【讨论】:

    • 您可以从这些属性中删除 get。
    • 如果我删除了 get,它们仍然是计算属性吗?苹果开发者指南说只有 Set 是可选的。
    • 如果您删除get,但留下return,您将有相同的行为。这样,这些属性仍然是计算的并且只能获取。
    猜你喜欢
    • 2016-06-19
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多