КАК узнать, какой скан-код у данной клавиши?
КАК можно управлять клавиатурой без знания скан-кодов?
КАК сделать окно в текстовом режиме?
КАК можно управлять перемещением объекта клавишами со стрелками?
В программах под DOS, то есть консольных приложениях, управление с клавиатуры
- основное управление. Мышь отслеживать желание возникает далеко не у всех.
Чтобы удобно было работать с клавиатурой, каждой клавише был дан свой скан-код.
Таким образом компьютер узнаёт, что вы нажали ту или иную букву или цифру. Скан
код клавиши нажатой одновременно с Shift, Ctrl или Alt отличается. Таким образом,
вы сможете предусмотреть сочетания: Ctrl+C, Alt+X, Shift+F1 и другие.
Обрабатывая коды клавиш, вы можете отслеживать нажатие именно нужной вам кнопки.
Например, программируя игру, вы отслеживаете стрелки вверх-вниз. Коды у них
72 и 80. У Enter код=13, ESC код=27... Для разгона предлагаю написать программку-индикатор,
которая выводит код любой нажатой клавиши. Теперь, чтобы узнать код кнопки F1
или TAB, вам не надо лезть в таблицу. Достаточно запустить эту программу:
#include<stdio.h>
#include<conio.h>
void main()
{
int key;
do { key=getch(); //считываем код нажатой клавиши
clrscr();
printf("Scan code %с= %d\n", key, key); //выводим
его на экран }while(key!=27); //работаем,
пока не нажат ESC
}
В пояснениях она не нуждается, думается...
Но можно и проще выйти из ситуации.
Если вы хотите обрабатывать буквенные символы - раньше во многих играх управление
было не стрелками, а буквами: S, E, D, X - например, то можно поступить проще,
используя символьные коды клавиш:
do {
key=getch();
switch(key) {
case 's': {... break;}
case 'e':{... break;}
case 'd':{... break;}
case 'x': {...break;}
}
} while(key!=27);
При небольших изменениях управляющей структуры, мы получили максимум эффекта.
#include<stdio.h>
#include<conio.h>
//Функция выводит символ с координатами
x,y, цветом color и цветом фона bcolor
//Код символа с
void print(int x, int y, int color, int bcolor, char c)
{
gotoxy(x,y);
textcolor(color);
textbackground(bcolor);
cprintf("%c", c);
}
void main()
{
int key, x=23, y=10; //Задаём начальные координаты
clrscr();
textcolor(15);
textbackground(4);
window(1,1,80,1); //рисуем красное окно - заголовок
clrscr();
gotoxy(25,1);
cprintf("Игpа 'Кpот'. ©2004 Semenido LTD"); //строка
заголовка
textbackground(1); //рисуем синее
окно - игровое поле
window(1,2,80,25);
clrscr();
print(x, y,14,4,'X'); //рисуем символ - фигурку. Можно взять любую букву
do {
key=getch(); //считываем код символа
switch(key) { //запоминаем его
//down
case 80:{
print(x, y, 0,0, 'X'); //стираем старое значение символа
y++; //координата по у увеличивается
print(x, y, 14, 4, 'X'); //рисуем на новом месте
break;
}
//up
case 72:{
print(x, y, 0,0, 'X');
y--;
print(x, y, 14, 4, 'X');
break;
}
//left
case 75:{
print(x, y, 0,0, 'X');
x--;
print(x, y, 14, 4, 'X');
break;
}
//right
case 77:{
print(x, y, 0,0, 'X');
x++;
print(x, y, 14, 4, 'X');
break;
}
}
} while(key!=27); //работаем пока не нажат ESC
textcolor(7); //цвет фона чёрный,
чтобы наша программа не повлияла на другие
textbackground(0);
clrscr();
}
Тот же принцип используется и в клавиатурных тренажёрах, и симуляторах, и в
чём угодно. В Windows всё обстоит примерно также, если не брать в расчёт механизм
сообщений, о которых мы поговорим позднее.