Как сделать PhysicsBody на основе альфа-значений

Допустим там есть сцена следующего вида: Есть сцена размером с кадр устройства. В сцене есть красный шар, который может перемещаться по «миру». Этот мир определяется черными и белыми областями, где мяч может двигаться ТОЛЬКО в белой области. Вот картинка, которая поможет объяснить: Картина сцены

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

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

Я попытался найти другие методы для реализации этой сцены типа «разрушаемой местности», но решения, которые я нашел и попробовал, использовали другие игровые движки. Чтобы уточнить, я использую Objective-C и платформу Apple SpriteKit; и я не ищу подробный класс, полный кода, а скорее некоторый псевдокод или идеи реализации, которые привели бы меня к решению.

Спасибо.


person Andriko13    schedule 15.11.2014    source источник
comment
По сути, вам нужен алгоритм отслеживания контуров, который создает CGPath контура пещеры. Каждый раз, когда пещера меняется, вам нужно повторно запускать этот алгоритм и заменять существующее тело реберного цикла. Однако это отслеживание и воссоздание форм, вероятно, не позволяет использовать это в экшн-игре в реальном времени или там, где пещера может меняться практически все время.   -  person LearnCocos2D    schedule 15.11.2014
comment
Извините, если я был недостаточно ясен, это было первое решение, которое я попытался. Сначала это было возможно (где пещера начиналась с маленького белого круга); но, как вы сказали, это было бесполезно, когда край приобрел сложную форму из-за постоянных изменений.   -  person Andriko13    schedule 15.11.2014


Ответы (1)


Если вашей целью развертывания является iOS 8, это может быть то, что вы ищете...

+ bodyWithTexture:alphaThreshold:size:

Вот описание из документации Apple

Создает физическое тело из содержимого текстуры. В тело физики включаются только тексели, прозрачность которых превышает определенное значение.

где тексель — это элемент текстуры. Вам нужно будет преобразовать изображение в текстуру перед созданием файла SKPhysicsBody.

Я не уверен, позволит ли это сделать отверстие посередине, как на вашем рисунке. Если нет, я подозреваю, что вы можете соединить два физических тела, левую половину и правую половину, чтобы сформировать дыру.

person 0x141E    schedule 15.11.2014
comment
Спасибо за классную идею, я не знал, что в iOS 8 есть такая возможность. На самом деле моя первоначальная идея заключалась в том, чтобы сделать отверстие внутри тела (или много разных отверстий, если уж на то пошло). Я думаю разбить свою текстуру на множество частей, а затем использовать каждую часть как отдельное тело (чтобы иметь возможность реализовать отверстия). Однако, если отверстие достаточно маленькое, оно все равно не будет его отображать. Любая идея, как я мог бы реализовать «дыру» без нескольких текстур? - person Andriko13; 16.11.2014
comment
Лично я бы ориентировался на iOS 8 для такого типа игр. Для его реализации потребуется гораздо больше усилий, и я предполагаю, что физические тела будут лишь грубым приближением к формам, которые пользователь сможет нарисовать. - person 0x141E; 16.11.2014
comment
Целью является iOS8, я никогда не говорил иначе. Но если в середине текстуры есть дырка, спрайт не распознает ее. - person Andriko13; 16.11.2014
comment
Вот почему я предложил разделить форму на две части. Зачем вам несколько частей? - person 0x141E; 16.11.2014
comment
Форма будет постоянно меняться. Если внутри одной из частей есть целое, что тогда? - person Andriko13; 16.11.2014
comment
Я предполагаю, что игра начинается с довольно большой дыры посередине с мячом в центре. Если пользователь создает отверстие, которое не является частью исходного отверстия, может ли шарик взаимодействовать с отверстием? Если нет, то зачем вам создавать физическое тело для несмежных отверстий? - person 0x141E; 16.11.2014
comment
Ваше предположение верно, я хотел бы воссоздать более сложную ситуацию, когда пользователь сможет взаимодействовать с целым, которое по сути недостижимо. - person Andriko13; 16.11.2014
comment
Как пользователь будет взаимодействовать с недостижимыми дырами? - person 0x141E; 16.11.2014
comment
Например, телепортироваться к нему - person Andriko13; 16.11.2014
comment
Я отмечаю это как правильный ответ, поскольку технически он отвечает моему OP. Тем не менее, я задам новый вопрос о разделении физического тела ~ надеюсь, вы сможете дать некоторое представление! Спасибо еще раз - person Andriko13; 16.11.2014