2013-09-27 134 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