Люди, кто-нибудь подскажите пожалуйста, как сделать обработку клавиш так, чтобы если нажата клавиша и выполняется какое-либо действие, то при нажатии другой это действие не прерывалось, а выполнялось и первое и второе.
Например в играх : Жмёшь вверх, объект едет, жмёшь другую клавишу - объект продолжает ехать но при этом стреляет.
А то я уже задолбался : при нажатии второй клавиши предыдущее действие прерывается.
Заранее благодарен и спасибо. Если можно, то с примером.[/b]
Нажатие клавиш
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Посмотри TThread.
Объясните по подробнее, чё за TThread. Я ещё учусь, так что не всё понимаю.
А кому щас легко
Гм. Трэды это конечно хорошо, но в банальном цикле никто не запрещает продолжать обрабатывать предыдущее событие, пока оно явно не было отменено другим.
Даже самый дурацкий замысел можно воплотить мастерски
Советую почитать классику "Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows"
Джеффри Рихтера. Тогда многие вопросы отпадут сами собой.
с учетом специфики 64-разрядной версии Windows"
Джеффри Рихтера. Тогда многие вопросы отпадут сами собой.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Kol, вы подняли концептуальный вопрос.
Тут дело не в клавишах и не в действиях а в понимании фундаментальных принципов.
Для решения вашей задачи существует несколько подходов, но в любом сучае вам необходимо построить систему, управляемую событиями. Т.е. в принципе изменить Вашу програму.
Вы можете использовать, например, идеологию конечных автоматов.
Пусть объект, поведение которого вы хотите запрограммировать - это конечный автомат - т.е., другими словами, такая штука, которая может находить в одном из N состояний
Применительно к движущемуся объекту это:
Состояние 1 - стоит на места
Состояние 2 - движется вверх
Состояние 3 - движется вниз
Состояние 4 - стреляет
Состояние 5 - готовится к выстрелу
....
Затем определите события, которые переводят автомат из одного сотояния в другое.
Нарисуйте UML-диаграмму сотояний.
Например клавиша "вверх" переводит в состояние 2
клавиша "пробел" - в 5
Само сотояние 5 породить событие "выстрел"
А событие "выстрел" должно переводить автомат в сотояние 4
Ну и наконец надо придумать 2 вещи
1) как автомату будет выделяться квант времени (это в частности может быть тоже событие "такт времени", которое оставляет автомат в том же состоянии)
2) как будут передаваться события объекту.
Использовать для этого параллельные потоки вычисления (threads) или нет - это уже дело техники. Легко можно обойтись без распараллеливания. И я бы сказал, что это даже предпочтительнее.
Ну а что касается самого объекта (автомата) в нем должна быть запрограммирована логика обработки событий в зависимости от текущего состояния:
"квант времени":
- состояние 1: ничего не делать - остаться в сотоянии 1
- состояние 2: увеличить координату Y и обновить изображение на экране - остаться в 2
- состояние 3: уменьшить Y, перерисовать - остаться в 3
......
"клавиша вверх"
- перейти в состояние 2
и т.д.
Сами события можно класть в очередь (самому изобрести велосипед), можно воспользоваться фишками Windows и породить объект от WinCtrl, и, значит обработку событий осуществлять в методе WindowProc, а отправку через SendMessage и/или Dispatch.
Тут дело не в клавишах и не в действиях а в понимании фундаментальных принципов.
Для решения вашей задачи существует несколько подходов, но в любом сучае вам необходимо построить систему, управляемую событиями. Т.е. в принципе изменить Вашу програму.
Вы можете использовать, например, идеологию конечных автоматов.
Пусть объект, поведение которого вы хотите запрограммировать - это конечный автомат - т.е., другими словами, такая штука, которая может находить в одном из N состояний
Применительно к движущемуся объекту это:
Состояние 1 - стоит на места
Состояние 2 - движется вверх
Состояние 3 - движется вниз
Состояние 4 - стреляет
Состояние 5 - готовится к выстрелу
....
Затем определите события, которые переводят автомат из одного сотояния в другое.
Нарисуйте UML-диаграмму сотояний.
Например клавиша "вверх" переводит в состояние 2
клавиша "пробел" - в 5
Само сотояние 5 породить событие "выстрел"
А событие "выстрел" должно переводить автомат в сотояние 4
Ну и наконец надо придумать 2 вещи
1) как автомату будет выделяться квант времени (это в частности может быть тоже событие "такт времени", которое оставляет автомат в том же состоянии)
2) как будут передаваться события объекту.
Использовать для этого параллельные потоки вычисления (threads) или нет - это уже дело техники. Легко можно обойтись без распараллеливания. И я бы сказал, что это даже предпочтительнее.
Ну а что касается самого объекта (автомата) в нем должна быть запрограммирована логика обработки событий в зависимости от текущего состояния:
"квант времени":
- состояние 1: ничего не делать - остаться в сотоянии 1
- состояние 2: увеличить координату Y и обновить изображение на экране - остаться в 2
- состояние 3: уменьшить Y, перерисовать - остаться в 3
......
"клавиша вверх"
- перейти в состояние 2
и т.д.
Сами события можно класть в очередь (самому изобрести велосипед), можно воспользоваться фишками Windows и породить объект от WinCtrl, и, значит обработку событий осуществлять в методе WindowProc, а отправку через SendMessage и/или Dispatch.
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
И вместо очереди сообщений можно использовать что-то другое, и конечные автоматы - это только один из многих подходов к проектированию программного обеспечения....
Так что учитесь программировать
Больше читайте книг по проектированию ПО, а потом беритесь за работу со знанием дела.
Удачи.
Так что учитесь программировать

Больше читайте книг по проектированию ПО, а потом беритесь за работу со знанием дела.
Удачи.