LINUX.ORG.RU

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

 ,


0

1

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

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

в данном случае описан частный случай преобразования из полярных координат в декатовы. Только вот прицел ближе ты не подведешь - это раз. Дополнительно смещение >половина размера картинки. зачем оно? - тоже частный случай - это два.

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

Вот как.

angle = atan2 ( event.motion.y - pd.y - 64, event.motion.x - pd.x - 64 );
angle = angle * 180 / M_PI;
cd.x = 180 * cos ( angle ) + pd.x + 64;
cd.y = 180 * sin ( angle ) + pd.y + 64;
Так как я увеличиваю рисунок, то у меня изображение вместо 32x32 становиться 128x128.
angle - сначала радиана, потом угол.
event.motion - координаты передвижения курсора.
pd - позиция персонажа, с вычетом пол картинки, или с плюсом пол картинки.
cd - позиция прицела.

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

Ясно. Можно сделать сильно проще с помощью векторов, без обмазывания тригонометрией (я ничего не имею против неё).

Есть следующие радиус векторы:
event.motion - положения курсора
pd - позиция персонажа
Найти:
cd - позиция прицела

Находим вектор направления на курсор:
dir = event.motion - pd
Нормализуем вектор:
normDir = normalize(dir)
Произвольно задаём расстояние, на которое выдвигаем прицел. Это тоже вектор:
dst = vector2d(50, 50) - отодвинуть на 50 единиц
Теперь вычисляем положение прицела:
cd = pd + normDir * dst

Всё. Как видишь не нужно никаких углов, синусов и прочих нюансов. Тебе только нужна библиотека для работы с векторами. Хотя библиотека это громко сказано. Тут только сложение, вычитание, скалярное умножение и нормализация - самый минимум. Но если ты делаешь игру, это всё равно пригодится.
Я сейчас накидал на qml вышеприведённый код. Работает хорошо.

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

Вижу ваш ник означает правильное завершение mbr. А что значит нормализовать вектор, и где об этом можно почитать. Но вот отодвинуть на 50, 50 для меня это сложно для понимания, как можно отодвинуть, если прицел будет внизу, как тогда x двигать на 50?

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

Находим вектор направления на курсор: dir = event.motion - pd Нормализуем вектор: normDir = normalize(dir) Произвольно задаём расстояние, на которое выдвигаем прицел. Это тоже вектор: dst = vector2d(50, 50) - отодвинуть на 50 единиц Теперь вычисляем положение прицела: cd = pd + normDir * dst

Это и для x и для y сделать надо?

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

А что значит нормализовать вектор

Думаю на википедии должно быть написано. В твоём случае нужно каждый компонент вектора (x и y) разделить на длину вектора. Длина это sqrt(x*x + y*y).

Но вот отодвинуть на 50, 50 для меня это сложно для понимания

Это расстояние от персонажа до прицела. Можешь выбрать любое число.

если прицел будет внизу, как тогда x двигать на 50

Теперь это тебя не будет волновать. Это всё уже учтено при вычислении dir.

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

Ошибочка вышла. Надо так:
dst = 50
Т.е. dst это просто число, а не вектор. Соответственно здесь:
cd = pd + normDir * dst
вектор normDir умножается на число. Я в qml использовал vector2d.times и не правильно переписал.

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

И как же найти то?

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


можно как нибудь из угла узнать координаты для x и y?

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

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

Тебе нужны функция для работы с векторами. Можешь сам написать или найти в интернете.

Например по-быстрому, сам вектор

struct vector2d
{
    double x;
    double y;
}
Сложение:
vector2d vecAdd(vector2d one, vector2d two)
{
    vector2d res;
    res.x = one.x + two.x;
    res.y = one.y + two.y;
    return res;
}
Вычитание:
vector2d vecSub(vector2d one, vector2d two)
{
    vector2d res;
    res.x = one.x - two.x;
    res.y = one.y - two.y;
    return res;
}
Умножение вектора на число:
vector2d vecMulScalar(vector2d vec, double value)
{
    vector2d res = vec;
    vec.x = vec.x * value;
    vec.y = vec.y * value;
    return res;
}
И так далее для всех операций, которые тебе нужны. Потом переписываешь мой пример с использованием этих функций:
vector2d pd; // персонаж
pd.x = ...; // Присваиваешь его координаты
pd.y = ...; 

vector2d cur; // курсор
cur.x = event.motion.x;
cur.y = event.motion.y;

vector2d dir = vecSub(cur, pd);
vector2d normDir = vecNorm(dir);
vector2d shift = vecMulScalar(normDir, dst/*50*/);
vector2d cd = vecAdd(pd, shift);

cd.x // найденные координаты прицела
cd.y
Я за тебя почти весь код написал. Функцию нормализации vecNorm сам сделаешь, я уже писал как.

ox55ff ★★★★★
()

Школоло подалось в игоря?

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

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

Почему, я же узнал.

позиция прицела.x = 180 * cos ( angle ) + позиция персонажа.x + 64;
позиция прицела.y = 180 * sin ( angle ) + позиция персонажа.y + 64;

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

В общем случае, если на то пошло, переход из полярных координат в декартовы происходит вот так:

double rangle = angle * M_PI / 180;
crosshair.x = r * cos(rangle);
crosshair.y = r * sin(rangle);
Из чего видно, что расстояние до центра (r) тебе известно — 180, на которые ты умножаешь

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

Да, если r сделать больше, то и расстояние больше будет, а также надо плюсовать координаты персонажа, чтобы от туда отсчитывалось.

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

Вот класно, какая та формула, а такую полезную работу делает. Ума не приложу как учёные до этого додумались.

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

Кстати, а ты знаешь сборник таких вот полезных формул, чтобы для разработчика игр было полезной книгой. Да и кстати, может ты не по памяти знаешь формулы, тогда где берёшь?

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

Кстати, а ты знаешь сборник таких вот полезных формул, чтобы для разработчика игр было полезной книгой. Да и кстати, может ты не по памяти знаешь формулы, тогда где берёшь?

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

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