Примітка. Мені доводиться опитувати, а не робити зворотні дзвінки через обмеження API (SFML). Я також вибачаюся за відсутність "гідного" звання.
Я думаю, що у мене тут два питання; як зареєструвати вхід, який я отримую, і що з ним робити.
Обробка вводу
Я говорю про те, як ви зареєстрували, наприклад, що була натиснута клавіша "A", і як це зробити звідти.
Я бачив масив всієї клавіатури, приблизно:
bool keyboard[256]; //And each input loop check the state of every key on the keyboard
Але це здається неефективним. Ви не тільки зв'язуєте клавішу "А", наприклад, "гравець, що рухається ліворуч", але він перевіряє кожну клавішу, 30-60 разів на секунду.
Потім я спробував іншу систему, яка просто шукала ключі, які вона хотіла.
std::map< unsigned char, Key> keyMap; //Key stores the keycode, and whether it's been pressed. Then, I declare a load of const unsigned char called 'Quit' or 'PlayerLeft'.
input->BindKey(Keys::PlayerLeft, KeyCode::A); //so now you can check if PlayerLeft, rather than if A.
Однак проблема в тому, що зараз я не можу набрати ім'я, не маючи прив'язувати кожну клавішу.
Потім у мене є друга проблема, яку я не можу по-справжньому вважати хорошим рішенням:
Надсилання введення
Тепер я знаю, що була натиснута клавіша "A" або що "Гравець ліворуч" - це правда. Але як я можу поїхати звідси?
Я подумав про те, щоб просто перевірити, що
if(input->IsKeyDown(Key::PlayerLeft) { player.MoveLeft(); }
це в значній мірі поєднує вклад в сутність, і я вважаю це досить безладним. Я вважаю за краще плеєр керувати власним рухом, коли він оновлюється. Я думав, якась система подій може працювати, але я не знаю, як з цим піти. (Я чув, що сигнали та прорізи були хорошими для такої роботи, але це, мабуть, дуже повільно, і я не можу побачити, як це підійде).
Спасибі.