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


Рисование линий


Нас совершенно не интересует написание функций для рисования линий с применением сложностей типа алгоритма Брезинхема. Более того, в наших играх вообще не будет линий, проходящих под произвольным углом. Напротив, у нас будет множество вертикальных линий и, может быть, немного горизонтальных. На самом деле, большинство игр вообще обходится без рисования линий, так как в них используются битовые массивы.

Мы напишем две функции. Одна из них рисует горизонтальные линии слева направо, а другая — вертикальные сверху вниз. Рисунок 5.4 показывает, как они выглядят в видеобуфере.

Поскольку горизонтальные линии рисовать легче, то с них мы и начнем. Как видно из рисунка 5.4, горизонтальную линию можно получить, заполняя ряд пикселей в матрице 320х200. Чтобы это проделать, мы должны найти начальный адрес строки и заполнить ее значениями пикселей от начальной до конечной позиции. Для этого стоит использовать функцию rnemset. Это один из самых быстрых способов. Листинг 5,6 содержит код такой функции.

Листинг 5.6. Рисование горизонтальной линии.

void H_Line (int х1, int x2, int y, unsigned int color)

{

// функция рисует горизонтальную линию, используя memset()

// x2 должно быть больше х1

_fmemset ((char far *) (video_buffer + ((у << 8) + (у

<<6)) + х1), color, x2 - х1 + 1);

} // конец функции

Следует кое-что запомнить:

§

Мы используем функцию _fmemset, поскольку она, в отличие от memset, корректно работает с дальними (FAR) указателями;

§          Мы вычисляем начальный адрес линии, и функция заполняет определенное количество байтов заданным значением цвета;

§          Количество байтов равно длине строки, которую мы вычисляем как разность между правым и левым концами линии. При этом нужно прибавить единицу, чтобы не потерять последнюю точку.

К сожалению, мы не можем использовать семейство функций memset для рисования вертикальных линий, поскольку они работают только с непрерывными областями памяти.


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



Книжный магазин