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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.