Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Языки программирования

Важная информация

Языки программирования Изучаем С++, Sql, php, Lua, Python

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.09.2011, 16:15   #1
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию Алгоритм заставляющий моба бежать лицом вперед

Нужно заставить моба бежать лицом вперед. Набросал такой алгоритм:
Код:
                    float angl = spawnedCreature->GetOrientation() * 180 / M_PI;
                    float len_x = 10 * sin(angl);
                    float len_y = 10 * cos(angl);
                    if (angl > 180)
                        spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + len_x, spawnedCreature->GetPositionY() + len_y, spawnedCreature->GetPositionZ());
                    else
                        spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() - len_y, spawnedCreature->GetPositionY() - len_y, spawnedCreature->GetPositionZ());
Но моб иногда бежит не лицом вперед, а по диагонали. Что может быть тут не так?
HuntsMan вне форума   Ответить с цитированием
Старый 21.09.2011, 17:41   #2
SilverIce
MaNGOS Dev
 
Регистрация: 14.03.2010
Сообщений: 38
Сказал(а) спасибо: 23
Поблагодарили 49 раз(а) в 16 сообщениях
SilverIce Скоро придёт к известности
По умолчанию

> float angl = spawnedCreature->GetOrientation() * 180 / M_PI;

радианы переводите в градусы. зачем ?
sin/cos работают с радианами

Последний раз редактировалось SilverIce; 21.09.2011 в 18:21.
SilverIce вне форума   Ответить с цитированием
Старый 21.09.2011, 19:35   #3
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию

Цитата:
Сообщение от SilverIce Посмотреть сообщение
> float angl = spawnedCreature->GetOrientation() * 180 / M_PI;

радианы переводите в градусы. зачем ?
sin/cos работают с радианами
Там вроде погрешность идет.
Я кое что накалякал тут на бумашке, как буду дома прийду и проверю, потом покажу

add:
Сделал вот так:
Код:
                    float angl = angle * 180 / M_PI;
                    if (angl < 90)
                        spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + 5*cos(angl), spawnedCreature->GetPositionY() + 5*sin(angl), spawnedCreature->GetPositionZ());
                    else if (angl < 180)
                        spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() - 5*cos(angl), spawnedCreature->GetPositionY() + 5*sin(angl), spawnedCreature->GetPositionZ());
                    else if (angl < 270)
                        spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() - 5*cos(angl), spawnedCreature->GetPositionY() - 5*sin(angl), spawnedCreature->GetPositionZ());
                    else
                        spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + 5*cos(angl), spawnedCreature->GetPositionY() - 5*sin(angl), spawnedCreature->GetPositionZ());
Но что-то все равно по диагонали бегут. Я уже хз что им ещё нада. На бумаге вроде все ровно получается, а на деле...

Последний раз редактировалось HuntsMan; 21.09.2011 в 21:08.
HuntsMan вне форума   Ответить с цитированием
Старый 21.09.2011, 22:19   #4
Minimajack
Гость
 
Сообщений: n/a
По умолчанию

для движения вперед, код на java, но принцип одинаков
не важно какое значение угла синус и косинус даст нужный знак.
Код:
	public void walkForward(float distance)
	{
	    position.x -= distance * (float)Math.sin(Math.toRadians(yaw));
	    position.y += distance * (float)Math.cos(Math.toRadians(yaw));
	}
  Ответить с цитированием
Пользователь сказал cпасибо:
HuntsMan (21.09.2011)
Старый 21.09.2011, 22:57   #5
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию

Точнее вот так будет:
Код:
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + 10*cos(angle), spawnedCreature->GetPositionY() + 10*sin(angle), spawnedCreature->GetPositionZ());
И работает
HuntsMan вне форума   Ответить с цитированием
Старый 22.09.2011, 06:44   #6
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от HuntsMan Посмотреть сообщение
Точнее вот так будет:
Код:
spawnedCreature->GetMotionMaster()->MovePoint(0, spawnedCreature->GetPositionX() + 10*cos(angle), spawnedCreature->GetPositionY() + 10*sin(angle), spawnedCreature->GetPositionZ());
И работает
максимальный угол в wow 6.282f.
MaxXx2021 вне форума   Ответить с цитированием
Старый 22.09.2011, 08:43   #7
Minimajack
Гость
 
Сообщений: n/a
По умолчанию

Цитата:
Сообщение от MaxXx2021 Посмотреть сообщение
максимальный угол в wow 6.282f.
Ориентация то не меняется.
  Ответить с цитированием
Старый 22.09.2011, 09:43   #8
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию

Я проверял для всех углов - работает нормально
HuntsMan вне форума   Ответить с цитированием
Старый 22.09.2011, 17:33   #9
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Minimajack Посмотреть сообщение
Ориентация то не меняется.
это понятно, автор берет значения 180, 90 для чего когда максимальный угол такой! Синус и косинус на мангосе относительно него работают в игре.
MaxXx2021 вне форума   Ответить с цитированием
Старый 22.09.2011, 17:58   #10
Minimajack
Гость
 
Сообщений: n/a
По умолчанию

Цитата:
Сообщение от MaxXx2021 Посмотреть сообщение
это понятно, автор берет значения 180, 90 для чего когда максимальный угол такой! Синус и косинус на мангосе относительно него работают в игре.
вы путаете градусы и радианы.
  Ответить с цитированием
Старый 22.09.2011, 18:05   #11
MaxXx2021
Ученый
 
Аватар для MaxXx2021
 
Регистрация: 09.03.2010
Адрес: Кыргызстан
Сообщений: 266
Сказал(а) спасибо: 41
Поблагодарили 115 раз(а) в 34 сообщениях
MaxXx2021 Скоро придёт к известности
По умолчанию

Цитата:
Сообщение от Minimajack Посмотреть сообщение
вы путаете градусы и радианы.
Я не путаю. Я говорю, нет смысла переводить угол. Причем в движении.
MaxXx2021 вне форума   Ответить с цитированием
Старый 22.09.2011, 22:22   #12
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию

Цитата:
Сообщение от MaxXx2021 Посмотреть сообщение
это понятно, автор берет значения 180, 90 для чего когда максимальный угол такой! Синус и косинус на мангосе относительно него работают в игре.
Относительно чего? Радиан или градусов?
HuntsMan вне форума   Ответить с цитированием
Старый 24.09.2011, 19:29   #13
HuntsMan
Ученый
 
Аватар для HuntsMan
 
Регистрация: 19.12.2010
Сообщений: 221
Сказал(а) спасибо: 64
Поблагодарили 12 раз(а) в 9 сообщениях
Записей в дневнике: 2
HuntsMan На верном пути
По умолчанию

И снова я со своей математикой

Вобщем хочу отспавнить мобов вокруг босса. Накалякал такой код:
Код:
                float angle = 0;

                for(int i = 0; i < 8; i++)
                {
                    sLog->outString("Summon %u mobs, gradus: %f", i, angle*180/M_PI);
                    me->SummonCreature(46007, me->GetPositionX() + cos(angle)*15, me->GetPositionY() + sin(angle)*15, me->GetPositionZ(), 1.0f, TEMPSUMMON_TIMED_OR_DEAD_DESPAWN, 10000);
                    angle += M_PI / 4;
                }
Вроде все верно, но в итоге получается вот такое: http://filebeam.com/bea0a44dbd20541f...ff186804fb.jpg

То что в лог вывожу:
Код:
2011-09-24 20:24:25 Summon 0 mobs, gradus: 0.000000
2011-09-24 20:24:25 Summon 1 mobs, gradus: 45.000000
2011-09-24 20:24:25 Summon 2 mobs, gradus: 90.000000
2011-09-24 20:24:25 Summon 3 mobs, gradus: 134.999997
2011-09-24 20:24:25 Summon 4 mobs, gradus: 180.000000
2011-09-24 20:24:25 Summon 5 mobs, gradus: 225.000003
2011-09-24 20:24:25 Summon 6 mobs, gradus: 269.999993
2011-09-24 20:24:25 Summon 7 mobs, gradus: 314.999983
По всем расчетам должно спавнить верное кол-во. Где я ошибся?

add: А не, все ок, это я дураг Оказывается у моба вторая модель была модель невидимки, поэтому он и не отображался

Последний раз редактировалось HuntsMan; 24.09.2011 в 20:02.
HuntsMan вне форума   Ответить с цитированием
Ответ


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм проверки TargetAuraState в CheckCast() rsa Баг-репорты 7 16.03.2011 11:04
Обесценить предметы у торговцев и выключить выподение голда в лут, после ликвидации моба. Ginezes Флудильня 5 09.11.2010 14:47
Алгоритм DistributeArenaPoints() xmolex Прочая документация 1 16.10.2010 14:48
Лицом к игроку, как??? Lordronn Скрипты 4 04.08.2010 12:43


Текущее время: 09:43. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot