2016-11-22 51 views
0

我正在爲iPad和iOS 10編寫應用程序。 我的應用程序只使用一個SKScene(大小爲1300×1000)。 我也用這樣定義一個攝像頭:SKScene:找到SKSpriteNode的最大位置

myCamera=[[SKCameraNode alloc] init]; 
myCamera.position=CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
self.camera=myCamera; 
[self addChild:myCamera]; 

我用很多SKSpriteNodes用戶可以拖動(甚至超出了SKScene的大小)。

我還使用:

[myCamera setScale:newScale]; 

對付捏縮放。

我需要知道是否有辦法在右邊的SKScene中距離位置0,0最遠的節點的最大X位置,而不必逐個讀取所有節點位置。 然後對其他三方(上,左,下)做同樣的事情。

回答

1

保留四個浮點數minX,minY,maxX,maxY。當用戶拖動節點時,檢查其位置是否超過最大值或小於最小值。如果是,則更新相應的值,例如

編輯使用calculateAccumulatedFrame獲得節點的後代的全部範圍。

// assuming you have code like this already 
skNodeThatIAmDragging.position = currentDragPosition; 
CGRect frame = [skNodeThatIAmDragging calculateAccumulatedFrame]; 

if (self.maxX < frame.origin.x) { 
    self.maxX = frame.origin.x; 
} 
if (self.minX > CGRectGetMaxX(frame)) { 
    self.minX = CGRectGetMaxX(frame); 
} 
// ... and so on 
+0

當然這是一個可能的解決方案。 – danyadd

+0

當然這是一個可能的解決方案。但是我的SKSpriteNodes具有子節點,所以用於更新maxX的代碼會更復雜。 我不知道SKScene是否已經知道這個maxX位置。 例如,我想知道是否SKScene didChangeSize被自動調用,或者如果一個節點在SKScene框架之外的話。 – danyadd

+0

請參閱編輯。同樣的想法,但使用calculateAccumulatedFrame來獲得節點後代的全部範圍。如果您的節點幾何圖形已修復,則可以爲每個節點緩存該矩形以節省計算量。 – danh