Странная вещь происходит с SKSpriteNode с прозрачными границами

Хорошо, у меня есть этот код:

        SKSpriteNode *flagTile = [((BGSKView *) self.skView).tileSprites[@"flag"] copy];
        flagTile.anchorPoint = CGPointZero;
        flagTile.size = touchedNode.size;
        flagTile.name = @"flag";

        [touchedNode addChild:flagTile];

Когда пользователь нажимает на поле (SKSpriteNode), он добавляет к своим дочерним элементам еще один спрайт — узел флага. Размер текстуры touchedNode 80x80, текстура флага 80x80... они абсолютно одинаковы, главное отличие в том, что текстура флага имеет прозрачные границы.

Здесь:

введите здесь описание изображения

Но происходит странная вещь: флаговый узел всегда имеет свою реальную (давайте назовем его «прикасаемой») область меньше, чем touchedNode, и его положение довольно странное.

Вот так:

введите здесь описание изображения

Структура всех моих слоёв такова: CompoundNode содержит два слоя - A и B. Когда требуется изменение размера всего дерева, устанавливается xScale и yScale (compoundNode). Никаких других манипуляций с размерами.

Что я делаю неправильно?

Что мне действительно нужно, так это чтобы моя область касания flagTile была размером с touchedNode. И еще: если я заменю:

SKSpriteNode *flagTile = [((BGSKView *) self.skView).tileSprites[@"flag"] copy];

с этим:

SKSpriteNode *flagTile = [SKSpriteNode spriteWithColor:[UIColor clearColor] size:touchedNode.size];

это прекрасно работает.

Я пробовал даже изменить свойство текстуры после создания спрайта clearColor - ничего не работает.

Спасибо.


person AndrewShmig    schedule 14.04.2014    source источник


Ответы (2)


Команда SKSpriteNode *flagTile = [((BGSKView *) self.skView).tileSprites[@"flag"] copy]; создает ваш спрайт, но игнорирует невидимые части вокруг флага. Когда я открываю изображение вашего флага в моем редакторе изображений (Adobe Fireworks) и выбираю ваш флаг, выбирается только фактический прямоугольник флага (посмотрите на изображение, которое я разместил).

Единственный обходной путь, который я могу придумать, - это добавить белый (или любой цвет, который вы хотите) квадрат за флагом размером 80,80. Затем установите альфа квадрата на 1 пункт выше полностью прозрачного. Я думаю, что это должно позволить сделать все изображение 80 на 80 сенсорным.

введите здесь описание изображения

person sangony    schedule 14.04.2014
comment
Ух ты! Спасибо, но это действительно единственное решение? Что, если бы у меня была более сложная графика, для которой нужно было использовать прозрачные изображения с рамками и без дополнительных цветов? - person AndrewShmig; 15.04.2014
comment
Все зависит от структуры вашего кода. Есть несколько вещей, которые вы можете сделать. Вместо того, чтобы использовать слой alpha+1, вы можете поместить крошечную точку в диагональные углы. Другой более чистый вариант — просто использовать узел спрайта как есть и добавить поверх него невидимый узел большего размера для обработки прикосновений. - person sangony; 15.04.2014
comment
Вы можете использовать изображение своего флага для создания альфа-канала флага (это должен быть белый флаг на черном фоне), затем вы можете объединить его в Photoshop, чтобы создать 32-битный файл PNG. Обратите внимание, что, вероятно, лучше всего поместить основной флаг на сплошной фон, цвет не имеет значения, так как он все равно будет удален альфой. Таким образом, вы не получите угловые точки, а размер берется из полного изображения (без прозрачных пикселей). - person fuzzygoat; 16.04.2014
comment
@sangony Я думаю, что лучший ответ здесь — добавить прозрачный узел с четким цветом и правильным размером. Более чистый и простой способ реализации. Вы можете отредактировать свой ответ и спасибо за информацию. - person Dima Deplov; 21.08.2014

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

person AndrewShmig    schedule 15.04.2014