Моя проблема в том, что в KeyDown происходит почти секунда задержки, пока не начнется обработка всей очереди событий, см. видео демо здесь. Во-вторых, параллельные ключи НЕ обрабатываются, я могу перейти либо к W, S, либо к какому-либо другому, но не оба одновременно.
Я уже пытался запустить Render () Async и с помощью ProcessUntiLQuit
, изменив способ чтения ввода и т. д …
Я сейчас пользуюсь ProcessAllIfPresent
в классическом Run(while not closed)
петля
В моем приложении-экземпляре IFrameworkView вот мой обработчик KeyDown:
void OnKeyDown(CoreWindow^ wnd, KeyEventArgs^ args) {
for(int i = 0; i < g_MainApplication->InputMap().size(); ++i) {
if(g_MainApplication->InputMap()[i] == args->VirtualKey) {
g_MainApplication->FlagInput((Application::INPUT_MAP)i);
}
}
}
Всего имеется только K сопоставленных ключей, поэтому он работает в постоянном времени. Это устанавливает все флаги и передает их приложению, которое просто вызывает метод «UpdatePosition», изменяя значения напрямую:
void MyApp::ProcessKeyboard(INPUT_MAP key, double delta) {
delta *= g_SpeedModifier;
switch(key) {
case FORWARD:
g_SelectedEntity->Translate(DIRECTION::WORLD_FORWARD, static_cast<float>(delta));
break;
... // more of the same code here.
}
Приложение рендеринга со скоростью 60 FPS.
Спасибо за вашу помощь.
Я только что попробовал
CoreWindow::GetForCurrentThread()->GetAsyncKeyState(VirtualKey)
… в непрерывном цикле. Работает отлично.
Других решений пока нет …