Делаю игру на OpenGL(2D пазл) для iOS, пытаюсь реализовать зуминг и скролинг игрового поля.
Использую UIPinchGestureRecognizer.
Зуминг реализуется следующим образом: есть некий target(2Д вектор, x, y) который является точкой зума. Сам зуминг делается следующим образом:
glTranslatef(target.x, target.y, 0); glScalef( scale, scale, 0); glTranslatef( -target.x, -target.y, 0);
Target берется из gesture recognizer`а следующим образом:
-(void)handlePinchGesture:( UIPinchGestureRecognizer*)recognizer { if ( UIGestureRecognizerStateBegan == [recognizer state]) { view->setTarget( [recognizer locationInView:self]); } // Rest of the code omitted }
Все работает просто замечательно.
Изначально игра была рассчитана на айпад, но я хочу чтобы она работала и на айфоне и айподе, но там другое соотношение сторон экрана. Чтобы картинка получилась пропорциональной и без искажений, я сделал изначальный scale по оси Y немного больше, таким образом, что можно изначально таскать экран вверх и вниз. Вот код:
glTranslatef(target.x, target.y, 0); glScalef( scale, scale * aspectRatio, 0); glTranslatef( -target.x, -target.y, 0);
Суть в том, что если игровая локация находится "в центре" (то есть когда сверху и снизу одинаковое пространство, на которое можно скроллить) - все ок. Но если мы потянули поле вверх или вниз и начали жест, то поле резко прыгает в центр. Задним числом понимаю, что нужно как-то смещать позицию жеста, но уже 2 дня не могу понять, как именно.
Заранее спасибо.
Бамп
riens
> Задним числом понимаю, что нужно как-то смещать позицию жеста, но уже 2 дня не
> могу понять, как именно.
относительно центра мировых координат?!
StiX
Получается что да. А центр мировых координат вот в этом таргете.
не оч понял пролему, но попробуй сбрасывать velocity рекогнайзера после передачи его в свои обработчики, таким образом на след кадре будет новый velocity, не только при UIGestureRecognizerStateBegan а всегда
Тема в архиве.