Растровая визуализация в изометрической проекции
Продолжение
Владимиp В. Федоpов
ПРИЛОЖЕНИЕ B: Исходный текст пpогpаммы FLOORS3.
#include "SVGA_MV.H" //моя библиотека
void main(void)
{
char *file="floors.spr";
char *file2="floors3.tbl";
char *file3="floors.map";
struct SPRITE floor, maps, header, robot[8];
signed int fl, zx, zy, key, rob_x=20, rob_y=20, old_x, old_y;
signed int handle, xx, yy, xxx, yyy, coun=0, max_coun=0;
signed int delta_x=5, delta_y=6; //смещение экрана относительно робота 1
signed int far *scrf=NULL;
unsigned char fl1, fl2, fl3; //флажки
signed char rdir1=6, dr=1; //направления
signed char rdir[10]; //направления движения роботов
signed int offs[8][2]; //смещения поля для разных
//направлений взгляда робота
SETVMODE(SVGA480);
WritePal(palette); //палитpу в sVGA
ClearScreen(0);
ink=255;paper=0;
//сдвиги экрана для различных направлений взгляда
offs[0][0]=8; offs[0][1]=6;
offs[1][0]=6; offs[1][1]=8;
offs[2][0]=4; offs[2][1]=10;
offs[3][0]=2; offs[3][1]=9;
offs[4][0]=1; offs[4][1]=7;
offs[5][0]=3; offs[5][1]=5;
offs[6][0]=5; offs[6][1]=3;
offs[7][0]=7; offs[7][1]=4;
handle=LoadSpritePlus(1,&floor,file); //спрайт для пола
ClearSpriteA(3,C_BLUE+6,&floor); //Очистим спрайт 3 пола
handle+=LoadSprite(&robot[0],"rob1_0.spr"); //робот
handle+=LoadSprite(&robot[1],"rob1_1.spr"); //робот
handle+=LoadSprite(&robot[2],"rob1_2.spr"); //робот
handle+=LoadSprite(&robot[3],"rob1_3.spr"); //робот
handle+=LoadSprite(&robot[4],"rob1_2.spr"); //робот
FlipYSprA(0,&robot[4]); //перевернуть
handle+=LoadSprite(&robot[5],"rob1_1.spr"); //робот
FlipYSprA(0,&robot[5]);
handle+=LoadSprite(&robot[6],"rob1_0.spr"); //робот
FlipYSprA(0,&robot[6]);
handle+=LoadSprite(&robot[7],"rob1_7.spr"); //робот
if (handle!=0) {
ErrorWin("Невозможно загрузить спрайты",1);
goto exx; //выход нафиг
}
handle=LoadSpritePlus(1,&maps,file3); //план пола
if (handle!=0) {
ErrorWin("Невозможно загрузить пол",1);
goto exx; //выход нафиг
}
ClearSpriteA(1,0,&maps); //Очистим плоскость 1 плана
ink=1; //робот N1
PutPixSpriteA(1,rob_x,rob_y,&maps); //поставим его на план
ink=2; //робот N2
PutPixSpriteA(1,28,16,&maps); //поставим его на план
ink=3; //робот N3
PutPixSpriteA(1,12,26,&maps); //поставим его на план
if ((handle = open(file2, O_RDONLY | O_BINARY)) == -1) {
ErrorWin("Floor table not found...", 1); }
else { //все хорошо
max_coun = (signed int) filelength(handle)/2; //число элементов матрицы
scrf = (signed int *) malloc(10+max_coun*2); // пpобуем очистить память
read(handle, &scrf[0], max_coun*2);
close(handle);
}
for (coun=0; coun<10; coun++) { //инициализируем спрайты робота
rdir[coun]=random(8);}
ink=C_BLACK;
for (xx=60; xx<191; xx++) { //уголки
BrLine(xx,0,-xx,xx/2);
BrLine(HRES-xx,0,xx,xx/2);
}
FBox(0,0,HRES,32); //весь верх
ink=10;
FBox(0,0,HRES,22); //заголовок
ink=255; attr=0;
BLine(0,0,HRES,22);
GPrintf(190,4,"DEMO MODEL by Vladimir Fedorov");
MakeSprite(0,22,HRES,78,&header); //спрайт заголовка
zx=0; zy=0;
attr=1; ink=255; paper=C_BLACK;
wait_retrace=0;
do {
rdir1=rdir[1]; //направление робота 1 (основного)
delta_x=offs[rdir1][0]; //смещение для направления взгляда
delta_y=offs[rdir1][1];
//Центрирование экрана по роботу
fl3=0; //автоматическое действие сделано
if (zx>rob_x-delta_x) { zx--; fl3=1;}
if (zx<rob_x-delta_x) { zx++; fl3=1;}
if (zy>rob_y-delta_y) { zy--; fl3=1;}
if (zy<rob_y-delta_y) { zy++; fl3=1;}
PutSpriteTrA(0,0,22,&header); //выводим шапку
for (coun=0; coun<max_coun; coun+=5) { //цикл по видимому полу
fl=scrf[coun]; //тип обрезки спрайта пола
xx=zx+scrf[coun+1]; //координата на карте
yy=zy+scrf[coun+2];
xxx=scrf[coun+3]; //координата на экране
yyy=scrf[coun+4];
fl1=GetPixSpriteA(0,xx,yy,&maps); //читаем тип пола
switch (fl) { //с какой стороны обрезать спрайт пола?
case 0:
PutSpriteRombA(fl1,xxx,yyy,&floor); //выводим целый
break;
case LEFT:
PutSpriteRombLeft(fl1,xxx,yyy,&floor); //выводим
break;
case RIGHT:
PutSpriteRombRight(fl1,xxx,yyy,&floor); //выводим
break;
case UP:
PutSpriteRombUp(fl1,xxx,yyy,&floor); //выводим
break;
default:
PutSpriteRombDown(fl1,xxx,yyy,&floor); //выводим
break;
}
fl2=GetPixSpriteA(1,xx,yy,&maps); //читаем плоскость роботов
if ((fl2>0) && (xxx>=0) && (yyy>=0) && (fl==0)) {
PutSpriteTrA(0,xxx-50,yyy-50,&robot[rdir[fl2]]);} //выводим робота
}
ink=255; attr=1;
GPrintf(4,VRES-32,"ZX:%d ", zx);
GPrintf(4,VRES-16,"ZY:%d ", zy);
GPrintf(580,VRES-32,"RX:%d ", rob_x);
GPrintf(580,VRES-16,"RY:%d ", rob_y);
if (fl3==0) { //не надо автоматических действий?
key=WKey();} //ждем клавишу
else { //надо что-то сделать автоматически
key=NoWKey(); //клавиша без ожидания
delay(100);
}
switch(key){
case 0: //ничего не нажато - пустой цикл
break;
case 336: //двигаем назад
case 328: //двигаем робота вперед
if (key==328) dr=1; //флажок инкpемента
else dr=-1; //или декpемента
old_x=rob_x; old_y=rob_y; //старые координаты
switch(rdir1) { //в каком направлении?
case 0:
rob_x-=dr; break;
case 1:
rob_x-=dr; rob_y-=dr; break;
case 2:
rob_y-=dr; break;
case 3:
rob_x+=dr; rob_y-=dr; break;
case 4:
rob_x+=dr; break;
case 5:
rob_x+=dr; rob_y+=dr; break;
case 6:
rob_y+=dr; break;
case 7:
rob_x-=dr; rob_y+=dr; break;
default: break;}
fl1=GetPixSpriteA(0,rob_x,rob_y,&maps);
fl2=GetPixSpriteA(1,rob_x,rob_y,&maps);
if ((fl2==0) && (fl1<3)) { //место свободно и проходимо
ink=0; //пусто
PutPixSpriteA(1,old_x,old_y,&maps); //сотрем с плана
ink=1; //робот N1
PutPixSpriteA(1,rob_x,rob_y,&maps); //поставим его на план
}
else {
rob_x=old_x; rob_y=old_y;
}
break;
case 331: rdir1--; //вращаем робота
if (rdir1<0) rdir1=7;
break;
case 333: rdir1++; //вращаем робота
if (rdir1>7) rdir1=0;
break;
default: break;}
rdir[1]=rdir1;
} while(key!=27);
//заканчиваем pаботу, все очищаем
WKey();
free(scrf);
KillSprite(&header);
KillSprite(&maps);
for (coun=0; coun<8; coun++) { //уничтожим спрайты робота
KillSprite(&robot[coun]);}
KillSprite(&floor);
exx: //метка аваpийного выхода
SETVMODE(TEXT);
exit(0);
}
=========================================================
Владимиp В. Федоpов, FIDO +7 2:5030/175.3
+7 2:5030/172.67
Пеpвая pедакция: Санкт-Петеpбуpг, 01/02/1997, зима, сумеpки...
Втоpая pедакция: Санкт-Петеpбуpг, 24/05/1997, холодная весна...
<< Назад | Далее >>
