06-26-2011, 09:49 PM
Собственно так как Айоном я в данный момент не занимаюсь - делюсь некоторыми из своих вкусностей (у кого мозги не на бикрень - обязательно найдут применение). Собственно ниже речь пойдет о геометрии (к сожалению пока только прямолинейной).
Довольно часто мы знаем в каком направлении мы отправляем объект, знаем с какой скоростью он движется, на какое расстояние, но не знаем точно - где именно он остановится.
Помогут формулы:
Только не забывайте в комитах писать thx Leo (всего 6 букв)![Wink Wink](https://forum.zone-game.info/images/smilies/wink.png)
Так же всем тем, кто мечтает заставить мобов двигаться так же как на офф серверах.
Тут соли много, суть в том - что нынешние эмули умеют учитывать только прямолинейную траекторию движения, плавность же движения задается параметром movementMask. Суть примерно следующая - сервер отправляет клиенту пакет, с определённой маской движения, а клиент сам просчитывает траекторию объекта до конечных координат.
Формулы я конечно в шару не дам, зато расскажу "куда копать". Кто шарит в математике и геометрии - формулы напишут сами.
В общем - представим, что объект стоит на определённых координатах и имеет азимут равный 180 (считаем в градусах окружности). Мы отправляем его в другие координаты, прийдя в которое объект будет иметь азимут равный 0 (т.е. объект развернётся на 180 градусов). Плавность обеспечивается следующим образом:
1. Объект по кратчайшей дистанции на окружности выходит на касательную с конечными координатами, окружность "ложится" так, что бы объект стоял на её внешней стороне и смотрел в одном из направлений окружности.
2. Объект движется по касательной до конечных координат.
Сразу избавлю от амбиций выскочек - учет времени движения (чем в данный момент и занимается мувемент сервис во всех эмулях) - не к чему путнему не приведёт, да и слишком уж это просто![Big Grin Big Grin](https://forum.zone-game.info/images/smilies/biggrin.png)
1. Представьте, что вы посчитали время движения и успешно синхронизировали с клиентом координаты на момент окончания анимации со стороны клиента - и всё вроде бы хорошо.
2. Представьте, что в процессе (к примеру) рандвалька кто либо нанёс даммаг мобу - в таком случае сервер должен достоверно знать текущие координаты моба, что бы задать следующую траекторию движения, а у Вас есть только время. В итоге, сервер не умеющий пошагово просчитывать "криволинейные" траектории не сможет точно сказать, где именно находится объект.
Собственно я описал геометрию только одной маски. На оф серверах используются всего 5-6 масок, в общем - это 5-6 геометрически-математических моделей с 5-10 входными параметрами
В основном те маски, с которыми объекты двигаются "плавно" имеют статические радиусы описанных мною окружностей, в некоторых случаях радиусы эти определяются свойствами движущегося объекта - есть в клиенте в свойствах нпц что-то типа "размера" объекта, чем он больше - тем больше у объекта "радиус поворота". Успехов в начинаниях
Довольно часто мы знаем в каком направлении мы отправляем объект, знаем с какой скоростью он движется, на какое расстояние, но не знаем точно - где именно он остановится.
Помогут формулы:
Код:
/**
* Вычисление X координаты по заданному азимуту и известной дистанции.
* Данный метод вычисляет Y координату на растоянии известной дистанции
* по направлению в заданом азимуте.
*
* @param angle азимут 0* - 360*
* @param distance растояние
* @param x текущая координата по оси X
* @return float x координата на растоянии известной дистанции в направлении заданного азимута
*/
public final static float getXfromAngle(float angle, float distance, float x)
{
float dx = (float)(Math.cos(Math.toRadians(angle)) * distance);
x = x + dx;
return x;
}
/**
* Вычисление Y координаты по заданному азимуту и известной дистанции.
* Данный метод вычисляет Y координату на растоянии известной дистанции
* по направлению в заданом азимуте.
*
* @param angle азимут 0* - 360*
* @param distance растояние
* @param y текущая координата по оси Y
* @return float Y координата на растоянии известной дистанции в направлении заданного азимута
*/
public final static float getYfromAngle(float angle, float distance, float y)
{
float dy = (float)(Math.sin(Math.toRadians(angle)) * distance);
y = y + dy;
return y;
}
Только не забывайте в комитах писать thx Leo (всего 6 букв)
![Wink Wink](https://forum.zone-game.info/images/smilies/wink.png)
Так же всем тем, кто мечтает заставить мобов двигаться так же как на офф серверах.
Тут соли много, суть в том - что нынешние эмули умеют учитывать только прямолинейную траекторию движения, плавность же движения задается параметром movementMask. Суть примерно следующая - сервер отправляет клиенту пакет, с определённой маской движения, а клиент сам просчитывает траекторию объекта до конечных координат.
Формулы я конечно в шару не дам, зато расскажу "куда копать". Кто шарит в математике и геометрии - формулы напишут сами.
В общем - представим, что объект стоит на определённых координатах и имеет азимут равный 180 (считаем в градусах окружности). Мы отправляем его в другие координаты, прийдя в которое объект будет иметь азимут равный 0 (т.е. объект развернётся на 180 градусов). Плавность обеспечивается следующим образом:
1. Объект по кратчайшей дистанции на окружности выходит на касательную с конечными координатами, окружность "ложится" так, что бы объект стоял на её внешней стороне и смотрел в одном из направлений окружности.
2. Объект движется по касательной до конечных координат.
Сразу избавлю от амбиций выскочек - учет времени движения (чем в данный момент и занимается мувемент сервис во всех эмулях) - не к чему путнему не приведёт, да и слишком уж это просто
![Big Grin Big Grin](https://forum.zone-game.info/images/smilies/biggrin.png)
1. Представьте, что вы посчитали время движения и успешно синхронизировали с клиентом координаты на момент окончания анимации со стороны клиента - и всё вроде бы хорошо.
2. Представьте, что в процессе (к примеру) рандвалька кто либо нанёс даммаг мобу - в таком случае сервер должен достоверно знать текущие координаты моба, что бы задать следующую траекторию движения, а у Вас есть только время. В итоге, сервер не умеющий пошагово просчитывать "криволинейные" траектории не сможет точно сказать, где именно находится объект.
Собственно я описал геометрию только одной маски. На оф серверах используются всего 5-6 масок, в общем - это 5-6 геометрически-математических моделей с 5-10 входными параметрами
![Smile Smile](https://forum.zone-game.info/images/smilies/smile.png)
![Smile Smile](https://forum.zone-game.info/images/smilies/smile.png)