Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Листинг 3.8. Работа с мышью (MOUSE.C)// ВКЛЮЧАЕМЫЕ ФАЙЛЫ /////////////////////////////////////// #include <dos.h> #include <bios.h> #include <stdio.h> #include <math.h> #include <conio.h> #include <graph.h> // ОПРЕДЕЛЕНИЯ /////////////////////////////////////////// // вызовы функций мыши #define MOUSE_INT 0х33 // Номер прерывания мыши #define MOUSE_RESET 0х00 // Инициализация драйвера #define MOUSE_SHOW 0х01 // Показать курсор мыши #define MOUSE_HIDE 0х02 // Спрятать курсор мыши #define MOUSE_BUTT_POS 0х03 // Получение полного статуса #define MOUSE_SET_SENSITIVITY Ox1A // Установка чувствительности #define MOUSE_MOTION_REL ОхОВ // Получить значение счетчика // микки #define MOUSE_LEFT_BUTTON 0х01 // левая кнопка #define MOUSE_RIGHT_BUTTON 0х02 // правая кнопка #define MOUSE_CENTER_BUTTON 0х04 // средняя кнопка // ФУНКЦИИ //////////////////////////////////////////////// int Squeeze_Mouse(int command, int *x, int *y,int *buttons) { // Мы будем использовать _int86 вместо встроенного ассемблера // Почему? И сам не знаю union _REGS inregs, outregs; switch(command) { case MOUSE_RESET: { inregs.x.ax = 0х00; // подфункция 0 – инициализация _int86(MOUSE_INT, &inregs, &outregs}; *buttons = outregs.x.bx; // возвратить количество кнопок return(outregs.x.ax); // возвратить общий результат } break; case MOUSE_SHOW: { // эта функция инкрементирует счетчик драйвера. Когда значение // счетчика становится больше или равно 0, курсор появляется // на экране inregs.х.ах = 0х01; // подфункция 1 - показать курсор _int86(MOUSE_INT, &inregs, &outregs); return (1); } break; case MOUSE_HIDE: { // эта функция декрементирует счетчик драйвера; когда его // значение становится меньше 0, курсор исчезает с экрана inregs.х.ах = 0х02; // подфункция 2 - спрятать курсор _int86(MOUSE_INT, &inregs, &outregs); return(1); } break; case MOUSE_BUTT_POS: { // эта функция позволяет получить полный статус состояния мыши, // включая абсолютную позицию курсора в координатах (х,у) и // состояние кнопок inregs.х.ах = 0х03; // подфункция 3 - получить статус мыши _int86(MOUSE_INT, &inregs, &outregs); // извлечь информацию и вернуть ее через указатели *х = outregs.х.сх; *у = outregs.x.dx; *buttons = outregs.x.bx; return(1); } break; case MOUSE_MOTION_REL: { // эта функция позволяет получить относительное изменение // координат мыши с момента последнего вызова inregs.х.ах = 0х03; // подфункция 1 – получить // относительную позицию _int86(MOUSE_INT, &inregs, &outregs); // результат при помощи указателей помещается в переменные х и у *х = outregs.x.cx; *у = outregs.x.dx; return(1); } break; case MOUSE_SET_SENSITIVITY: { // эта функция устанавливает чувствительность мыши. Перед // вызовом необходимо установить переменные х и у в значения // из диапазона 1-100. Переменная "buttons" используется для // установки значения порога удвоения скорости // (из диапазона 1-100) inregs.x.bx = *х; inregs.x.cx = *у; inregs.x.dx = *buttons; inregs.x.ax = 0x1A; // подфункция 26 - установка // чувствительности _int86(MOUSE INT, &inregs, &outregs); return(1); } break; default:break; } // конец оператора switch } // конец функции // ОСНОВНАЯ ПРОГРАММА ///////////////////////////////////////////////////////////////////////////// void main(void) { int x,y,buttons,num_buttons; int color=l; _setvideomode(_VRES16COLOR}; // 640х480, 16 цветов // инициализация драйвера мыши Squeeze_Mouse(MOUSE_RESET,NULL,NULL,&num_buttons); //показать курсор Squeeze_Mouse(MOUSE_SHOW,NULL,NULL,NULL); while(!kbhit()) { _settextposition(2,0); Squeeze_Mouse(MOUSE_BUTT_POS,&x,&у,&buttons); printf("mouse x=%d y=%d buttons=%d ",х,у,buttons); // рисование if (buttons==1) { _setcolor(color); _setpixel(x-1,y-2); _setpixel(х,y-2); _setpixel(x-1,y-1); _setpixel(х,y-1); } // конец обработки нажатия левой кнопки // выбор цвета if (buttons==2) { if (++color>15) color=0; // ждем отпускания правой кнопки while(buttons==2) { Squeeze_Mouse(MOUSE_BUTT_POS,&x,&y,&buttons); } // конец ожидания } // конец графической работы } // конец цикла while // назад в текстовый режим _setvideomode(_DEFAULTMODE); } // конец функции main
ИТОГ В этой главе мы изучили разные устройства ввода, которые могут использоваться в видеоиграх: клавиатура, джойстик, мышь. Более того, мы даже написали функции для работы с этими устройствами. Еще мы выяснили, что не стоит использовать BIOS для работы с устройствами ввода, за исключением клавиатуры.
|