Як змусити сутність рухатися в напрямку?


11

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

moveForward(90);повинні змусити їх рухатися праворуч. Якщо я заявив про свою ротацію як глобальну int, то роблю

moveForward(rotation);
rotation++;

зробило б це простежити невелике коло своїм рухом.

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

Відповіді:


16

Ну, у найпростішому сенсі у вас є щось подібне.

   y  |\
      | \
   m  |  \         s
   o  |   \        p
   v  |(a) \       e
(y)e  |angle\      e
   m  |      \     d
   e  |       \
   n  |        \
   t  |         \
      |__________\
      x movement
        (x)

Швидкість наскільки ворога швидка, і ви можете визначити, скільки вони повинні рухатися в напрямку x і скільки вони рухаються в напрямку y, взявши гріх або cos кута і помноживши на швидкість. Тому що...

 sin(a) = x / speed

Тому:

 x = speed * sin(a)

І:

cos(a) = y / speed

Тому:

y = speed * cos(a)

У вашому прикладі moveForward(90)вийде speed * sin(90)або speed * 1в напрямку x, speed * cos(90)або 0в напрямку y (він повинен рухатися праворуч, як ви вказали). Це повинно почати вас в основному сенсі.

Зробити це загальним:

moveForward(float angle)
{
    x += speed * sin(angle);
    y += speed * cos(angle);
}

Ах, це набагато простіше, ніж я уявляв, велике спасибі :)
Shaun Wild

Я впевнений, що вам потрібно переключити y і x. sin (альфа) = b / c.
jcora

@Bane це відповідає малюнку, який я зробив SOH-CAH-TOA, гріх протилежний гіпотенузі, яка на кресленні - х / швидкість. Якби кут був на іншій стороні трикутника, він би був перевернутий (і якщо це більш практично для цілей ігрового дизайну, я міг би його змінити, але я відчуваю його довільним).
Kevin DiTraglia

Я на своєму мобільному телефоні, тому інтерпретувати це було досить важко. Я щойно
скупився

Це дійсно приємний трикутник, який ти там дістався. +1
Бро Кевін Д.

3

Інша відповідь неправильна, як зараз, щоб правильно рухатись по площині на основі обертання, виконайте наступне:

posX += Math.cos(rotation) *  forwardSpeed + Math.sin(rotation) * strafeSpeed;
posY -= -Math.cos(rotation) * strafeSpeed + Math.sin(rotation) * forwardSpeed;

Однак я рекомендую зробити змінну для cos / sin, яку ви оновлюєте лише тоді, коли обертання зміниться, щоб ви не обчислили її 4 рази.

Страйк-Швидкість рухалася б з боку в бік, швидкість вперед - рухалася вперед уздовж обертання.

редагувати: tesselode робить те саме, за винятком того, що у нього немає руху в бік.


2

Ви сказали, що тикає оновлення, тому я припускаю, що у вас немає змінної частоти кадрів. Якщо так:

x + = швидкість * math.cos (кут)

y + = швидкість * math.sin (кут)

Якщо ви використовуєте змінну частоту кадрів, вам також потрібно помножити на дельта-час.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.