У верхній частині моєї голови застереження, яке дотримується мене, - це те, що ви хочете, щоб зона була постійною. Це вражає мене як біль у всьому цьому, тому давайте спробуємо запропонувати просте рішення для цього.
Візьміть шматочок струни і зв’яжіть кінці разом, щоб зробити коло. Можливо, я помиляюся, але моя інтуїція говорить про те, що внутрішня частина цього рядка має постійну площу або може діяти дуже жахливо, як ваша межа амеби.
Тому я б сказав: реалізуйте рядок. ;) Більшість бібліотек фізики можуть робити пружини (у Box2D це виглядає як з'єднання відстані), і найпростіший спосіб зробити рядок - це з'єднати багато рядків разом. Приєднуйтесь до останнього до першого, щоб створити цикл. Переконайтесь, що пружини в струні мають достатньо високу постійну пружину, щоб не розтягуватися - ви хочете, щоб вони були досить жорсткими і рухалися в унісон, а не розширювалися.
Далі створіть сили для дії на струні. Тривіально ваші два ядра / очі / контрольні точки створюють сили на точки, що складають рядок. Зробіть падіння сили за допомогою функції зворотного квадрата:
float forceOnPoint(point, ball)
{
float d = distance(point, ball);
return K / (d*d);
}
І направляйте напрямок сили безпосередньо від керуючого ока / кулі, як відштовхуюча сила, що виходить від кулі. Налаштуйте K, щоб контролювати силу сили. Переконайтесь, що K не надто високий - ви не хочете, щоб його просто виштовхували силою, просто тримайте його подалі від кульок. Залиште велику кількість млявості у вашій нитці.
Щойно з цими двома ви, ймовірно, отримаєте цілком рівномірну форму, тому я б також запропонував вам створити трохи слабкіші сили навколишнього «супу», щоб змінити форму амеби. Ви можете робити ці випадкові місця, регулярно змінювати їх силу (ви можете зробити це синусоїдною функцією для приємних рухів) і змусити їх працювати так само, як кульки.
Вагінація (fnarr): це найскладніший. Ви змушуєте його обволікати об'єкт, перевіряючи, чи вдалося дві сусідні точки на рядку наблизитись, і якщо так, вам потрібно:
Виміряйте відстань між точками на рядку. Порахуйте кількість пружинних секцій. Знайдіть «коротший» шлях від А до В.
Розрийте рядок і знову з'єднайте його з двома сусідніми точками. Іншими словами, безпосередньо з'єднайте точку А до точки В і відкиньте всі речі між ними.
Повторно вставте пропущене число очок (плюс будь-які бонусні бали, якщо ви хочете збільшити розмір, поївши щось) в рядок з іншого боку - тобто сторону від B до A. Якщо ви вставите їх однаково по довжині і зробіть їх коротшими, ніж бажана відстань між точками, ви повинні отримати приємний пружинисто-розширений ефект.
Я думаю, що це охоплює все. До речі: ідея звучить приголомшливо.