|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Eugene Zagidullin 2:5030/2333.3 03 Jan 2002 00:55:37 To : Alexander Alfimov Subject : Срочно нужен алг прорисовки огня -------------------------------------------------------------------------------- 30 Дек 01, когда часы пробили 21:16, Alexander Alfimov написал Evgeniy Jirnov: EJ>> Суммируем точки сверху, слева, справа, снизу и еще ниже и делим EJ>> на 5. EJ>> Примерно так: EJ>> (X,Y)=((X,Y-1)+(X-1,Y)+(X+1,Y)+(X,Y+1)+(X,Y+2))/5 AA> Благодарю за совет,но этот я знаю :) AA> хотелось бы что-нить пореалистичнее (хотя бы как в DN) Достаточно реалистично. Главное - сгенерить нормальную палитру, и еще главнее - не выводить несколько самых нижних строк - они выглядят отвратительно. Вот мой вариант (самая нижняя строка заполняется черными и ярко-желтыми пикселами с вероятностью 1/1): _=== Грызи ===_ #pragma warn -rvl #include<stdlib.h> #include<stdio.h> #include<alloc.h> #include<conio.h> #include<dos.h> #define getpixel(x,y) buffer[x+(y<<8)+(y<<6)] #define putpixel(x,y,c) buffer[x+(y<<8)+(y<<6)]=c #define BUFSIZE 64960 #define WORDSFILL 32480 #define WORDSMOVE 32000 int f(double x); void setpalette(void); void setrgbcolor(char color,char r,char g,char b); int rnd(void); long clock(void); char far *buffer; long frames=0, begtime, endtime; unsigned l; void main() { int x, y; /* Координаты */ int count=50, fadeout=0; //l=0x51AC; l=(unsigned)clock(); buffer=(char far *)farmalloc(BUFSIZE); if(!buffer) { printf("Fatal Error: Out of memory\n"); exit(0); } asm{mov ax,0x13; int 0x10} setpalette(); asm{les di, dword ptr buffer xor ax, ax mov cx, WORDSFILL rep stosw} while(kbhit()) getch(); begtime=clock(); while(count) { if(kbhit()) { fadeout=1; for(x=0; x<=319; x++) putpixel(x, 202, 0); getch(); } if(!fadeout) for(x=0; x<=319; x++) if(rnd()) putpixel(x, 202, 100); else putpixel(x, 202, 0); asm{les bx, dword ptr buffer xor dh, dh mov di, 1} loop: asm{mov cx, 318} loop1: asm{xor ah, ah mov al, es:[bx][di-1] mov dl, es:[bx][di+1]; add ax, dx mov dl, es:[bx][di+319]; add ax, dx mov dl, es:[bx][di+320]; add ax, dx mov dl, es:[bx][di+321]; add ax, dx mov dl, es:[bx][di+639]; add ax, dx mov dl, es:[bx][di+640]; add ax, dx mov dl, es:[bx][di+641]; add ax, dx shr ax, 3 mov es:[bx][di], al inc di loop loop1 inc di inc di cmp di, (320*201+1) jne loop mov cx, 318} loop2: asm{xor ah, ah mov al, es:[bx][di-1] mov dl, es:[bx][di]; add ax, dx mov dl, es:[bx][di+1]; add ax, dx mov dl, es:[bx][di+319]; add ax, dx mov dl, es:[bx][di+320]; add ax, dx mov dl, es:[bx][di+321]; add ax, dx shr ax, 3 mov es:[bx][di], al inc di loop loop2 mov dx,0x03DA} //Вывод массива с ожиданием начала обратного хода луча _1: asm{in al,dx test al,8 jnz _1} _2: asm{in al,dx test al,8 jz _2 push ds lds si, dword ptr buffer mov ax, 0xA000 mov es, ax xor di, di mov cx, WORDSMOVE} move: asm{movsw loop move pop ds} frames++; //delay(10); if(fadeout) count--; } endtime=clock()-begtime; asm{mov ax,3; int 0x10} farfree(buffer); printf("Speed: %f fps\n", (double)frames/endtime*18.2); } void setrgbcolor(char color,char r,char g,char b) { asm { mov dx,0x03C8 mov al,color out dx,al inc dx mov al,r out dx,al mov al,g out dx,al mov al,b out dx,al } } int f(double x) { if(x>=0 && x<=1) return(63*x*(2-x)); if(x<0) return(0); return(63); } void setpalette() { int n; for (n=1;n<=100;n++) setrgbcolor(n, f((double)n/50), f((double)n/50-0.2), f((double)n/50-0.5) + f(0.1-(double)n/50)*n/7 + 5); } int rnd() { asm{mov ax, l ror ax, 1 xor ax, 0xAA15 inc ax mov l, ax and ax, 1} } long clock() { asm{xor ax, ax mov es, ax mov ax, es:[0x046C] mov dx, es:[0x046E]} } _=== Плюнь ===_ Best regards, Eugene. _wozza@yandex.ru_ ... Смотpи: небо темнеет, и с него падают меpтвые птицы... --- GoldED+/W32 1.1.5-20011123 * Origin: А вы кричите, сиську просите... (2:5030/2333.3) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/174203c3373e5.html, оценка из 5, голосов 10
|