|
26.05.2009, 08:18
|
#1
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Про клавиши
Подскажите как быть.
При сочетании клавиш в BlitzMax (да и в B3D тоже) происходит неприятная, но очевидная вещь.
Допусти мы нажимаем W+D. Так вот, при опускании этих клавиш BlitzMax ловит последнюю нажатую клавишу и делает гадость.
После движения "наискосок" герой игры встает по стойке в направлении кратном 90 градусам, 45 никак. Как быть?
Все клавиши забил в переменные и использую суммы для проверки на кол-во клавиш и сверяюсь только с переменными при действиях...
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
26.05.2009, 09:13
|
#2
|
|
Ответ: Про клавиши
Randomize
что-то туплю, ты keyhit для движения используешь чтоли ? юзай keydown
|
|
|
26.05.2009, 09:17
|
#3
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Ответ: Про клавиши
На добром слове спасибо конешно, но я нетакой... эм... любитель потыкать)
Приведу сорец чтоли...
'_input buttons
Local mbUP% = KeyDown(KEY_UP) + KeyDown(KEY_W)
Local mbDown% = KeyDown(KEY_DOWN) + KeyDown(KEY_S)
Local mbLeft% = KeyDown(KEY_LEFT) + KeyDown(KEY_A)
Local mbRight% = KeyDown(KEY_RIGHT) + KeyDown(KEY_D)
'_actions
If (mbUP+mbDown+mbLeft+mbRight)=2
If(mbRight And mbDown) dest_angle = 45 ; x:+ speed ; y:+ speed
If(mbDown And mbLeft) dest_angle = 135 ; y:+ speed ; x:-speed
If(mbLeft And mbUP) dest_angle = 180 ; x:- speed ; y:-speed
If(mbUP And mbRight) dest_angle=270;y:- speed;x:+speed
ElseIf (mbUP+mbDown+mbLeft+mbRight)=1
If(mbRight) dest_angle = 0 ; x:+ speed
If(mbDown) dest_angle=90; y:+ speed
If(mbLeft) dest_angle=180x:- speed
If(mbUP) dest_angle=270y:- speed
EndIf
If (mbUP+mbDown+mbLeft+mbRight)<>0 Then wheel1_pos:+ 1 ; wheel2_pos:+ 1
If NearlyEqual%(angle , 360, 1) Then angle=0
angle=CurveAngle(dest_angle,angle,smooth#)
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
Последний раз редактировалось Randomize, 26.05.2009 в 10:13.
|
(Offline)
|
|
26.05.2009, 10:42
|
#4
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Про клавиши
Вот эта строчка потенциальный источник ошибок:
Local mbUP% = KeyDown(KEY_UP) + KeyDown(KEY_W)
В некотором случае возможно получения значения 2
А далее по коду, о чудо, мы и нарываемся на ошибку:
If (mbUP+mbDown+mbLeft+mbRight)=2
здесь автор хотел видимо проверять нажатие сразу 2х кнопок для диагонального движения. Однако выше приведённый код способен генерировать значение 2 в одной переменной, что при нажатии ещё одной кнопки даст сумму больше 2х, т.е. 3 или даже 4! (хотя теоритический максимум 8).
Не уверен что это решит проблему, однако хуже не будет если сделать правильно.
__________________
|
(Offline)
|
|
26.05.2009, 10:49
|
#5
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Ответ: Про клавиши
Сообщение от SBJoker
Вот эта строчка потенциальный источник ошибок:
Local mbUP% = KeyDown(KEY_UP) + KeyDown(KEY_W)
В некотором случае возможно получения значения 2
А далее по коду, о чудо, мы и нарываемся на ошибку:
If (mbUP+mbDown+mbLeft+mbRight)=2
здесь автор хотел видимо проверять нажатие сразу 2х кнопок для диагонального движения. Однако выше приведённый код способен генерировать значение 2 в одной переменной, что при нажатии ещё одной кнопки даст сумму больше 2х, т.е. 3 или даже 4! (хотя теоритический максимум .
Не уверен что это решит проблему, однако хуже не будет если сделать правильно.
|
Так и задумано. Зачем мне три клавиши? Не нужно.
Условие продумано и не ошибочно. Т.к. KeyDown возвращает булевые значения. Тоесть числа.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
|
(Offline)
|
|
26.05.2009, 11:43
|
#6
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Про клавиши
Булевые значения это булевые значения, а числа это числа. Не надо мешать всё в одну кучу. Если блитз3д не делает между ними различий не значит что это правильно.
Складывая 2 булевых значения в блитз3д ты получаешь уже число а не булев.
В первой приведённой мной строке диапазон значений mbUP% равен [0..2], вместо ожидаемых тобой [0..1].
Далее ты по коду складываешь 4е аналогично полученных переменных и ожидаешьчто диапазон значений будет [0...2]. Об этом говорит условие равенства 2м. Однако сложение 4х потенциальных 2ек датёт диапазон значений [0..8], Кстати даже еслибы ты в первой приведённой мной строке решил проблему увеличения диапазона значений до 2х, то в строке:
If (mbUP+mbDown+mbLeft+mbRight)=2 диапазон всёравно бы был [0..4], что опять таки твой алгоритм неучитывает. Можно конешно строго натсрого запретить нажимать пользователю альтернативные клавиши управления.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.05.2009, 12:48
|
#7
|
[object Object]
Регистрация: 01.08.2008
Адрес: В России
Сообщений: 4,355
Написано 2,471 полезных сообщений (для 6,853 пользователей)
|
Ответ: Про клавиши
Фуф...
Так и задумано вобщето.
Управление только стрелками и wasd.
Больше двух клавиш одновременно нажимать не надо. А даже если нажать, то ничего смертельного не произойдёт.
Вернее ничего не произойдёт.
Вопрос то в том как быть. При резком отпускании двух зажатых клавиш какаято из них отпускается последней и в конце мы имеем не ту картину (как я писал в первом посте).
зы. я прекрасно знаю что такое тип Boolean. Но в блице его как такового нету.
Строка y=(x=(1+100)^(46=75)) вполне справедлива.
Также как и 1*Flip() тоже нормально.
Прямой результат метаморфозы Boolean`a в Integer, а True и False в константы.
Хотя это уже другая история...
В прочем ладно. Я понял как всё можно обойти.
__________________
Retry, Abort, Ignore? █
Intel Core i7-9700 4.70 Ghz; 64Gb; Nvidia RTX 3070
AMD Ryzen 7 3800X 4.3Ghz; 64Gb; Nvidia 1070Ti
AMD Ryzen 7 1700X 3.4Ghz; 8Gb; AMD RX 570
AMD Athlon II 2.6Ghz; 8Gb; Nvidia GTX 750 Ti
Последний раз редактировалось Randomize, 26.05.2009 в 13:01.
|
(Offline)
|
|
26.05.2009, 15:15
|
#8
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Про клавиши
Сообщение от Randomize
В прочем ладно. Я понял как всё можно обойти.
|
Ну вопщем то да, предварительно опрашивать клавиши в переменные, а потом только ими и рулить.
__________________
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:30.
|