Я знаю, что этот вопрос задавался несколько раз, но я все еще не уверен, как реализовать обработку ввода в компонентном движке.
Основанный на компонентах дизайн, который я использовал, был основан на серии блогов T = Machine и на Artemis, в которых сущности - это просто идентификаторы.
У меня есть три основные идеи по реализации обработки ввода:
- Компонент ввода будет содержать интересующие его события. Система ввода преобразует события клавиш и мыши в игровые события и проходит по объектам с компонентом ввода, и, если они заинтересованы в событии, система ввода предпримет соответствующее действие. Это действие будет жестко закодировано в системе ввода.
- Нет входного компонента. Вы должны зарегистрировать объекты с конкретными событиями в системе ввода. Затем система ввода будет отправлять сообщения (с идентификатором объекта и типом события) в другие системы, чтобы они могли предпринять соответствующие действия. Или, как в первом случае, действия будут жестко закодированы в системе ввода.
- Аналогично первому методу, но вместо жесткого кодирования действия для системы ввода компонент будет содержать карту событий для функций (то есть
std::map<std::function>
), которые будут вызываться системой ввода. Это дает дополнительный эффект возможности связывать одно и то же событие с разными действиями.
Вы бы порекомендовали какой-либо из вышеперечисленных методов или у вас есть предложения, которые помогли бы мне внедрить гибкую систему обработки ввода? Кроме того, я еще не знаком с многопоточностью, но любые предложения, которые сделают реализацию ориентированной на многопоточность, также приветствуются.
Примечание. Одно дополнительное требование, которое я хотел бы выполнить для реализации, заключается в том, чтобы я мог передавать один и тот же вход многим объектам, например, перемещая объект камеры и проигрыватель одновременно.