LINUX.ORG.RU

Прицел возле игрока

 ,


0

1

Игра вид сверху.
Игрок поворачивается и стреляет, но если курсор подвести ближе к игроку, то пули будут медленней, я и так делю скорость пуль на 25, так вот, если отдалить курсор, то пуля быстрее летит. Как сделать чтобы курсор был на фиксированной расстоянии, если не курсор, то хотябы прицел ( то что нужно ) был на фиксированоом расстоянии. Может есть какая нибудь для это формула, или простой способ.

Как сделать чтобы курсор был на фиксированной расстоянии

Выучить русскую языку и сформулировать вопрос грамотно.

peregrine ★★★★★
()
Ответ на: комментарий от peregrine

В общем сколько не пытайся приблизить или отдалить курсор мыши от персонажа, расстояние курсора или прицела не меняется.

u0atgKIRznY5 ☆
() автор топика
Последнее исправление: u0atgKIRznY5 (всего исправлений: 1)
Ответ на: комментарий от u0atgKIRznY5

sdl2 довольно низкоуровневое API, так что без кода не разобраться.

peregrine ★★★★★
()

Давай код сюда. У тебя в нём косяк, надо смотреть.

slapin ★★★★★
()
Ответ на: комментарий от XMs

Ну я только знаю как узнать в каких координатах был клик мышью, и от этих координат высчитываются вектор, который потом ещё делю, чтобы при каждом ходе было видно как пуля летит. А как лучше?

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

А как лучше?

Задать для пули скорость (длину вектора) константой, а рассчитывать только направление

XMs ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

который потом ещё делю, чтобы при каждом ходе было видно как пуля летит.

Тут у тебя и проблемы с замедлением нарисовываются, а при высчитывании вектора с курсором.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от u0atgKIRznY5

А как направление высчитать?

\vec{x_n}=\frac{\vec{x}}{\lvert\vec{x}\rvert}

i-rinat ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Ты это серьёзно? Если игрок — начало координат, то да поможет тебе теорема синусов:

size_t speed = BULLET_SPEED;
double angle = asin(y / speed) / M_PI * 180;

XMs ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Подозреваю, куда-то в SDL_MOUSEBUTTONDOWN. Я с SDL не знаком, могу ошибаться. Только перед вставкой подумай, что будет при y > speed и как от этого защититься (мой код несколько некорректен, он всего лишь показывает теорему синусов)

XMs ★★★★★
()
Ответ на: комментарий от XMs

Да в SDL_MOUSEBUTTON. Но мне нужно чтобы формула выполнялась для двух координат, чтобы можно было на следующем ходу указать новые координаты пули.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

Тебе нужно, чтобы одновременно летело несколько пуль? Очевидно, что тут нужно создать пул пуль. Выстрел -> добавление пули в пул, попадание -> удаление пули из пула. На каждом кадре нужно обходить пул пуль, смещать их координаты по указанной формуле, удалять отработанные пули, отрисовывать летящие пули.

Nietzsche
()
Ответ на: комментарий от u0atgKIRznY5

Школьный курс геометрии за 7-й, ЕМНИП, класс.

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

XMs ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Так у меня это есть. Наверное ты не понел что мне нужно.

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

Тогда я не могу понять суть проблемы. Следующий ход - это следующий выстрел? Следующий кадр?

Nietzsche
()
Ответ на: комментарий от u0atgKIRznY5

Так же, как и в математике. Берёшь листочек, делаешь простой чертёж для наглядности, решаешь задачу. Выражение, которое ты получишь, и будет кодом с минимальными поправками. Эта задача решается за минуты, если постоянно подглядывать в википедию, и за десятки секунд, если всё помнишь

XMs ★★★★★
()

если курсор подвести ближе к игроку, то пули будут медленней

b[count].vy = event.button.y - b[count].bd.y;
b[count].vx = event.button.x - b[count].bd.x;

вот из-за этого, b.bd равно позиции игрока вначале. тебе надо самому задать начальную скорость (V), например 1 пиксел/кадр, а vx и vy вычислять исходя из этой скорости и angle (в градусах):

b[count].vy = V * sin(angle / 180 * M_PI);
b[count].vx = V * cos(angle / 180 * M_PI);

сам понимаешь, что вычислять из радиан градусы — бесполезное дело.

anonymous
()
Ответ на: комментарий от XMs

Ты наверное знаешь, так подскажи, может тебе интересно решить такое, кто знает, может это тебя сподвигнет на создание своей игры, которая потом принесёт доход!

u0atgKIRznY5 ☆
() автор топика

Программисту не нужна математика, говорили они...

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

Ты наверное знаешь

Знаю. Потому что перед тем, как это написать, я сделал то же, что советовал сделать тебе: взял бумажку с ручкой и решил задачу. Так в чём проблема решить? Для программиста математика — вторая азбука.


может тебе интересно решить такое

Не, такое мне решать неинтересно. Может быть, полезно для того, чтобы хоть чуть-чуть расшевелить пространственное мышление да и вообще не забыть, но ни разу не интересно

XMs ★★★★★
()
Ответ на: комментарий от XMs

Хотел в пример игры hotline miami привести, так как думал что там прицел возле персонажа, а оказывается прицел гуляет в разные стороны.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

может это тебя сподвигнет на создание своей игры, которая потом принесёт доход

Школота, блин. Простейшую математику осилить не может, а уже о доходе думает...

anonymous
()
Ответ на: комментарий от u0atgKIRznY5

Пока сижу и мёрзну, даже подскажу часть решения, для затравки. Пусть alpha — угол, откладываемый от оси абцисс против часовой стрелки, задающий направление выстрела, пара координат (x, y) — точка клика, speed — длина вектора скорости, l — длина вектора клика, а пара (xs, ys) задаёт вектор скорости. Значения (x, y) и speed известны, остальные надо выразить через них. Вопрос: как найти угол alpha?

XMs ★★★★★
()
Ответ на: комментарий от XMs

И как же найти то? Например кстати у меня известен угол поворота, можно как нибудь из угла узнать координаты для x и y?

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от u0atgKIRznY5

И как же найти то? Например кстати у меня известен угол поворота, можно как нибудь из угла узнать координаты для x и y?

Ну это же программа средней школы. Класс 5-6, если мне память не изменяет. Если вы еще не изучали геометрию, то можно обратиться к гугелю - он подскажет нужное.

Конкретно в вашем случае можно поступить несколькими способами, но оба способа не требуют вычисления sin/cos на каждый update:

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

float lerp(float from, float to, float t)
{
    return (1.0f - t) * from + t * to;
}
andreyu ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

И хвати ставить тег sdl2 - он никакого отношения к теме не имеет. Ставьте теги «я еще не ходил в школу», «мне лень думать», «сделайте вместо меня».

andreyu ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Глас в пустыне:
ТС, наблюдаю за тобой уже постов, наверно пять. И делаю вывод - тебе не хватает кругозора!
У тебя явно существуют проблемы:

  • Отсутствие достаточных знаний в геометрии.
  • Отсутствие достаточных знаний в области элементарной физики.
  • Отсутствие достаточных знаний и навыков в выбранном язык программирования.
  • Отсутствие достаточных знаний в области компьютерной графики и в частности аффинных преобразований.
  • Отсутствие умения искать информацию и учиться.
  • Метание из стороны в сторону и не способность довести дело до конца.

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

Silerus ★★★★★
()
Ответ на: комментарий от Silerus

Вообще то я читаю книжки. Но художественная, пустая трата времени.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от Silerus

Да это ж новая версия DeepCoder, раньше он просто тырил снипеты со стаковервлоу а теперь вот сам вопросы задаёт.

ya-betmen ★★★★★
()
Ответ на: комментарий от u0atgKIRznY5

Я что-то не понел какие данные нужно в lerp вносить?

Если вам действительно 30 лет, то это уже клиника какая-то. Может ну его нафиг, это программирование?

Там же русским по белому написано - «от», «до», «время (0.0 - 1.0)».

andreyu ★★★★★
()
Ответ на: комментарий от Silerus

Само отсутствие знаний не так страшно, как полное нежелание их получать и минимальное желание думать.

andreyu ★★★★★
()
Ответ на: комментарий от ya-betmen

я, честно говоря, не вижу ничего зазорного, подсмотреть решение на stackoverflow, если не знаешь как сделать, а велосипедить не хочется - то почему не посмотреть как это сделали по человечески. Например stl - искать по книжке пример порой очень долго, особенно если не знаешь где. В наших вузах, по какой-то причине не преподавали stl, а тут раз и готовое решение, а дальше можно и в книжку залезть посмотреть нужный раздел. Но вот позорится со школьными вопросами - я бы не стал, особенно выпячивать свое незнание и кичится им.

Silerus ★★★★★
()
Ответ на: комментарий от Silerus

я так и написал вроде,только другими словами, нет?

Длинную простыню я заменил лаконичной фразой. А по сути верно.

andreyu ★★★★★
()

От вас толку нет вообще, только пишете здесь свои теории. Вот как курсор должен крутиться вокруг персонажа.

курсор.x = 180 * cos ( angle ) + позиция персонажа x + половина размера картинки.
курсор.y = 180 * sin ( angle ) + позиция персонажа y + половина размера картинки.

u0atgKIRznY5 ☆
() автор топика
Ответ на: комментарий от Silerus

Но это только крутиться вокруг персонажа, а стреляет всё равно в сторону настоящего курсора, тоесть курсор который я написал в примере является текстурой прицела, я неправильно написал. Тоесть также если курсор подведу ближе то пули различаются, но прицел движется вокруг.

u0atgKIRznY5 ☆
() автор топика
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.