Мне нужно было реализовать манипулирование загруженной фотографией так как это сделано в галерее фотографий. То есть, нам нужно изменять размер спрайта, поворот и передвижение.
Итак, в переменной imageFromPicker у нас лелжит спрайт который нужно подогнать под нужный размер и повернуть на нужный угол. Для этого нам нужно в код добавить следующее:
//тут магия
static inline int ccw(CGPoint p0, CGPoint p1, CGPoint p2)
{
int dx1, dx2, dy1, dy2;
dx1 = p1.x - p0.x; dy1 = p1.y - p0.y;
dx2 = p2.x - p0.x; dy2 = p2.y - p0.y;
int v1 = dx1 * dy2;
int v2 = dy1 * dx2;
if (v1 > v2)
return 1;
if (v1 < v2)
return -1;
if ((dx1*dx2 < 0) || (dy1*dy2 < 0))
return -1;
if ((dx1*dx1 + dy1*dy1) < (dx2*dx2 + dy2*dy2))
return 1;
return 0;
}
- (void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
NSArray *allTouch = [touches allObjects];
//Проверяем на количество касаний, так как нам ведь нужно манипулировать двумя пальцами для изменения размера и поворота спрайта
if ([allTouch count] == 2) {
if ([allTouch count] == 2) {
UITouch *first = [allTouch objectAtIndex:0];
UITouch *second = [allTouch objectAtIndex:1];
CGPoint a = [first previousLocationInView:[first view]];
CGPoint b = [second previousLocationInView:[second view]];
CGPoint c = [first locationInView:[first view]];
float distance = ccpDistance(a, b);//растояние между двумя пальцами
float difDistance;
if(!LastDistance){
LastDistance = distance;
difDistance = 0;
}
else {
difDistance = (distance - LastDistance) * 0.01;
LastDistance = distance;
}
//изменяем масштаб спрайта в зависимости от растояния между пальцами
imageFromPicker.scale = imageFromPicker.scale + difDistance;
NSLog(@"%f",imageFromPicker.scale);
int direction =ccw(b, a, c);
float pX= fabs(c.x-b.x);
float pY= fabs(c.y-b.y);
//поворачиваем спрайт
float rotation = atan2(pY, pX) * 4;
float rotation = atan2(pY, pX) * 4;
if(direction<0)
imageFromPicker.rotation=(imageFromPicker.rotation-rotation);
else
imageFromPicker.rotation=(imageFromPicker.rotation+rotation);
}
else {
UITouch *first = [allTouch objectAtIndex:0];
CGPoint touchPoint = [first locationInView:[first view]];
touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint];
//передвигаем спрайт при одном касании
imageFromPicker.position = touchPoint;
}
}
Поворот спрайта работает далеко от идеала, но я пока остановился на этом. Если вы знаете способ лучше, то напишите в комментариях либо мне на почту/джаббер.
Поворот спрайта работает далеко от идеала, но я пока остановился на этом. Если вы знаете способ лучше, то напишите в комментариях либо мне на почту/джаббер.