Кут відбиття


11

У мене є ця гра "Стиль вибивання".

У мене гармата в центрі, блоки навколо гармати і колодки навколо блоків. Ось як виглядає гра:

Гра в круговий прорив

Мені вдалося отримати зіткнення за піксель, і мій бал " відображається " при контакті з блоками з наступною математикою:

Ball.Direction = 2 * (Block.Direction - Ball.Direction) + 180;

Зображення, що зображує розрахунок кута відображення

Там, де синя лінія - напрямок кулі, а чорна лінія (основна лінія) - поверхня блоку.

Напрямок - це кут, виражений у радіані (який, звичайно, можна перетворити на градуси).
Куля переміщується:

// Event.ENTER_FRAME
x += Math.sin(Direction) * Velocity;
y -= Math.cos(Direction) * Velocity;

Все йде нормально.

Моя проблема виникає зараз із накладками (3 темні та великі блоки навколо маленьких кольорових блоків).

Коли вони обертаються, кут поверхні змінюється.
Більше того, м'яч теж повинен вдарятися в сторони, тож як я можу виміряти напрямок удару та новий напрямок руху кулі?

ps : Якщо потрібно, я можу поставити код та програваний SWF.


Редагувати

Гаразд, проблема з кутами була вирішена з " Векторами" , але у мене все ще є проблема зіткненням боків і спини.

Я відкрию ще одне питання для цього і пов'язую його тут.


3
Якщо ви повторно пов'язуєте свої рахунки, ви повинні отримати бонус за репутацію +100. Це має бути опція на вкладці "Облікові записи" вашого профілю. Тим часом я опублікую ці зображення для вас.
Примітка благодаті

Я збираю ваш напрямок - це кут між 0 і 360, а для переміщення кулі ви використовуєте тригонометрію?
Джонатан Коннелл

@Grace, Дякую вам за зображення ... @ 3nixios, я додав більше інформації про кут і рух.
NemoStein

Якщо ви зберігаєте лише один «напрямок» на блок, можливо, ви переосмислюєте кожен чорний блок як групу з чотирьох окремих блоків, де «напрямок» обличчя завжди спрямоване назовні. Напевно, у чотирьох кутах були крайові корпуси.
horatio

Відповіді:


8

Я не впевнений, чи правильно я зрозумів вашу проблему, але я припустив, що те, що ви хочете зробити, це знайти результат, який ви направляєте куля після зіткнення.

Ось короткий малюнок на моїй білій дошці, який показує можливе рішення для цього:

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

Зелені стрілки представляють швидкість кулі (як вектор), сині блоки представляють ваші великі чорні блоки, а червона стрілка - результат.

У першому випадку синій блок має нахил 30 градусів. Один із способів вирішити проблему зіткнення - повернути все на горизонтальну вісь. Що вам потрібно зробити, це повернути все на 30 градусів (нахил блоку) (для цього можна використовувати матриці).

Потім ви перевіряєте, звідки зіткнення . Якщо зіткнення було горизонтальним, поверніть х компонент швидкості. Якщо вона була вертикальною (як у цьому випадку), y компонент ( ball.Velocity.Y = -ball.Velocity.Y). Це також змусить м'яч діяти правильно, коли він потрапляє в кути (він переверне обидва компоненти). Після цього потрібно просто повернутися назад до реальної ситуації (чого немає на кресленні).

У другому випадку це те саме, за винятком того, що швидкість кулі не перпендикулярна до блоку. Ви обертаєтесь на 70 градусів, перевіряєте, звідки відбулося зіткнення, і повертаєте відповідні компоненти. Після цього ви повертаєтесь до своєї реальної ситуації.

Примітка. Я помітив, що ви використовуєте кут для зображення напрямку, а не вектора. Ви можете просто створити вектор для цих обчислень або зберегти ту саму загальну ідею, але працюючи з кутами.

Це, звичайно, не найкращий шлях, і я впевнений, що ви можете просто обчислити це якимось чином, але я думаю, що це можливе рішення вашої проблеми.


Спасибі ... Полюбила вашу дошку. Я спробую через хвилину ... Ань, а ти думаєш, що вектори могли б краще підтримувати / працювати з ??
NemoStein

Ха-ха, пробачте мої погані навички малювання.
Джессі Емонд

На жаль, я фактично забув важливий крок під час малювання .. Вам потрібно повернутись назад, -block inclination angleщоб мати відповідну реакцію зіткнення .. Дурне мені.
Джессі Емонд

Я думаю, це стосується особистих уподобань, але я віддаю перевагу векторам багато. Вам просто не потрібно думати про математику, що стоїть за ними, більшу частину часу, і зазвичай це робить код чистішим. Таким чином , ви могли б тримати Direction(як вектор) і оновити положення кулі приблизно так: ball.Position += ball.Direction * ball.Speed;.
Джессі Емонд

@Jesse, я досі не міг цього зробити. Я чудово розумів ваш метод, але не зміг його застосувати. Для цього мені потрібно переписати всю частину, яка використовує радіанові кути для використання векторів (насправді це не так багато). Зараз я спробую інші альтернативи, і якщо у вас є ще одна, я буду рада спробувати. Дякую.
NemoStein
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.