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


Реализация отсектеля лучей - часть 5


x_bound += x__delta;

y_bound += y_delta;         

}

//СЕКЦИЯ   6 ////////////////////////////////////////  

// выяснить, какая из стен ближе - вертикальная или горизонтальная 

// и затем нарисовать ее                                           

// Примечание: в дальнейшем мы заменим вертикальную линию на

// текстурный блок, пока же достаточно того, что есть

if (dist_x < dist_y)

{

sline(x,y,(long)xb_save,(long)yi_save, rcolor);

// вертикальная стена ближе горизонтальной

// вычислить масштаб и умножить на поправочный коэффициент

// для устранения сферических искажений

scale = cos_table[ray]*15000/(1e-10 + dist_x);

// вычислить координаты верха и низа

if ( (top    = 100 - scale/2) < 1) top =1; 

if ( (bottom = top+scale) > 200) bottom=200;

// нарисовать

фрагмент стены

if ( ((long)yi_save) % CELL_Y_SIZE <= 1 ) _setcolor(15);

else

_setcolor(10);

_moveto((int)(638-ray),(int)top);

_lineto((int)(638-ray),(int)bottom);

}

else // сначала надо нарисовать горизонтальную стену

{

sline(x,y,(long)xi_save,(long)yb_save,rcolor) ;

// вычислить

масштаб

scale = cos_table[ray]*15000/(le-10 + dist_y);

// вычислить координаты верха и низа

if ( (top    = 100 - scale/2) < 1)

top = 1;

if ( (bottom = top+scale) > 200) bottom=200;

// нарисовать

фрагмент стены

if (((long)xi_save) % CELL_X_SIZE <= 1 )

_setcolor(15) ;

else

_setcolor(2);

_moveto((int)(638-ray),(int)top);

_lineto((int)(638-ray),(int)bottom) ;

} //конец оператора else

//СЕКЦИЯ   7 //////////////////////////////////////

//отсечь

следующий луч

if (++view_angle>=ANGLE_360)

{

// установить угол в 0

view_angle=0;             

} // конец оператора if

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

по лучам

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

Реализация алгоритма отсечения лучей разделена на семь основных частей, чтобы легче было понять предназначение каждой из них.

§          Первая часть произведет инициализацию всех массивов и внутренних переменных. В этой части определяется направление взгляда игрока и на его основании вычисляется стартовый угол.


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