Программирование игр для Windows. Советы профессионала


Пример обработчика прерывания № 2 - Ловим нажатия клавиш! - часть 4


// чем обычно за счет применения операции сдвига вместо операции

// умножения

// используем известный факт, что 320*у = 256*у + 64*у = у<<8 + у<<6

video_buffer[((y<<8) + (у<<6) ) + х] = color;

} // конец Plot_Pixel_Fast

/////////////////////////////////////////////

void Fun_Back(void)

{

int index;

// несомненно  запоминающийся рисунок фона

_setcolor(1) ;

_rectangle(_GFILLINTERIOR, 0,0,320,200);

_setcolor{15) ;

for (index=0; index<10; index++)

{

_moveto(16+index*32,0);

_lineto(16+index*32,199);

} // конец

цикла

for (index=0; index<10; index++)

{

_moveto(0,10+index*20) ;

_lineto(319,10+index*20);

} // конец цикла

} // конец Fun Back

///////////////////////////////////////

void _interrupt _far New_Key_Int(void)

{

// я в настроении немного попрограммировать на ассемблере!

_asm{

sti                ; разрешаем прерывания

in al,KEY BUFFER   ; получаем нажатую клавишу

xor ah,ah          ; обнуляем старшие 8 бит регистра АХ

mov raw_key, ax  ; сохраняем код клавиши

in al,KEY_CONTROL ; читаем управляющий регистр

or al,82h       ; устанавливаем необходимые биты для сброса FF

out KEY_CONTROL,al ; посылаем новые данные в управляющий регистр

and al,7fh

out KEY_CONTROL,al ; завершаем

сброс

mov al,20h

out INT CONTROL,al; завершаем

прерывание

} // конец ассемблерной вставки

// теперь вернемся К Си, чтобы изменить данные

// в таблице состояния клавиш со стрелками

// обработка нажатой клавиши и изменение таблицы

switch(raw_key)

{

case MAKE_UP:    // нажатие стрелки вверх

{

key_table[INDEX_UP]    = 1;

} break;

case MAKE_DOWN:  // нажатие стрелки вниз

{

key_table[INDEX_DOWN]  = 1;

) break;

case MAKE_RIGHT: // нажатие' стрелки вправо

{

key_table[INDEX_RIGHT] = 1;

} break;

case MAKE_LEFT:  // нажатие стрелки влево

{

key__table[INDEX_LEFT]  = 1;

} break;

case BREAK_UP:    // отпускание стрелки вверх

{

key_table[INDEX_UP]    = 0; 

} break;

case BREAK DOWN:  // отпускание стрелки вниз

{

key_table[INDEX_DOWN]  = 0;




Начало  Назад  Вперед