Компьютерная графика. Полигональные модели В данной программе можно легко отказаться от использования веществен! (f/oat) чисел (что и было сделано в самой игре), применяя числа с фиксирован! точкой (см. прил.). Соответствующая программа приводится ниже. В связи с ши ким использованием 32-битовых чисел желательно в опциях компилятора указ генерацию кода для 386-го процессора.
Э) // File wolf3.cpp
#include <bios.h> #include <dos.h> #include <math.h> #include <stdio.h> #include <time.h> #include "fixmath.h"
#define VIEW_WIDTH (M_PI / 3) // viewing angle ( 60 degrees )
#define SCREEN_WIDTH 320 // size of rendering window
#define SCREEN_HEIGHT 200 // basic colors
#define FLOOR_COLOR 8
#define CEILING_COLOR 3
#define WALL_COLOR 1 // bios key defintions
#define ESC 0x011b
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00 //labyrinth
char * worldMap [] =
{
и* * *i»
II* ********* ************************** *M
I
II* * *ll
II* ********* * ************************ *ll
I
II* * *ll
>
II* ********* ************************** *ll
I
II* * *ll
I
11****************************************************11
};
float swing;
Fixed locX;
Fixed locY;
Angle angle;
long totalFrames = 01;
char far * screenPtr = (char far *) MK_FP ( OxAOOO, 0 );
Angle rayAngle [SCREEN_WIDTH]; // angles for rays from main
// viewing direction
////////////////////////// Functions llllllllllllllllllllllllllllllllllll
void drawSpan ( Fixed dist, char wallColor, int x ) {
char far * vptr = screenPtr + x;
int h =dist>=(ONE/2)?fixed2lnt(
(int2Fixed (SCREEN_HEIGHT/2) « 8) / (dist » 8)) :
13. Элементы виртуальной реальное
SCREENJHEIGHT; int j1 = ( SCREENJHEIGHT - h ) / 2; int j2 = j1 + h;
for (int j = 0; j < j1; j++,vptr += 320 )
* vptr = CEILING_COLOR;
if (j2> SCREENJHEIGHT) j2 = SCREENJHEIGHT;
for (; j < j2; j++, vptr += 320 )