Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Pascal Форум Информер Страны мира
   Demo Making    >>    flame4
   
 
 Short Fire Routine for Mode 13h   Mike Flynn 31.05.95

Программа для демонстрации эффекта пламени в золотисто-коричневых тонах, режим [320x400x256]. Получившийся эффект внешне больше похож на развевающееся на ветру полотно из золотой парчи, чем на пламя...



1k 
 

  {> Cut here. FileName= FLAME4.PAS } (********************************************************************* Hopefully you got this from SWAG :) Anyways, this is my little fire routine that I wrote. It didn't take me very long and is far from being optimized... so it's kind of slow.... Runs fine on my pentium 100mhz though!!! :) This code was written by Phire of Patd Programming. Check out my homepage: http://www.tripod.com/~rflynn or email: rflynn@shelby.net Please feel free to improve my code ;) (********************************************************************) USES CRT, DOS; CONST YMAX = 50; YMIN = 0; XMAX = 317; XMIN = 2; maxc = 1; VAR X,Y,Z : WORD; TOTAL : WORD; A,B,C : LONGINT; I : WORD; SCREEN : ARRAY[1..64000] OF BYTE; ST, ET : REAL; CYCLES : LONGINT; PROCEDURE CT(VAR MOO:REAL); VAR H,M,S,MS : WORD; BEGIN GETTIME(H,M,S,MS); MOO:=H*3600+M*60+S+MS DIV 100; END; procedure setcolor(color,r,g,b : byte); begin port[$3c8]:=color; port[$3c9]:=r; port[$3c9]:=g; port[$3c9]:=b; end; BEGIN RANDOMIZE; ASM MOV AX, 13H; INT 10H; END; asm mov dx, 03d4h mov al, 9 out dx, al inc dx and al, 0e0h or al, 7 out dx, al end; for i:=0 to 63 do setcolor(i,0,0,0); for i:=0 to 63 do setcolor(64+i,0,0,0); for i:=0 to 63 do setcolor(128+i,i,i shr 1,0); for i:=0 to 63 do setcolor(192+i,63,32+i shr 1,0); FILLCHAR(SCREEN, 64000, 0); WHILE KEYPRESSED DO READKEY; CT(ST); CYCLES:=0; REPEAT MOVE(SCREEN, MEM[$A000:0], 64000); FOR Y:=YMAX DOWNTO YMIN DO BEGIN IF Y=YMAX THEN BEGIN FOR Z:=XMIN TO XMAX DO BEGIN CASE RANDOM(10) OF 0,2,4 : SCREEN[Y*320+Z]:=0; 1,3,5,6,7,8,9 : SCREEN[Y*320+Z]:=255; END; END; END; FOR X:=XMIN TO XMAX DO BEGIN IF Y<YMAX THEN BEGIN INC(CYCLES); IF CYCLES=MAXC+1 THEN CYCLES:=0; IF CYCLES=0 THEN BEGIN TOTAL:=0; SCREEN[Y*320+X]:=SCREEN[(Y+1)*320+X]; TOTAL:=TOTAL+SCREEN[(Y+1)*320+(X-1)]; TOTAL:=TOTAL+SCREEN[(Y+1)*320+(X)]; TOTAL:=TOTAL+SCREEN[(Y+1)*320+(X+1)]; TOTAL:=TOTAL+SCREEN[(Y)*320+(X-1)]; TOTAL:=TOTAL+SCREEN[(Y)*320+(X)]; TOTAL:=TOTAL+SCREEN[(Y)*320+(X+1)]; A:=TOTAL DIV 6; END; IF A>255 THEN A:=255; SCREEN[Y*320+X]:=A; SCREEN[Y*320+(X-1)]:=A; SCREEN[Y*320+(X+1)]:=A; END; END; END; UNTIL (KEYPRESSED); asm mov ax, 3h int 10h end; END. { --- CUT --- } (___) * Digital Patd/Patd Programming (o o)-------/ EMAIL: rflynn@shelby.net \_/________| WWW : http://www.tripod.com/~rflynn || || SysOp Of Hot As Fire BBS!! {704}657-9498 ^^ ^^ Call today or you might get burned!!!