Tải bản đầy đủ (.doc) (4 trang)

Giả lập cảnh cháy lửa trong Turbo Pascal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (82.81 KB, 4 trang )

Giả lập cảnh lửa cháy
Lưu Văn Minh
Một biển lửabùng cháy, các đối tượng bay trong không gian bốc cháy... Các cảnh này
xuấthiện trong rất nhiều các demo, trông hệt như thật và rất ấn tượng.
Bạn có muốnlàm được những điều này không, phương pháp để thực hiện nó hết sức đơn
giản.Trước tiên bạn phải tạo một palette có những gam màu chuyển tiếp giống như màulửa
cháy. Bạn sẽ thay đổi màu dần từ dưới thấp lên cao, màu của mỗi pixel trongngọn lửa
chính là màu trung bình của 4 pixel dưới nó. Nghĩa là:
Bây giờchúng ta cần một vị trí cho ngọn lửa bắt đầu. Và ta sẽ chọn ngay dưới đáy củamàn
hình. Tại đây, ở tâm ngọn lửa, là nơi sáng chói nhất nên những màu đượcdùng nằm tại vị
trí cao của bảng màu (vàng, trắng...).
Dưới tácđộng của lưới lọc trên, mỗi lần lửa lại bốc lên phía trên và có màu sậm dần (vịtrí
thấp trong bảng màu). ý tưởnglà thực hiện lưới lọc nhiều lần và sự thay đổi trông thấy của
các lần lọc vớilưới lọc trên cho bạn cảm giác lửa đang bốc lên từ đáy màn hình.
Và nếu bạnmuốn tạo thêm hiệu ứng chẳng hạn bạn có thể cho một dòng text màu sáng vào
vùnglửa, nó sẽ chịu ảnh hưởng của bộ lọc ngay. Dòng text cũng bốc cháy giống nhưđưa nó
vào ngọn lửa thật.
Chươngtrình: FIRE.PAS
varFire: array[-5..325, 120..200] of Byte;
procedure SetRGB(Index, R, G, B: Byte);assembler;
asm
Mov dx, 3C8H;
Mov al, [Index];
Out dx, al;
Inc dx;
Mov al, [R];
Out dx, al;
Mov al, [G];
Out dx, al;
Mov al, [B];
Out dx, al;


end;
procedure SetPalette;
i: Byte;
begin
for i := 0 to 49 do
begin
SetRGB(i, 0, 0, 0);
SetRGB(i + 50, i, 0, 0);
SetRGB(i + 100, 49, i, 0);
SetRGB(i + 150, 49, 49, i);
end;
(* Các bạn cũng có thể dùng Palete dướiđây *)
{for i := 0 to 63 do
begin
SetRGB(i, i, 0, 0);
SetRGB(i + 64, 63, i, 0);
SetRGB(i + 128, 63, 63, i);
SetRGB(i + 192, 63, 63, 0);
end;}
end;
procedure Solution;
x, y, Index: Integer;
begin
for x := -5 to 325 do
for y := 120 to 200 do
begin
Index := Fire[x - 1, y + 1] + Fire[x, y + 1] +
Fire[x + 1, y + 1] + Fire[x, y + 2];
Index := Index div 4;
if y = 199 then Index := Random(80) + 120;

if Index > 0 then Dec(Index);
Fire[x, y] := Index;
if (x > 0) and (x < 319) and (y < 199) then
Mem[$A000:(y shl 6) + (y shl 8) + x] := Index;
end;
end;
BEGIN
asm
Mov ax, $13;
Int $10;
end;
SetPalette;
repeat
Solution;
until Port[$60] = 1;
asm
Mov ax, $3;
Int $10;
end;
END.

×