|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Eugene Zagidullin 2:5030/2333.3 25 Jan 2002 14:06:45 To : All Subject : И снова пламя -------------------------------------------------------------------------------- Я уже кидал сюда свой вариант пламени. Теперь и у меня возник вопрос: а нельзя ли как-нибудь избавиться от неподвижного градиента, служащего фоном для языков пламени? Вот исходник: === Кусай === #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-20020104 * Origin: А вы кричите, сиську просите... (2:5030/2333.3) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/174203c512ede.html, оценка из 5, голосов 10
|