четверг, 2 декабря 2010 г.

Вращение, перемещение и изменение размера спрайта

Продолжаю предыдущий пост.

Мне нужно было реализовать манипулирование загруженной фотографией так как это сделано в галерее фотографий. То есть, нам нужно изменять размер спрайта, поворот и передвижение.



Итак, в переменной 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) {
        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;
        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;
    }
}

Поворот спрайта работает далеко от идеала, но я пока остановился на этом. Если вы знаете способ лучше, то напишите в комментариях либо мне на почту/джаббер.
blog comments powered by Disqus