Недавно наткнулся на эту замечательную ОСь , и вот решил слегка подучить ассемблер. Как не странно с первого раза удалось откампилит и запустить её на VirtualBox , Написал пару простейших программок и столкнулся вот с какими вопросами :
1) Есть ли возможность отловить событие скролла (и реализована ли акселерация)?
2) Возможно ли получить в конкретный момент времени состояния клавиш на клавиатуре ( по документации можно взять их из очереди , но мне необходимо именно несколько зажатых и плюс к тому повторение клавиши начинается после некоторой паузы)
3) и если не сложно обьясните в 3-х словах что такое стэк потока и есть ли какой нить механизм синхронизации
Зарание Спасибо !!!
Помогите разобраться с мышкой и клавиатурой.
1.1 Есть библиотека Box_lib, если речь идет о отрисовке графического компонента.
1.2 Есть функция 37.6, если речь идет о получении данных прокрутки.
2. Если речь идет о применении CTRL, SHIFT, ALT, то можно просто сохранять значения полученные функцией 2 как флаги нажатости. Кроме того есть функция 66, для работы с горячими комбинациями клавиш.
3. Функция 51. Стек потока - область выделенная для хранения данных, подобно обычному стеку. Потоки могут работать в одном адресном пространстве, но данные должны хранить отдельно. Синхронизацию придется делать вручную, создавая и поверяя флаги и мьютексы при использовании общих хранилищ данных.
1.2 Есть функция 37.6, если речь идет о получении данных прокрутки.
2. Если речь идет о применении CTRL, SHIFT, ALT, то можно просто сохранять значения полученные функцией 2 как флаги нажатости. Кроме того есть функция 66, для работы с горячими комбинациями клавиш.
3. Функция 51. Стек потока - область выделенная для хранения данных, подобно обычному стеку. Потоки могут работать в одном адресном пространстве, но данные должны хранить отдельно. Синхронизацию придется делать вручную, создавая и поверяя флаги и мьютексы при использовании общих хранилищ данных.
Спасибо за ответ... со скролом я уже разобрался , но вот с клавиатурой мне нужно нечто другое ,нежели горячая комбинация . Вот например я собираюсь написать некое подобие танчиков и там необходимо отлавливать одновременное нажатие стрелочки вправо и вверх - например , так вот есть ли какие нибуть средства для получения "карты" клавиатуры в любой момент времени . Также я заметил что в стандартной игрушке "тенес" , первый раз зажатая клавиша дублируется только через небольшой промежуток времени . Может есть какой нибуть другой способ прочтения клавиши ... например сразу из порта (в DOS я помню 21 порт отзывался на клавиатуру .... будет ли тут это работать)
в КОС можно получать сканкоды клавиш, то есть различать нажатие и отпускание клавиши. в своих программах (например, e80) я делал так: если клавиша нажата, присваиваем определённой переменной значение, соответствующее нажатой клавиши. в процессе игры работаем с этой переменной. если сканкод означает отпускание этой же клавиши, меняем значение переменной. надеюсь, не слишком запутано...
"Карта" клавиатуры во всех известных мне системах реализуется в виде массива, которыйEgor wrote:так вот есть ли какие нибуть средства для получения "карты" клавиатуры в любой момент времени .
хранит нули и единицы в соответствии с состояниям клавиш. Получил сканкод нажатой клавиши - пиши в сответствующую позицию 1, и наоборот, получил сканкод отпущенной клавиши - пиши в сответствующую позицию 0.
Код на языке C из fceu для Колибри.
Code: Select all
char *KeyboardGetstate(void) // +
{
int j=0;
j=__menuet__getkey();
if (j==0) return keybuf;
if (j==224) j=__menuet__getkey();
switch(j)
{
//Arrow key pressed
case 72: keybuf[200]=1; break; // Up
case 80: keybuf[208]=1; break; // Down
case 75: keybuf[203]=1; break; // Left
case 77: keybuf[205]=1; break; // Right
//Arrow key unpressed
case 200: keybuf[200]=0; break; // Up
case 208: keybuf[208]=0; break; // Down
case 203: keybuf[203]=0; break; // Left
case 205: keybuf[205]=0; break; // Right
//F2 pressed
case 60: SetWinSize(); break;
//F3 pressed
case 61: LoadNESFile(); break;
default:
if (j>0x7F) keybuf[j&0x7F] = 0;
else keybuf[j]=1;
break;
}
return keybuf;
}
Code: Select all
;...
; The code area
include 'macros.inc'
START: ; Точка входа в программу
call draw_window
mcall 66, 1 ; установить режим ввода сканкодов с клавиатуры.
still:
mov eax, 10
mcall
cmp eax, 1
je red
cmp eax, 2
je key
cmp eax, 3
je button
jmp still
;...
key: ; Обратка события от клавиатуры (нажатия или отпускания клавиши).
mcall ; Сканкод клавиши возвращается в ah.
call update_keymap
jmp still
;....
;Вход: ah = скан код клавиши
update_keymap:
push edi ; Лучше сохранять регистры на входе в процедуру...
xor al, al
test ah, 0x80 ; Проверяем старший бит в регистре ah,
jnz @f ; если установлен - то клавиша отпущена,
inc al ; если сброшен - то клавиша нажата
@@:
movzx edi, ah
mov [keymap+edi], al ; Обновляем "карту" клавиатуры
pop edi ; ... и восстанавливать на выходе. Это убережёт от некоторых ошибок.
ret
;...
keymap rb 256 dup (0)
Who is online
Users browsing this forum: No registered users and 6 guests