2013-09-27 135 views
0

我目前有層內的地圖(tilemap的),我想用下面的代碼進行平移/縮放:問題在捏合手勢的中心縮放層

- (void) pinchGestureUpdated: (UIPinchGestureRecognizer *) recognizer { 

    if([recognizer state] == UIGestureRecognizerStateBegan) { 

      _lastScale = [recognizer scale]; 

      CGPoint touchLocation1 = [recognizer locationOfTouch:0 inView:recognizer.view]; 
      CGPoint touchLocation2 = [recognizer locationOfTouch:1 inView:recognizer.view]; 

      CGPoint centerGL = [[CCDirector sharedDirector] convertToGL: ccpMidpoint(touchLocation1, touchLocation2)]; 
      _pinchCenter = [self convertToNodeSpace:centerGL]; 
    } 

    else if ([recognizer state] == UIGestureRecognizerStateChanged) { 

//  NSLog(@"%d", recognizer.scale); 

     CGFloat newDeltaScale = 1 - (_lastScale - [recognizer scale]); 
     newDeltaScale = MIN(newDeltaScale, kMaxScale/self.scale); 
     newDeltaScale = MAX(newDeltaScale, kMinScale/self.scale); 

     CGFloat newScale = self.scale * newDeltaScale; 

     //self.scale = newScale; 
     [self scale: newScale atCenter:_pinchCenter]; 

     _lastScale = [recognizer scale]; 
    } 
} 

- (void) scale: (CGFloat) newScale atCenter: (CGPoint) center { 

    CGPoint oldCenterPoint = ccp(center.x * self.scale, center.y * self.scale); 

    // Set the scale. 
    self.scale = newScale; 

    // Get the new center point. 
    CGPoint newCenterPoint = ccp(center.x * self.scale, center.y * self.scale); 

    // Then calculate the delta. 
    CGPoint centerPointDelta = ccpSub(oldCenterPoint, newCenterPoint); 

    // Now adjust your layer by the delta. 
    self.position = ccpAdd(self.position, centerPointDelta); 
} 

我的問題是,變焦沒有在捏的中心生效,即使我試圖在同一時間改變它,我正在通過這種方法放大:(void) scale: (CGFloat) newScale atCenter: (CGPoint) center。有沒有什麼理由可能無法正確發生?另外我如何轉換到捏我的場景/圖層的座標系統的中心位置?

回答

0

在我的方法中,一切都很好。但我遇到的問題是,anchor point層與我定義的地圖不同,它在縮放過程中引入了偏移量。我不得不將這兩個錨都設置爲ccp(0,0)

從捏放的中心層的屏幕座標concersion是正確的,並使用UIKit的gesture recognizers時,可以通過下面的指令achived:

CGPoint centerGL = [[CCDirector sharedDirector] convertToGL: ccpMidpoint(touchLocation1, touchLocation2)]; 
_pinchCenter = [self convertToNodeSpace:centerGL]; 
0

首先,你不能這樣做([識別器狀態] == UIGestureRecognizerStateBegan),因爲狀態是位域!所以,你必須做的:

([識別狀態] & UIGestureRecognizerStateBegan)

你捏的中心位置將是在基本屏幕上的座標。至於如何將其轉換爲您自己的座標系,您需要弄清楚設備屏幕上的界限是手勢開始時顯示的場景/圖層的一部分。這將是10,10 x 200,200等座標,代表屏幕的像素網格。然後,你將不得不在你自己的應用程序的場景/圖層的座標系中找出10,10地圖和200,200地圖。從那裏,你可以導出一個因子來應用到捏合手勢中心的屏幕座標,這會將捏合手勢的屏幕座標轉換爲場景/圖層座標。

你想要做的事很棘手,因爲當你縮放場景/圖層時,你的中心圍繞不在視圖中心的點進行縮放。我敢肯定,如果您查看某個地圖相關應用程序中的某些Apple示例代碼,您可能會發現一些具有這種縮放縮放功能的方法示例。

我希望這會有所幫助。

+0

實際上並不需要對位域您的要求,因爲每個狀態是獨家 – tiguero

+0

我的邏輯從屏幕座標轉換爲圖層座標包含在我的代碼片段中。 – tiguero