hedgewars/uGears.pas
changeset 366 dc50b7933390
parent 364 52cb4d6f84b7
child 370 c75410fe3133
equal deleted inserted replaced
365:a26cec847dd7 366:dc50b7933390
   483 end;
   483 end;
   484 
   484 
   485 procedure DrawGears(Surface: PSDL_Surface);
   485 procedure DrawGears(Surface: PSDL_Surface);
   486 var Gear: PGear;
   486 var Gear: PGear;
   487     i: Longword;
   487     i: Longword;
   488     roplen: hwFloat;
   488     roplen: integer;
   489 
   489 
   490     procedure DrawRopeLine(X1, Y1, X2, Y2: integer);
   490     procedure DrawRopeLine(X1, Y1, X2, Y2: integer);
   491     const nodlen = 5;
   491     var  eX, eY, dX, dY: integer;
   492     var i, x, y: integer;
   492          i, sX, sY, x, y, d: integer;
   493         t, k, ladd: hwFloat;
   493          b: boolean;
   494     begin
   494     begin
   495     if (X1 = X2) and (Y1 = Y2) then
   495     if (X1 = X2) and (Y1 = Y2) then
   496        begin
   496        begin
   497        OutError('WARNING: zero length rope line!', false);
   497        OutError('WARNING: zero length rope line!', false);
   498        exit
   498        exit
   499        end;
   499        end;
   500 {    if abs(X1 - X2) > abs(Y1 - Y2) then
   500     eX:= 0;
       
   501     eY:= 0;
       
   502     dX:= X2 - X1;
       
   503     dY:= Y2 - Y1;
       
   504 
       
   505     if (dX > 0) then sX:= 1
       
   506     else
       
   507       if (dX < 0) then
       
   508          begin
       
   509          sX:= -1;
       
   510          dX:= -dX
       
   511          end else sX:= dX;
       
   512 
       
   513     if (dY > 0) then sY:= 1
       
   514        else
       
   515     if (dY < 0) then
   501        begin
   516        begin
   502        if X1 > X2 then
   517        sY:= -1;
   503           begin
   518        dY:= -dY
   504           i:= X1;
   519        end else sY:= dY;
   505           X1:= X2;
   520 
   506           X2:= i;
   521     if (dX > dY) then d:= dX
   507           i:= Y1;
   522                  else d:= dY;
   508           Y1:= Y2;
   523 
   509           Y2:= i
   524     x:= X1;
   510           end;
   525     y:= Y1;
   511        k:= (Y2 - Y1) / (X2 - X1);
   526 
   512        ladd:= sqrt(1 + sqr(k));
   527     for i:= 0 to d do
   513        if X1 < 0 then
   528         begin
   514           begin
   529         inc(eX, dX);
   515           t:= Y1 - 2 - k * X1;
   530         inc(eY, dY);
   516           X1:= 0
   531         b:= false;
   517           end else t:= Y1 - 2;
   532         if (eX > d) then
   518        if X2 > cScreenWidth then X2:= cScreenWidth;
       
   519        for x:= X1 to X2 do
       
   520            begin
   533            begin
   521            roplen:= roplen + ladd;
   534            dec(eX, d);
   522            if roplen > nodlen then
   535            inc(x, sX);
   523               begin
   536            b:= true
   524               DrawGear(sRopeNode, x - 2, round(t) - 2, Surface);
       
   525               roplen:= roplen - nodlen;
       
   526               end;
       
   527            t:= t + k;
       
   528            end;
   537            end;
   529        end else
   538         if (eY > d) then
   530        begin
       
   531        if Y1 > Y2 then
       
   532           begin
       
   533           i:= X1;
       
   534           X1:= X2;
       
   535           X2:= i;
       
   536           i:= Y1;
       
   537           Y1:= Y2;
       
   538           Y2:= i
       
   539           end;
       
   540        k:= (X2 - X1) / (Y2 - Y1);
       
   541        ladd:= sqrt(1 + sqr(k));
       
   542        if Y1 < 0 then
       
   543           begin
       
   544           t:= X1 - 2 - k * Y1;
       
   545           Y1:= 0
       
   546           end else t:= X1 - 2;
       
   547        if Y2 > cScreenHeight then Y2:= cScreenHeight;
       
   548        for y:= Y1 to Y2 do
       
   549            begin
   539            begin
   550            roplen:= roplen + ladd;
   540            dec(eY, d);
   551            if roplen > nodlen then
   541            inc(y, sY);
   552               begin
   542            b:= true
   553               DrawGear(sRopeNode, round(t) - 2, y - 2, Surface);
       
   554               roplen:= roplen - nodlen;
       
   555               end;
       
   556            t:= t + k;
       
   557            end;
   543            end;
       
   544         if b then
       
   545            begin
       
   546            inc(roplen);
       
   547            if (roplen mod 4) = 0 then DrawGear(sRopeNode, x - 2, y - 2, Surface)
       
   548            end
   558        end
   549        end
   559 }    end;
   550     end;
   560 
   551 
   561 begin
   552 begin
   562 Gear:= GearsList;
   553 Gear:= GearsList;
   563 while Gear<>nil do
   554 while Gear<>nil do
   564       begin
   555       begin