Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > BlitzMax > 2D-программирование

Ответ
 
Опции темы
Старый 26.05.2009, 08:18   #1
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 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
jimon
 
Сообщений: n/a
Ответ: Про клавиши

Randomize
что-то туплю, ты keyhit для движения используешь чтоли ? юзай keydown
 
Ответить с цитированием
Старый 26.05.2009, 09:17   #3
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 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
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 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
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 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
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Randomize (26.05.2009)
Старый 26.05.2009, 12:48   #7
Randomize
[object Object]
 
Аватар для Randomize
 
Регистрация: 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
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Про клавиши

Сообщение от Randomize Посмотреть сообщение
В прочем ладно. Я понял как всё можно обойти.
Ну вопщем то да, предварительно опрашивать клавиши в переменные, а потом только ими и рулить.
__________________
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Светящиеся объекты и клавиши Crystal 3D-программирование 2 31.07.2007 23:15
работа с клавиатурой. однократное нажатие клавиши aureli0 Основной форум 8 23.04.2007 23:20


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com