1. Trang chủ
  2. » Công Nghệ Thông Tin

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

4 1,1K 6
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Giả lập cảnh lửa cháy
Tác giả Lưu Văn Minh
Trường học Trường Đại Học
Thể loại bài viết
Định dạng
Số trang 4
Dung lượng 111 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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

Trang 1

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 )

Trang 2

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

Trang 3

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];

Trang 4

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

Ngày đăng: 10/09/2012, 15:26

TỪ KHÓA LIÊN QUAN

w