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

Все было на самом деле прекрасно в моем подходе. Проблема i заключалась в том, что слой anchor point отличается от карты, определенной мной, которая вводила смещение во время масштабирования. Мне пришлось установить оба якоря на ccp(0,0).

concersion от экранных координат центра щепотки жеста к слою является правильным и может быть achived следующих инструкциями при использовании UIKit gesture recognizers:

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

Прежде всего, вы не можете сделать ([состояние распознавателя] == UIGestureRecognizerStateBegan), потому что состояние является bitfield! Так что вы должны сделать:

([распознаватель состояние] & UIGestureRecognizerStateBegan)

Центр местоположение вашего щепоткой будет в системе координат на экране в основном. Что касается того, как вы преобразовываете это в свою собственную систему координат, вам нужно выяснить, какие границы на экране устройства составляют часть вашей сцены/слоя, которая отображается во время начала жестов. Это будут координаты, такие как 10,10 x 200,200 или что-то еще, представляющие сетку пикселей экрана. Тогда вам придется выяснить, в системе координат вашей сцены/слоя вашего собственного приложения, на что 10,10 карт и 200 200 карт. Оттуда вы можете получить коэффициент, чтобы применить к экранным координатам центра жестов пинча, который преобразует координаты экрана жесткого пинча в координаты сцены/слоя.

То, что вы пытаетесь сделать, сложно, потому что, масштабируя сцену/слой, вы центрируете это, масштабируя вокруг точки, которая находится не в центре представления. Я уверен, что если вы просмотрите образец кода Apple в одном из приложений, связанных с картой, вы, вероятно, найдете несколько примеров методов, которые имеют такое масштабирование.

Надеюсь, это поможет.

+0

вашего требование на битовом поле на самом деле не нужно, поскольку каждый state is only – tiguero

+0

также моя логика для преобразования из координаты экрана в координаты слоя была включена в мой фрагмент кода. – tiguero