Как развернуть картинку в Quartz?

Решил на выходных пописать маленькую игрушку типа морского боя, который раньше был в советских игровых автоматах. Вдали ходит кораблик, а ты пускаешь в него торпеды. Быстро налабал картинку кораблика — не пугайтесь 🙂 и начал писать.

Через некоторое время он уже двигался у меня по экрану справа налево нормально, а назад он шел как бы задним ходом, а мне хотелось, чтобы картинка разворачивалась — и он шел слева направо носом, а не кормой. Конечно, можно было в любом редакторе отзеркалить изображение и менять картинки в зависимости от того куда движется кораблик. Но интуитивно было понятно, что надо просто развернуть изображение. Начал искать по форумам и книгам и вот что нашел и реализовал:


// начинаем новый контекст
// 75 на 40 это был размер моего кораблика
CGSize itemSize = CGSizeMake(75, 40);
UIGraphicsBeginImageContext(itemSize);
CGContextRef ctx = UIGraphicsGetCurrentContext();

// сдвигаем систему координат нашего нового контекста
CGContextTranslateCTM(ctx, 75, 40);

//изменяем ось координат - зеркалим ее по горизонтали и вертикали
CGContextScaleCTM(ctx, -1.0, -1.0);

//рисуем наш кораблик в новых условиях
CGRect XtargetPlace = CGRectMake(0,0,75,40);
CGContextDrawImage(ctx, XtargetPlace, targetImage.CGImage);

//забираем его из контекста
UIImage *flipTargetImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

//рисуем его уже повернутый на нашем экране
CGRect targetPlace = CGRectMake(targetPos,TARGET_DISTANCE,75,40);
CGContextDrawImage(context, targetPlace, flipTargetImage.CGImage);

Операции сдвига координат и зеркала требуют пояснения. В iPhone координаты начинаются в левом верхнем углу. И если мы попросим программу нарисовать UIImage методом CGContextDrawImage, то она нарисует его вверх ногами. К тому же нам надо чтобы направление движение нашего кораблика было в противоположную сторону. После применения CGContextScaleCTM (ctx, -1.0, -1.0) система координат нашего iPhone станет примерно такой как на рисунке — то есть по сути мы будем рисовать за пределами экрана, но зато кораблик будет нарисован именно так как нам надо. И если мы сместим начало сетки координат вправо и вниз — то все станет как нам надо. Это мы и делаем методом CGContextTranslateCTM.

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s