Проверьте, находится ли UIImage в верхней части экрана - PullRequest
1 голос
/ 16 февраля 2012

У меня небольшой вопрос, у меня есть код для генерации 200 UIImages в случайных положениях и поворотах.

Мне нужно обнаружить событие касания на этих изображениях, но мне нужно проверить, не затронуты ли UIImage никакими другими изображениями (даже если они пересекаются в небольшой области).

Кто-нибудь может мне помочь в этом?

Кстати: я пытаюсь сделать что-то похожее на эту игру: http://www.dressup247.com/game/1014/Bank-Note-Stack.html

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

Я бы предложил сделать все изображения как UIButton с фоновым изображением и установить для всех кнопок одно действие. Еще один совет - установите порядок тегов для каждой кнопки от самых низких до самых высоких (и сохраняйте самые большие теги в некоторых iVar). Вы можете сделать это при создании макета. Это позволяет вам определить, сколько видов лежит поверх повернутого вида.

Используйте CGRectIntersectsRect пересекающиеся виды.

-(IBAction)banknotTapped:(UIButton*)sender{
    int tag = sender.tag

    NSMutableArray *highestViews = [NSMutableArray array];

    for (int i=sender.tag; i < biggestTag; ++i){
       UIView *v = [self.view viewWithTag:i];
       if (CGRectIntersectsRect(sender.frame, v.frame) ) // it allows to find intersecting views 
           [highestViews addObject:v];
    }
}

Теперь highestViews будет содержать все самые высокие представления, которые пересекаются с отправителем.

Примечание: теги позволяют обнаруживать представления, но если вы удалите изображения из суперпредставления, это может привести к проблемам, так как порядок тегов будет нарушен. Скрывайте виды вместо удаления или следуйте методу @Costique, чтобы определить порядок просмотров.

1 голос
/ 19 февраля 2012

Хотя я бы предположил, что это было бы быстрее сделать математически, определяя банкноты как прямоугольники и проверяя их на перекрытие, используя что-то вроде теоремы о разделении осей, это явно не то, что вы спрашиваете, и не подходит для изображений общего случая.

Поэтому я предлагаю вам создать CGBitmapContext того же размера, что и ваша игровая зона, и при заполнении игровой зоны для каждой размещаемой ноты вы делаете что-то вроде:

  • назначить новый, еще неиспользованный цвет для банкноты
  • нарисовать его в контексте растрового изображения в месте его назначения, но как сплошной объект назначенного цвета - так вы сохраните контур исходной формыно в каждом пикселе вы рисуете либо сплошной, назначенный цвет, либо вообще никакого цвета
  • посчитайте, сколько пикселей во всем контексте теперь является назначенным цветом, сохраните это с вашим объектом, представляющим примечание

Впоследствии, когда игра начнется, запустите через буфер и посчитайте, сколько из каждого ассвзрослый цвет.Все заметки с тем же номером, которые хранятся в текущий момент, находятся сверху.Всякий раз, когда заметка удаляется, перерисовывайте все остальные по порядку и делайте подсчет цветов один раз.

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

Вероятно, самый простой способ сделать рисунок одним цветом - создать маску версии каждого графика при его загрузке, а затем нарисовать его.с подходящим оттенком.Здесь есть введение в альфа-маски здесь ;вы, вероятно, захотите создать пользовательский контекст растрового изображения, а не использовать неявный контекст, возвращаемый UIGraphicsGetCurrentContext, и постфильтровать, чтобы проверить выходную альфа - нажимая вниз до 0, если он меньше некоторого порога, до 255 в противном случае.

1 голос
/ 16 февраля 2012

Вы можете использовать следующий фрагмент, чтобы определить порядок подпредставления в родительском представлении:

NSUInteger order = [containerView.subviews indexOfObjectIdenticalTo: subview];

Чем меньше order, тем выше subview. У самого верхнего подпредставления будет ноль order.

...