Рассмотрим основные приемы работы с некоторыми устройствами.

4.1. Клавиатура Для начала мы рассмотрим работу с клавиатурой. Хотя она и не является графическим устройством, правильная работа с ней необходима при написании большинства игровых программ.

При нажатии или отпускании клавиши генерируется прерывание 9 и при этом в младших 7 битах значения, прочитанного из порта 60h, содержится номер нажатой клавиши (ее scan-код), а в старшем бите - 0, если клавиша была нажата, и 1, если клавиша была отпущена.

Стандартный обработчик прерывания 9 читает номер нажатой клавиши, переводит его в ASCII-код и помещает номер и ASCII-код в стандартный буфер клавиатуры.

В ряде игровых программ требуется знать, какие клавиши нажаты в данный момент, при этом стандартный обработчик прерывания 9 не годится, так как он не в состоянии определить все возможные комбинации нажатых клавиш (например, Ctrl и "стрелка вниз").

Ниже приводится пример класса Keyboard, который позволяет для любой клавиши определить, нажата ли она или отпущена. Для этого заводится массив из 128 байт, где каждый байт соответствует определенной клавише.

У // File Keyboard.h

#ifndef _KEYBOARD_
#define _KEYBOARD_
class Keyboard {
static void interrupt (*oldKbdHandler)(…); static int keys [128];
static int scanCode [256];
static int charCode [128];
static void interrupt newKbdHandler (…);
public-Keyboard (); -Keyboard ();

ШКХ-ШОП AO

4. Pa6oTa c ocHOBHbiMM rpac^nsecKHMM ycipoMCT
int isPressed (int key )
{
return keys [getScanCode ( key )];
}
int getChar (int scanCode )
{
return charCode [scanCode & 0x7F];
}
int getScanCode (int key );
};
#endif
2) // File keyboard.cpp #include <dos.h> #include "keyboard.h"
void interrupt (*Keyboard::oldKbdHandler)(…); int Keyboard::keys [128];
int Keyboard :: scanCode [256] = {
0, 0, 0, 0, 0, 0, 0, 15, 14,0, 0, 0, 0,28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 40, 0, 0,55,78,51, 12,52,53, 11,2, 3, 4, 5, 6, 7, 8, 9, 10,0, 39,0, 13, 0, 0, 0, 30,48,46,32, 18,33,34, 35, 23, 36, 37, 38, 50, 49, 24, 25,16,19, 31,20,22,47,17, 45,21,44,26,43,27,0, 0, 41,30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24, 25,16,19, 31,20,22,47,17, 45,21,44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0,59,60,61,62,63, 64,65,66,67,68,87,88,71, 72, 73, 74, 75, 0, 77, 78, 79, 80,81,82,83

⇐ Предыдущая| |Следующая ⇒