19 tháng 6, 2018

Một số thủ thuật làm hình chuyển động trên Turbo Pascal


Chúng ta hãy cùng xem một số thủ thuật làm hình chuyển động trên Turbo Pascal sau đây:

Thủ thuật vẽ, xóa

Đây là thủ thuật đơn giản làm hình chuyển động bằng cách vẽ đối tượng ở một vị trí, sau đó xóa đối tượng và vẽ lại nó ở một vị trí khác. Nhưng thủ thuật này thường làm cho hình chuyển động bị nháy và không mịn nhất là đối với các hình phức tạp.

Các bước thực hiện:
+ Dùng các lệnh cơ bản vẽ hình ở một vị trí đã định
+ Lưu hình bằng Delay
+ Xóa hình bằng cách vẽ lại chính nó nhưng tô màu bằng màu nền
+ Di chuyển tọa độ
+ Đặt các bước trên trong một vòng lặp

Thủ thuật “lật trang”

Đây là thủ thuật sử dụng chức năng có thể chứa nhiều hơn một trang màn hình của đa số các card màn hình. Một trang màn hình là một vùng nhớ trên card màn hình đủ để lưu trữ tất cả các điểm ảnh trên màn hình. Đối với những loại card màn hình có bộ nhớ đủ lớn, chúng ta có thể hiện nhiều trang ra màn hình. Nếu hình ảnh trên các trang gần giống nhau sẽ cho ta có cảm tưởng như hình đang di động.
Đối với các loại card màn hình có nhiều trang, mỗi trang được đánh số từ 0 đến 4
Khi sử dụng nhiều trang màn hình để thể hiện hình ảnh từng trang ra màn hình, chúng ta phải lật trang màn hình theo giải thuật sau:                                                       

Các bước thực hiện lật trang màn hình:  
+ Khởi tạo 2 biến thiết lập active, visual kiểu word     
+ Thực hiện vòng lặp   

Repeat
setvisualPage(visual); {xem trang màn hình visual}
setActivePage(active); {kích hoạt trang active}
              <các thủ tục vẽ hình>
              {hoán vị hai trang  màn hình}
              Temp:=visual;
              Visual:=active;
              Active:=temp;       

Until<điều kiện thoát vòng lặp>  

Lưu ý: khi sử dụng thủ thuật lật trang màn hình đôi lúc một số màn hình không hỗ trợ kỹ thuật này và dẫn đến một lỗi đồ họa. Do đó thường ta phải kiểm tra bằng hàm DetectGraph để dò tìm loại màn hình và mode màn hình đang sử dụng trước khi sử dụng kỹ thuật lật trang.

Một số ví dụ minh họa  

Ví dụ 1: Vẽ quả bóng chuyển động theo trục đứng bằng kỹ thuật vẽ xóa

Uses crt,graph;
Const d=500;
Var
         Mh,md,r,t,g,x,y:integer;
Begin
         {khởi tạo đồ họa}
         mh:=detect;
         initgraph(mh,md,’c:\BP\BGT’);
         {vẽ mặt phẳng}
         g:=1;  x:=300;  r:=20;
         bar(200,round(g/2*25*25)+55,500,round(g/2*25*25)+75);
         {vẽ quả bóng di chuyển}
         Repeat
               Begin
               {vẽ quả bóng rơi từ trên xuống}
                   t:=0;
                   repeat
                        begin
                             g:=1; y:=round(g/2*t*t)+30;
                             setfillstyle(1,13); fillellipse(x,y,r,r);
                             delay(d);
                             setcolor(0);
                             setfillstyle(1,0);  fillEllipse(x,y,r,r);
                             t :=t+1;
                       end
                    until t>=25;
                    {vẽ quả bomgs di chuyển từ dưới lên}
                    t:=25; y:=round(g/2*25*25)+30;
                    repeat
                        begin
                              g :=1;
                              setfillstyle(1,13); fillellipse(x,y,r,r);
                              delay(d);
                              setcolor(0);
                              setfillstyle(1,0);  fillellipse(x,y,r,r);
                              t :=t-1;
                              y:=round(g/2*t*t)+30;
                        end
                     until t<=0;
               end
         until keypressed;
         readln;
         closegraph;
end.

Ví dụ 2: Vẽ vòng tròn di động trên mặt phẳng bằng kỹ thuật lật trang màn hình

Program Vong_Tron_Di_Dong;
Uses Ctr,Graph;
Const r : Word =100;
Var
    Gd,Gm : Integer;
    XMax,Xmin : integer;
    CenterY,x : integer;
    Page1, Page2 : Word;
    Right : Boolean;
Procedure CircleDraw(x : integer);
    Begin
      ClearDevice;
      setLineStyle(Solidln,0,NormWidth);
      SetColor(Yellow);
      Circle(x,CenterY,r);
    End;
Procedure Init;
    Begin
      DetecGraph(Gd,Gm);
      If Not (Gd in[EGA,VGA,HercMono]) Then
          Begin
              Writeln(‘khong lat trang man hinh duoc’);
              Halt(1);
          End;
      InitGraph(Gd,Gm,’C:\BP\BGI’);
      If GraphResult<>GrOK Then      Halt(1);
      SetBkColor(LightBlue);
    End;
BEGIN
    Init;
    CenterY := GetMaxY Div 2;
    XMin :=R;
    XMax := GetMaxX – R;
    X := XMin;
    Page1 := 0;
    Page2 := 1;
           Right := True;
           Repeat
           SetVisualPage(Page1); {xem trang page1}
           SetActivePage(Page2); {kích hoạt trang page 2}
           {vẽ đối vòng tròn}
           CircleDraw(x);
           If Right Then
               If X <Xmax Then
                  X := x+10
               Else
                    Begin
                         X :=X-10;
                         Right :=False;
                    End
            Else                                                            
               If  X > XMin Then   
                   X := X-10   
               Else
                   Begin
                        X := X+10;
                        Right := True;
                   End;
            Delay(1000);
            ClearDevice;
            Page1 := 1-page1;
            Page2 := 1-Page2;
    Until KeyPressed;
    CloseGraph;
   End.

Sưu tầm