Страница 1 из 1

Нажатие клавиш

Добавлено: 04 авг 2005, 20:55
Kol
Люди, кто-нибудь подскажите пожалуйста, как сделать обработку клавиш так, чтобы если нажата клавиша и выполняется какое-либо действие, то при нажатии другой это действие не прерывалось, а выполнялось и первое и второе.
Например в играх : Жмёшь вверх, объект едет, жмёшь другую клавишу - объект продолжает ехать но при этом стреляет.
А то я уже задолбался : при нажатии второй клавиши предыдущее действие прерывается.
Заранее благодарен и спасибо. Если можно, то с примером.[/b]

Добавлено: 04 авг 2005, 22:39
Zroman
Посмотри TThread.

Добавлено: 05 авг 2005, 17:48
Kol
Объясните по подробнее, чё за TThread. Я ещё учусь, так что не всё понимаю.

Добавлено: 10 авг 2005, 03:08
AiK
Гм. Трэды это конечно хорошо, но в банальном цикле никто не запрещает продолжать обрабатывать предыдущее событие, пока оно явно не было отменено другим.

Добавлено: 10 авг 2005, 11:20
Booster
Советую почитать классику "Создание эффективных WIN32-приложений
с учетом специфики 64-разрядной версии Windows"
Джеффри Рихтера. Тогда многие вопросы отпадут сами собой.

Добавлено: 20 сен 2005, 17:13
Naeel Maqsudov
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.

Добавлено: 20 сен 2005, 17:17
Naeel Maqsudov
И вместо очереди сообщений можно использовать что-то другое, и конечные автоматы - это только один из многих подходов к проектированию программного обеспечения....

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

Удачи.