forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=109)
-   -   Про клавиши (http://forum.boolean.name/showthread.php?t=8380)

Randomize 26.05.2009 08:18

Про клавиши
 
Подскажите как быть.
При сочетании клавиш в BlitzMax (да и в B3D тоже) происходит неприятная, но очевидная вещь.
Допусти мы нажимаем W+D. Так вот, при опускании этих клавиш BlitzMax ловит последнюю нажатую клавишу и делает гадость.
После движения "наискосок" герой игры встает по стойке в направлении кратном 90 градусам, 45 никак. Как быть?
Все клавиши забил в переменные и использую суммы для проверки на кол-во клавиш и сверяюсь только с переменными при действиях...

jimon 26.05.2009 09:13

Ответ: Про клавиши
 
Randomize
что-то туплю, ты keyhit для движения используешь чтоли ? юзай keydown

Randomize 26.05.2009 09:17

Ответ: Про клавиши
 
На добром слове спасибо конешно, но я нетакой... эм... любитель потыкать)
Приведу сорец чтоли...
Код:

'_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#)


SBJoker 26.05.2009 10:42

Ответ: Про клавиши
 
Вот эта строчка потенциальный источник ошибок:
Local mbUP% = KeyDown(KEY_UP) + KeyDown(KEY_W)
В некотором случае возможно получения значения 2
А далее по коду, о чудо, мы и нарываемся на ошибку:
If (mbUP+mbDown+mbLeft+mbRight)=2

здесь автор хотел видимо проверять нажатие сразу 2х кнопок для диагонального движения. Однако выше приведённый код способен генерировать значение 2 в одной переменной, что при нажатии ещё одной кнопки даст сумму больше 2х, т.е. 3 или даже 4! (хотя теоритический максимум 8).

Не уверен что это решит проблему, однако хуже не будет если сделать правильно.

Randomize 26.05.2009 10:49

Ответ: Про клавиши
 
Цитата:

Сообщение от SBJoker (Сообщение 105908)
Вот эта строчка потенциальный источник ошибок:
Local mbUP% = KeyDown(KEY_UP) + KeyDown(KEY_W)
В некотором случае возможно получения значения 2
А далее по коду, о чудо, мы и нарываемся на ошибку:
If (mbUP+mbDown+mbLeft+mbRight)=2

здесь автор хотел видимо проверять нажатие сразу 2х кнопок для диагонального движения. Однако выше приведённый код способен генерировать значение 2 в одной переменной, что при нажатии ещё одной кнопки даст сумму больше 2х, т.е. 3 или даже 4! (хотя теоритический максимум 8).

Не уверен что это решит проблему, однако хуже не будет если сделать правильно.

Так и задумано. Зачем мне три клавиши? Не нужно.
Условие продумано и не ошибочно. Т.к. KeyDown возвращает булевые значения. Тоесть числа.

SBJoker 26.05.2009 11:43

Ответ: Про клавиши
 
Булевые значения это булевые значения, а числа это числа. Не надо мешать всё в одну кучу. Если блитз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], что опять таки твой алгоритм неучитывает. Можно конешно строго натсрого запретить нажимать пользователю альтернативные клавиши управления.

Randomize 26.05.2009 12:48

Ответ: Про клавиши
 
Фуф...
Так и задумано вобщето.
Управление только стрелками и wasd.
Больше двух клавиш одновременно нажимать не надо. А даже если нажать, то ничего смертельного не произойдёт.
Вернее ничего не произойдёт.
Вопрос то в том как быть. При резком отпускании двух зажатых клавиш какаято из них отпускается последней и в конце мы имеем не ту картину (как я писал в первом посте).

зы. я прекрасно знаю что такое тип Boolean. Но в блице его как такового нету.
Строка y=(x=(1+100)^(46=75)) вполне справедлива.
Также как и 1*Flip() тоже нормально.
Прямой результат метаморфозы Boolean`a в Integer, а True и False в константы.
Хотя это уже другая история...

В прочем ладно. Я понял как всё можно обойти.

SBJoker 26.05.2009 15:15

Ответ: Про клавиши
 
Цитата:

Сообщение от Randomize (Сообщение 105918)
В прочем ладно. Я понял как всё можно обойти.

Ну вопщем то да, предварительно опрашивать клавиши в переменные, а потом только ими и рулить.


Часовой пояс GMT +4, время: 05:53.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot