Kultura
Помогающий
Offline
|
|
« : 16-03-2009 15:20 » |
|
Делаю арканоид Правила: При зажатии стрелок тележка движется влево-вправо. При нажатии контрола изменяет траекторию полета мячика. Вопрос: как сделать, что бы при зажатой стрелке тыкание другой кнопки не перебивало движения? Если это связано с обработкой lparam, приведите, если можно, эту обработку в посте. В принципе, это даже второй вопрос: как проверить значение конкретного бита?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #1 : 16-03-2009 15:41 » |
|
У тебя какая-то вывернутая логика. Смотри сюда:
1. Нажимаем одну кнопку -> окошко с фокусом получает сообщение WM_KEY 2. Нажимаем другую кнопку -> окошко с фокусом получает сообщение WM_KEY и тд
Те у тебя выстраивается очередь сообщений от кнопки, хочешь ты того или нет. И если ты на них реагируешь, то соответсвенно получается очередь вызыванных ф-ций.
Опрашивать состояние управляющих клавиш можно с помощью ф-ции GetKeyState, в качестве параметра передаётся интересующий виртуальный код:
VK_CONTROL, VK_SHIFT и тд
Я бы логику управления не делал на нажатых кнопках, а реагировал только на DOWN и UP, и сам бы решал, что должно происходить между этими событиями.
|
|
« Последнее редактирование: 16-03-2009 15:46 от Джон »
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #2 : 16-03-2009 18:07 » |
|
Вроде я так и делаю: Гляжу в WM_KEYDOWN, чего там нажали. Если стрелки - тележка поехала, если контрол - мячик полетел.
Вот только , если стрелка зажата, идет автоповтор, тележка едет и все нормально. А если стрелка зажата и тыкают контрол, автоповтор прекратился, WM_KEYUP не пришло (стрелка зажата), тележка встала. Надо снова жать стрелку, а это не удобно
|
|
|
Записан
|
|
|
|
Вад
|
|
« Ответ #3 : 16-03-2009 18:49 » |
|
Что-то я не понимаю суть проблемы. А почему автоповтор прекратился? Пока стрелка нажата и тележка не доползла до соответствующего края - пусть себе ползёт. Зарегистрировал WM_KEYDOWN, и пока не отпустят кнопку, тележка ползёт до упора. Прекращать передвижение только по отпусканию той же самой кнопки.
Кстати, стоит, наверное, ещё регистрировать нажание второй стрелки, для случая, если пользователь при игре "залипает" сразу две кнопки, а потом одну отпускает. Жмёт вправо, потом, не отпуская, влево, и только потом отпускает правую. Просто при залипании кнопки переходить в нужное состояние, а при освобождении - опять осуществлять переход, в зависимости от того, что там ещё нажато.
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #4 : 16-03-2009 18:59 » |
|
Вад, поробуй нажать вверх чтоб страница форума начла скролироваться, и как только нажмешь Ctrl то скролинг прекратится - видимо об этом речь.
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #5 : 16-03-2009 19:07 » |
|
Всё правильно. Если просто реагировать на нажатие, то так и получится.
Kultura, я бы так сделал. Бежит в бесконечном цикле в треде ф-я изменения координаты Х ракетки. А нажатие кнопок только управляют флажками - стоп, влево, вправо, а не являются инициаторами действия. В этом же цикле можно опрашивать и управляющие кнопки. И тогда никакой проблемы не будет.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #6 : 17-03-2009 12:02 » |
|
PooH, да об этом. Джон, спасибо, буду пробовать. Да, вот только правильно я понял, что бесконечный цикл запускается в отдельном потоке?
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #7 : 17-03-2009 12:16 » |
|
Да, правильно понял. По идее у тебя должно быть несколько таких тредов. Для шарика (шариков), падающих призов и тд. А основной цикл обработки сообщений только управляет флажками, которые уже в тредах опрашиваются. Ну ессно с синхронизацией.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #8 : 17-03-2009 12:19 » |
|
Зы кстати, такой подход позволит тебе управлять скоростью перемещения ракетки. В оригинальном Арканоиде, если память мне не изменяет, был такой приз - ракетка перемещалась очень быстро.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Kultura
Помогающий
Offline
|
|
« Ответ #9 : 17-03-2009 13:01 » |
|
Ах вот оно как делается! И поприменять потоки очень к месту - как раз в обучающих целях занимаюсь.
|
|
|
Записан
|
|
|
|
|