Читайте также: |
|
// ВКЛЮЧАЕМЫЕ ФАЙЛЫ ///////////////////////////////////////
#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 для работы с устройствами ввода, за исключением клавиатуры.
Дата добавления: 2015-07-12; просмотров: 83 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Bios INT 33h | | | МЕХАНИЗМЫ ДВУХМЕРНОЙ ГРАФИКИ |