Растровая визуализация в изометрической проекции
Продолжение
Владими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, холодная весна...
<< Назад | Далее >>