Управление. Нажатые кнопки -> угол поворота
Здравствуйте, друзья обращаюсь к вам со следующим вопросом.
Почти всех играх где используется клавиатура уже стало стандартом управление WSAD или стрелки. И игрок может одновременно нажимать 1 или 2 кнопки чтоб задать направление движения. Во многих играх есть косяк при движении по диагонали так как складываются 2 вектора направления. Обойти это можно задавая кнопками угол движения примерно так: * используются только WSAD Представим что у нас есть следующие переменные: Код:
kbW - верх Код:
kbD = 0 У меня соображалки не хватет может кто из вас сооружал нечто подобное? З.Ы. Никакой проблемы нет! Лишь спортивный интерес. Я верю что это можно упаковать если не в одну то уж в пару строчек точно. |
Ответ: Управление. Нажатые кнопки -> угол поворота
Ну как бы промежуточные положения это среднее от крайних.
Но мне кажется ничего более производительного чем прямое задание нет. Ну или все переменные представить как массив, и задавать в цикле значениями вида i * 45 |
Ответ: Управление. Нажатые кнопки -> угол поворота
Цитата:
Цитата:
w = 1 s = 2 a = 4 d = 8 и соотвественно такая табличка -1, 270, 90, -1, 180, 225, 135, -1, 0, 315, 45, -1, -1, -1, -1, -1, -1 -1 тогда будет означать что нажаты противоположные клавиши или юзер уснул на клаве :-D |
Ответ: Управление. Нажатые кнопки -> угол поворота
Ну зачем тут углы и прочая тригонометрия?
По сути тут только 1 число используется - синус 45° (~0.74...) На него домножать и всё. У меня он даже в константу вбит. Типа if(две кнопки жаты) { if(вверх+вправо){двинуть на 0.74 вперёд и 0.74 вправо} if(вверх+влево){двинуть на 0.74 вперёд и 0.74 влево} ... } if(одна кнопка жата) { как обычно обрабатываем } |
Ответ: Управление. Нажатые кнопки -> угол поворота
Цитата:
в таком случае должно быть sqrt(0.5), т.е. ~0.7071 почему я и говорю что проще и универсальнее (2д\3д) нормализовать вектор после суммирования. |
Ответ: Управление. Нажатые кнопки -> угол поворота
Цитата:
var sin45 = 0.7071067811; var length = sin45*sin45+sin45*sin45; (извиняюсь, что пишу пример на жабаскрипте) В length получим 0.9999999997552067. Приемлемо, я думаю. С нормализацией будет такая же точность, но там 1. Вычисление длины вектора 2. Два деления А тут только умножение на 0.7071067811. |
Ответ: Управление. Нажатые кнопки -> угол поворота
Цитата:
|
Ответ: Управление. Нажатые кнопки -> угол поворота
Во-первых так логичней и проще сделать, во-вторых в реалтайме везде боттлнек — пора бы привыкнуть.
Хотя нынче стало модно говнокодить, но это уж на совести разраба. |
Ответ: Управление. Нажатые кнопки -> угол поворота
Цитата:
Проще? Сравни твою лапшу из условий и этот вариант (с++ псевдокод): Код:
вектор направление Цитата:
|
Ответ: Управление. Нажатые кнопки -> угол поворота
Okay.
|
Ответ: Управление. Нажатые кнопки -> угол поворота
Я делал так (псевдокод):
vec2 moveDirection = new vec2(keyD - keyA, keyW - keyS).Normalized; Быстро и просто. Получаем вектор движения. Таким образом просто делать смешивание (изменение вектора направления), но тут уже зависит что нужно. Но имея векторы направления, заместо углов - имхо лучше, т.к. проще писать AI да и математически быстрее. Т.к. в компьютерном представлении угол - это более сложная сущность, нежели вектор. |
Ответ: Управление. Нажатые кнопки -> угол поворота
PHP код:
|
Часовой пояс GMT +4, время: 23:01. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot