Помогите разобраться с мышкой и клавиатурой.

Applications development, KoOS API questions
  • 1.1 Есть библиотека Box_lib, если речь идет о отрисовке графического компонента.
    1.2 Есть функция 37.6, если речь идет о получении данных прокрутки.

    2. Если речь идет о применении CTRL, SHIFT, ALT, то можно просто сохранять значения полученные функцией 2 как флаги нажатости. Кроме того есть функция 66, для работы с горячими комбинациями клавиш.

    3. Функция 51. Стек потока - область выделенная для хранения данных, подобно обычному стеку. Потоки могут работать в одном адресном пространстве, но данные должны хранить отдельно. Синхронизацию придется делать вручную, создавая и поверяя флаги и мьютексы при использовании общих хранилищ данных.
  • Спасибо за ответ... со скролом я уже разобрался , но вот с клавиатурой мне нужно нечто другое ,нежели горячая комбинация . Вот например я собираюсь написать некое подобие танчиков и там необходимо отлавливать одновременное нажатие стрелочки вправо и вверх - например , так вот есть ли какие нибуть средства для получения "карты" клавиатуры в любой момент времени . Также я заметил что в стандартной игрушке "тенес" , первый раз зажатая клавиша дублируется только через небольшой промежуток времени . Может есть какой нибуть другой способ прочтения клавиши ... например сразу из порта (в DOS я помню 21 порт отзывался на клавиатуру .... будет ли тут это работать)
  • в КОС можно получать сканкоды клавиш, то есть различать нажатие и отпускание клавиши. в своих программах (например, e80) я делал так: если клавиша нажата, присваиваем определённой переменной значение, соответствующее нажатой клавиши. в процессе игры работаем с этой переменной. если сканкод означает отпускание этой же клавиши, меняем значение переменной. надеюсь, не слишком запутано...
  • Egor
    Воспользуйся функцией 66, а затем все той-же функцией 02.
    Данные в любом случае поступают последовательно с клавиатуры. Чтобы узнать сканкод требуемой клавиши, можно воспользоваться приложением scancode.
  • 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