Как создать и нарисовать визуальный жест смахивания

Я хотел бы попробовать реализовать визуальное смахивание для проекта iPhone, как это делается в некоторых играх, таких как Fruit Ninja. Когда вы проводите пальцем по экрану, он оставляет след, который через некоторое время исчезает. Я бы подумал, что у вас может быть фиксированное количество точек в «цепочке», и по мере добавления новых точек спереди старые удаляются сзади. Я вижу использование -touchesMoved для создания новых точек и NSMutableArray для отслеживания точек. Я просто не могу представить, какой метод я бы использовал для рисования сегментов. Могу ли я сделать один CALayer и нарисовать линию, соединяющую активные точки? Или используйте какой-либо другой объект просмотра и соедините их вместе в точках...

Любые идеи?


person Steve    schedule 27.10.2010    source источник


Ответы (1)


Нечто подобное сработало бы, если бы вы заполнили «точки» CGPoints. Предостережение: это задание быстрого вырезания, вставки и редактирования, поэтому, вероятно, будут ошибки. Кроме того, я использую stl::vector для «точек». Возможно, вы захотите использовать какую-то другую структуру.

CGContextRef context = UIGraphicsGetCurrentContext();
CGMutablePathRef dataPath = CGPathCreateMutable();
bool firstPoint = YES;

for (int i=0; i < points.size(); ++i)
    {
    CGPoint point = points[i];
    if (firstPoint)
        {
        CGPathMoveToPoint(dataPath, NULL, point.x, point.y);
        firstPoint = NO;
        }
    else
        {
        CGPathAddLineToPoint(dataPath, NULL, point.x, point.y);
        }
    }

CGContextSetRGBStrokeColor( context, 1.0, 0.0, 0.0, 1.0);
CGContextSetLineWidth( context, 5);
CGContextBeginPath( context );
CGContextAddPath( context, dataPath );
CGContextDrawPath( context, kCGPathStroke);

CGPathRelease(dataPath);
person westsider    schedule 28.10.2010
comment
Прохладный! Так это в методе -drawRect UIView? Кроме того, я не знаком с stl::vector - это какая-то структура? - person Steve; 28.10.2010
comment
Да это правильно. Это будет в -drawRect:. Что касается stl::vector‹›, это часть стандартной библиотеки шаблонов, которая является частью C++. Включение его в Obj-C добавляет еще пару проблем с точки зрения настройки (в основном изменение .m на .mm и добавление пары строк #include), но преимущества значительны. Например, stl::vector‹› дает вам изменяемые массивы, но на более низком уровне и с гораздо меньшими накладными расходами (затратами), чем NSMutableArray, который может содержать только NSObjects. - person westsider; 28.10.2010
comment
Спасибо, @westsider - я еще не сделал этого, но я уже в пути. Сейчас я использую обычный массив C из CGPoints. На данный момент вещи stl слишком далеки от моей зоны комфорта. Я мог бы попробовать CFMutableArray - я думаю, что он может принять CGPoints, и бесплатный мост соединен с NSMutableArray. - person Steve; 29.10.2010