2017-01-25 148 views
2

我正在使用Swift和SpriteKit構建一個應用程序。該應用程序加載一個與屏幕大小完全一致的SKSpriteNode,並將其放置到屏幕上。但是,用戶可以儘可能多地移動和縮放該SKSpriteNode。我關心SKSpriteNode的絕對位置,因爲如果節點移動得太多,我喜歡將它放回中心位置,或者將它「捕捉」到屏幕的邊緣。 (SKSpriteNode最終會保存一張地圖)。SpriteKit縮放奇怪

當節點的比例恰好爲1.0時,位置值按我預期的那樣工作。但是,當我縮放節點(使用捏手勢)並且縮放比例超過1.0時,位置值無意義。這裏有一些圖片來說明我的意思。

在這裏,你可以看到,未縮放的節點具有完全相同的尺寸和位置作爲場景它被放置在X和Y均爲0,每個地圖以及現場:

enter image description here

但是,正如您在下一張圖片中看到的那樣,當我將地圖縮放爲較大的SKSpriteNode並將其移動時,地圖的左下角恰好位於屏幕的左下角,縮放節點的X和Y值將關閉。我期望X是0,Y是0,但他們不是。

enter image description here

正在發生的事情在這裏,以及如何計算縮放節點的絕對位置?當我說「絕對」的位置時,或許我的意思是相對於現場的位置?無論如何,你的想法值得讚賞。

回答

0

我想通了,雖然這不容易。原來是「AnchorPoint Dorkitis」的案例。這種情況的主要症狀是根據錯誤的假設編寫代碼,在我的情況下,我做的假設是這樣的:

我節點的(X,Y)點是左下角節點。 (false)

我一直都知道,我將我的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()沒有包裝他們,但我需要整數的代碼,所以我想不妨在這裏這樣做的其他地方。我認爲下一步對我來說就是要弄清楚如何在更少的代碼行中執行此操作:)

+0

您可以從這些屬性中刪除get。 – Whirlwind

+0

如果我刪除了,他們仍然會被計算屬性? Apple開發人員指南說只有Set是可選的。 – zeeple

+0

如果你刪除'get',但離開'return',你將會有相同的行爲。這樣,這些屬性仍然是計算出來的並且是隻能得到的。 – Whirlwind