[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]

{
 JG> This coding works fine, I would like to make the ball travel
 JG> smoother.  When it travels in the air, its kinda "Chunky"

 JG> How could you make it so that the computer calculates the next
 JG> point and make it travel the ball to that point one pixel at a
 JG> time?  Cause with this structure, it kinda "Jumps there"

        Try next code and tell me ...
}

Program FallingBall;

{ Written by Luis Mezquita Raya }

{$x+}

uses  Crt,
      Graph;

Procedure Init;
var cg,mg:integer;
begin
 cg:=Detect;
 InitGraph(cg,mg,'\turbo\tp');
end;

Procedure Wait(msk:byte); assembler;
asm
        mov dx,3dah
@Loop1: in al,dx
        test al,msk
        jz @Loop1
@Loop2: in al,dx
        test al,msk
        jnz @Loop2
end;

Procedure Calc;
var angle,power,gravity,a1,a2,a3,y0,n:real;
    size:word;
    ball,mask,bkg:pointer;
    x,y,ox,oy,pause:integer;
begin

 ClearViewPort;

 size:=ImageSize(0,0,20,20);
 GetMem(ball,size);
 GetMem(mask,size);
 GetMem(bkg,size);

 SetFillStyle(SolidFill,Yellow);        { Draw a ball }
 Circle(10,10,8);
 FloodFill(10,10,White);
 GetImage(0,0,20,20,ball^);             { Get the ball }

 SetFillStyle(SolidFill,White);         { Draw ball's mask }
 Bar(0,0,20,20);
 SetFillStyle(SolidFill,Black);
 SetColor(Black);
 Circle(10,10,10);
 FloodFill(10,10,Black);
 GetImage(0,0,20,20,mask^);             { Get the mask }

 ClearViewPort;                         { Draw a background }
 SetFillStyle(CloseDotFill,LightBlue);
 Bar(0,0,GetMaxX,GetMaxY);

 angle:=35;                             { Init vars }
 power:=10;
 gravity:=0.1;
 y0:=200;
 ox:=-1;
 n:=0;

 while n<80 do                          { Main loop }
  begin
   a1:=cos(angle*pi/180)*power*n;
   a2:=y0-sin(angle*pi/180)*power*n;
   a3:=gravity*n*n;
   x:=Round(a1);
   y:=Round(a2+a3);
   Wait(8);                             { Wait retrace }
   for pause:=0 to 399 do Wait(1);      { Wait scan line }
   if ox<>-1                            { Restore old background }
   then PutImage(ox,oy,bkg^,CopyPut);
   GetImage(x,y,x+20,y+20,bkg^);        { Save background }
   PutImage(x,y,mask^,AndPut);          { Put mask }
   PutImage(x,y,ball^,OrPut);           { Put ball }
   ox:=x;
   oy:=y;
   n:=n+0.2;
  end;

 FreeMem(ball,size);
 FreeMem(mask,size);
end;


begin
 Init;
 Calc;
 ReadKey;
 CloseGraph;
end.

[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]