Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 И снова пламя   Eugene Zagidullin   25 Jan 2002 14:06:45 
Архивное /ru.algorithms/174203c512ede.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional