КАК использовать клаву?

КАК узнать, какой скан-код у данной клавиши?
КАК можно управлять клавиатурой без знания скан-кодов?
КАК сделать окно в текстовом режиме?
КАК можно управлять перемещением объекта клавишами со стрелками?



Вопрос: КАК узнать, какой скан-код у данной клавиши?

В программах под 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);


При небольших изменениях управляющей структуры, мы получили максимум эффекта.

Вопрос: КАК сделать окно в текстовом режиме?

Напишем заготовку для игры. Пусть у нас по экрану бегает буковка, управляемая с клавиатуры стрелками курсора. Здесь же попутно я познакомлю вас с текстовыми окнами - областями экрана, которые рассматриваются, как маленькие экранчики. Сделать окно проще простого:

textbackground(13); //цвет окна
window(1,1,20,10); //само окно
clrscr(); //оно не закрасится, пока мы его не очистим


Теперь все gotoxy будут восприниматься для этого окна, пока мы не введём новое окно. В данной программе у нас будут два окна: заголовок экрана и рабочее поле, по которому движется фигурка.

Вопрос: КАК можно управлять перемещением объекта клавишами со стрелками? (Игра "Крот")

#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 всё обстоит примерно также, если не брать в расчёт механизм сообщений, о которых мы поговорим позднее.

Назад Содержание Вперёд