Я создал приложение для iOS, в котором мне нужно одновременно перемещать, вращать и масштабировать спрайт (я использую Sprite Kit от Apple). По большей части у меня это работает. В настоящее время я могу касаться одним пальцем и перемещать спрайт, а если я использую два пальца, я могу масштабировать и вращать спрайт. Для этого я использую UIPanGestureRecognizer, UIPinchGestureRecognizer и UIRotateGestureRecognizer. Это прекрасно работает. Я бы хотел, чтобы, когда я перетаскиваю, вращаю и масштабирую один спрайт правой рукой, я мог взять левую руку и перетаскивать, вращать и масштабировать другой спрайт независимо от другого спрайта.
В настоящее время я использую жесты iOS для перемещения, вращения и масштабирования спрайтов. Я использовал код, очень похожий на тот, что нашел на веб-сайте Рэя Вендерлиха в его руководстве по перетаскиванию спрайтов для Sprite Kit. http://www.raywenderlich.com/44270/sprite-kit-tutorial-how-to-drag-and-drop-sprites. Часть, которую я использую, находится внизу, когда он начинает использовать UIPanGestureRecognizers вместо простого метода касания.
Как я уже сказал, жесты отлично работают с одним спрайтом за раз. Как заставить его работать более чем с одним спрайтом?
Например, для UIPanGesturRecognizer я добавляю следующий код:
- (void)didMoveToView:(SKView *)view {
UIPanGestureRecognizer *gestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)];
[[self view] addGestureRecognizer:gestureRecognizer];
}
Затем у меня есть метод для этого, который называетсяgestRecognizer ниже:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer {
if (recognizer.state == UIGestureRecognizerStateBegan) {
CGPoint touchLocation = [recognizer locationInView:recognizer.view];
touchLocation = [self convertPointFromView:touchLocation];
[self selectNodeForTouch:touchLocation]; // This just returns the node that has been touched
} else if (recognizer.state == UIGestureRecognizerStateChanged) {
CGPoint translation = [recognizer translationInView:recognizer.view];
translation = CGPointMake(translation.x, -translation.y);
[self panForTranslation:translation];
[recognizer setTranslation:CGPointZero inView:recognizer.view];
} else if (recognizer.state == UIGestureRecognizerStateEnded) {
[_selectedNode removeAllActions];
}
}
Наконец, есть метод, который перемещает спрайт:
- (void)panForTranslation:(CGPoint)translation {
if([[_selectedNode name] isEqualToString:kAnimalNodeName]) {
CGPoint position = [_selectedNode position];
// Set variable for the point to move selected node
CGPoint movePoint = CGPointMake(position.x + translation.x, position.y + translation.y);
[_selectedNode setPosition:newPos];
}
}
Теперь в примере кода показаны только методы для UIPanGestureRecognizer, но у меня также есть аналогичные методы для жестов поворота и сжатия. Весь этот код находится в моем классе сцены.
Спасибо вам за помощь.