Страница: 1 | 2 |
Вопрос: Перемещение персонажа.
Добавлено: 05.05.09 18:22
Автор вопроса: AWP | Web-сайт:
Собрался тут игрушку писать, в жанре RST.
Вопрос такой, как организовать перемещение Юнитов.
Задаю конечную точку - строятся промежуточные.
Как лучше поступить, прибавлять каждый раз небольшой вектор пока ни достигнет следующий точки или засечь время и рассчитывать координаты исходя из скорости и времени?
Ответы
Всего ответов: 27
Номер ответа: 1
Автор ответа:
$@ny@PG
ICQ: 468469477
Вопросов: 71
Ответов: 196
Профиль | | #1
Добавлено: 05.05.09 18:59
Интересный вопрос...
Номер ответа: 2
Автор ответа:
Unknown_Master
Вопросов: 11
Ответов: 264
Профиль | | #2
Добавлено: 05.05.09 19:09
Хм... Сложный вопрос.
Но, на мой взгляд, прибавлять вектор будет удобнее
Номер ответа: 3
Автор ответа:
$@ny@PG
ICQ: 468469477
Вопросов: 71
Ответов: 196
Профиль | | #3
Добавлено: 05.05.09 19:19
А на чем хоть игрушку пишешь?
Номер ответа: 4
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #4
Добавлено: 05.05.09 21:49
для этого вообще строится граф и например волновым алгоритмом находится минимальный путь, а дальше юнит отправляется в путешествие по дугам и точкам графа. по крайней мере так делают нормальные программисты...
Номер ответа: 5
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #5
Добавлено: 05.05.09 22:40
"Задаю конечную точку - строятся промежуточные." - какие алгоритмы для построения пути я знаю.
Все промежуточные точки ставятся с каким-то интервалом, в зависимости от формата ячеек карты.
Вот и нужно выбрать самый удобный способ путешествия между этими точками.
Номер ответа: 6
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #6
Добавлено: 05.05.09 23:31
или граф, или велосипед. выбор простой.
Номер ответа: 7
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #7
Добавлено: 06.05.09 00:12
Это два разных подхода: такт постоянной длины (прибавлять вектор) и такт переменной длины (считать перемещение в зависимости от времени). Проще программировать первый, производительнее второй.
Номер ответа: 8
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #8
Добавлено: 06.05.09 00:23
опа, чото я ппц сонный =\ правильнее умножать время между кадрами и умножать на скорость. ибо на разном железе между кадрами будет варьироваться, и получится эффект что на одном компе игра идет слишком быстро. но при умножении на изменение времени у меня наблюдались рывки. помогало только включение вертикальной синхронизации. это все относится к direct x. или игру делаешь через gdi?
зы: теперь вроде прально понял суть вопроса?
Номер ответа: 9
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #9
Добавлено: 06.05.09 00:45
не суть через что. Sharp прав, лучше через время сделать. А про "время между кадрами", ну это и так понятно QueryPerformanceCounter без проблем справится.
"но при умножении на изменение времени у меня наблюдались рывки."
Чем время считал, сколько кадров/секунду было?
Номер ответа: 10
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #10
Добавлено: 06.05.09 00:54
GetTickCount'ом. Число кадров в секунду немного варьировалось. фпс не помню ибо дело было года 2 назад.
Номер ответа: 11
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #11
Добавлено: 06.05.09 01:40
я даж нашел сорцы и они даж скомпилились. сделано по приращению времени движение, не дергается, даже без синхронизации. но трабла в другом. попиксельный колижн детекшн тормозит картинку. попробуйте пролететь одним самолетом чуть выше другого, чтобы наложились прямоугольники.
http://ifolder.ru/11972763
ptPosition.x += cos(Angle) * Speed * Global->dv * Global->FreqResolution;
ptPosition.y += -sin(Angle) * Speed * Global->dv * Global->FreqResolution;
QueryPerformanceCounter(&pGlobal->LastTick);
pGlobal->dv = pGlobal->ThisTick.QuadPart - pGlobal->LastTick.QuadPart;
А это вся формула изменения положения самолета. dv по сути есть dt, но это не суть.
Номер ответа: 12
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #12
Добавлено: 06.05.09 01:46
зы: работает это так. запускаете игру, видите бублики, ждете появления фпс. это нужно для настройки как раз FreqResolution. Не помню нах оно вообще, и почему формула такая FreqResolution = 1.0 /frequency.QuadPart; но не суть. главное дождаца появления фпс, потом жать пробел. Если не дождаца самолетики не появятся. Самолетики не в равных условиях. У левого 3 патрона можно одновременно в воздухе иметь, у правого 1. Управление левым - стрелки, стрелять 0 на нампаде. Управление правым - WASD, стрелять пробел.
Номер ответа: 13
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #13
Добавлено: 06.05.09 02:43
GetTickCount - тормозная штука, прям как таймер
Юзай.
Номер ответа: 14
Автор ответа:
Ra$cal
ICQ: 8068014
Вопросов: 18
Ответов: 817
Web-сайт:
Профиль | | #14
Добавлено: 06.05.09 14:41
в пост 11 посмотри для вычисления шага времени я и использую перфоманс коунтер. геттик в другом месте используется для служебных так сказать задач
Номер ответа: 15
Автор ответа:
AWP
ICQ: 345685652
Вопросов: 96
Ответов: 1212
Web-сайт:
Профиль | | #15
Добавлено: 06.05.09 23:42
У меня ip не выделенный, всех файловые серваки не работают.
"главное дождаца появления фпс, потом жать пробел. Если не дождаца самолетики не появятся."
Могу поспорить, FPS вычисляется раз в секунду, первую секунду он = 0, а на 0 делить нельзя, скорее всего стоит On error и пропускает старт игры. Хотя могу и ошибаться)
З.Ы.
Что могу сказать про Коллизии, оптимизируй алгоритм.