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


ИГРА WARLOCK (КОЛДУН) - часть 5


Отсекатель лучей, который я создал для Warlock, немного другой. Новая программа оптимизирована во многих частях, хотя есть возможность ускорить ее работу еще примерно в два раза. Однако после этого отсекатель лучей мог бы стать таким жутким, что вы не захотели бы иметь с ним дело. (Я сам едва могу вообразить, как он выглядел бы в этом случае, а ведь я его написал!)

В конечном счете, быстродействие отсекателя лучей — не самое узкое место. Таким узким местом в гораздо большей мере является перемещение содержимого двойного буфера в видеопамять. Поэтому будет значительно лучше чередовать отсечение лучей с визуализацией изображения.

Мы поговорим немного больше по этому поводу и о некоторых других вещах немного позже, а сейчас перейдем непосредственно к программе нового отсекателя лучей (Листинг 19-1).

Листинг 19.1. Новая программа отсечения лучей.

void Ray Caster(long x,long у,long view_angle)

{

// Эта функция является сердцем системы. Она основана на программе

// RAY.С. Обратите особое внимание на оптимизацию по скорости

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

// поиска и применения математики с фиксированной запятой.

int   cell_x,      // Текущие координаты луча

сеll_у,

ray,         // Обрабатываемый луч

casting=2,   // Указывает, обработаны ли обе координаты

х_hit_type, // Указывают на тип объекта, пересеченного

у_hit_type, // лучом. Используется при выборе текстуры

х_bound,     // Следующая точка пересечения луча

y_bound,

next_y_cell, // Используется при отрисовке ячейки, в

next_x_cell, // которой находится луч

xray=0,      // Счетчик проверенных точек пересечения

// с вертикалями плана

yray=0,  // Счетчик проверенных точек пересечения

// с горизонталями плана

х_delta,     // Смещение, которое необходимо добавить

у_delta,     // для перехода к следующей ячейке

xb_save,

yb_save,

xi_save,     // Используется для сохранения координат

yi_save,     // точек пересечения

scale;

long  cast=0,

dist_x,      // Расстояние ;от точки пересечения




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



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