UCompoundShapes.pas
上传用户:zkjn0718
上传日期:2021-01-01
资源大小:776k
文件大小:5k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UCompoundShapes;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils, Math;
  6. type
  7.    TCompoundShapes = class(TTester)
  8.    public
  9.       constructor Create; override;
  10.    end;
  11. implementation
  12. { TCompoundShapes }
  13. constructor TCompoundShapes.Create;
  14. var
  15.    i: Integer;
  16.    bd: Tb2BodyDef;
  17.    sd: Tb2PolygonDef;
  18.    body: Tb2Body;
  19.    sd1, sd2: Tb2CircleDef;
  20.    pd1, pd2, sd_bottom, sd_left, sd_right: Tb2PolygonDef;
  21.    xf1, xf2: Tb2XForm;
  22. begin
  23.    inherited;
  24.    begin
  25.       bd := Tb2BodyDef.Create;
  26.       {$IFDEF OP_OVERLOAD}
  27.       bd.position.SetValue(0.0, -10.0);
  28.       {$ELSE}
  29.       SetValue(bd.position, 0.0, -10.0);
  30.       {$ENDIF}
  31.       body := m_world.CreateBody(bd);
  32.       sd := Tb2PolygonDef.Create;
  33.       sd.SetAsBox(50.0, 10.0);
  34.       body.CreateShape(sd);
  35.    end;
  36.    begin
  37.       sd1 := Tb2CircleDef.Create;
  38.       sd1.radius := 0.5;
  39.       {$IFDEF OP_OVERLOAD}
  40.       sd1.localPosition.SetValue(-0.5, 0.5);
  41.       {$ELSE}
  42.       SetValue(sd1.localPosition, -0.5, 0.5);
  43.       {$ENDIF}
  44.       sd1.density := 2.0;
  45.       sd2 := Tb2CircleDef.Create;
  46.       sd2.radius := 0.5;
  47.       {$IFDEF OP_OVERLOAD}
  48.       sd2.localPosition.SetValue(0.5, 0.5);
  49.       {$ELSE}
  50.       SetValue(sd2.localPosition, 0.5, 0.5);
  51.       {$ENDIF}
  52.       sd2.density := 0.0; // massless
  53.       bd := Tb2BodyDef.Create;
  54.       for i := 0 to 9 do
  55.       begin
  56.          {$IFDEF OP_OVERLOAD}
  57.          bd.position.SetValue(RandomRange(-10, 10) / 100 + 5.0, 1.05 + 2.5 * i);
  58.          {$ELSE}
  59.          SetValue(bd.position, RandomRange(-10, 10) / 100 + 5.0, 1.05 + 2.5 * i);
  60.          {$ENDIF}
  61.          bd.angle := RandomRange(Round(-Pi * 100), Round(Pi * 100)) / 100;
  62.          body := m_world.CreateBody(bd, False);
  63.          body.CreateShape(sd1, False);
  64.          body.CreateShape(sd2, False);
  65.          body.SetMassFromShapes;
  66.       end;
  67.       sd1.Free;
  68.       sd2.Free;
  69.       bd.Free;
  70.    end;
  71.    begin
  72.       pd1 := Tb2PolygonDef.Create;
  73.       pd1.SetAsBox(0.25, 0.5);
  74.       pd1.density := 2.0;
  75.       pd2 := Tb2PolygonDef.Create;
  76.       pd2.SetAsBox(0.25, 0.5, MakeVector(0.0, -0.5), 0.5 * Pi);
  77.       pd2.density := 2.0;
  78.       bd := Tb2BodyDef.Create;
  79.       for i := 0 to 9 do
  80.       begin
  81.          {$IFDEF OP_OVERLOAD}
  82.          bd.position.SetValue(RandomRange(-10, 10) / 100 - 5.0, 1.05 + 2.5 * i);
  83.          {$ELSE}
  84.          SetValue(bd.position, RandomRange(-10, 10) / 100 - 5.0, 1.05 + 2.5 * i);
  85.          {$ENDIF}
  86.          bd.angle := RandomRange(Round(-Pi * 100), Round(Pi * 100)) / 100;
  87.          body := m_world.CreateBody(bd, False);
  88.          body.CreateShape(pd1, False);
  89.          body.CreateShape(pd2, False);
  90.          body.SetMassFromShapes;
  91.       end;
  92.       bd.Free;
  93.       pd1.Free;
  94.       pd2.Free;
  95.    end;
  96.    begin
  97.       {$IFDEF OP_OVERLOAD}
  98.       xf1.R.SetValue(0.3524 * Pi);
  99.       {$ELSE}
  100.       SetValue(xf1.R, 0.3524 * Pi);
  101.       {$ENDIF}
  102.       xf1.position := b2Mul(xf1.R, MakeVector(1.0, 0.0));
  103.       pd1 := Tb2PolygonDef.Create;
  104.       pd1.vertexCount := 3;
  105.       pd1.vertices[0] := b2Mul(xf1, MakeVector(-1.0, 0.0));
  106.       pd1.vertices[1] := b2Mul(xf1, MakeVector(1.0, 0.0));
  107.       pd1.vertices[2] := b2Mul(xf1, MakeVector(0.0, 0.5));
  108.       pd1.density := 2.0;
  109.       {$IFDEF OP_OVERLOAD}
  110.       xf2.R.SetValue(-0.3524 * Pi);
  111.       {$ELSE}
  112.       SetValue(xf2.R, -0.3524 * Pi);
  113.       {$ENDIF}
  114.       xf2.position := b2Mul(xf2.R, MakeVector(-1.0, 0.0));
  115.       pd2 := Tb2PolygonDef.Create;
  116.       pd2.vertexCount := 3;
  117.       pd2.vertices[0] := b2Mul(xf2, MakeVector(-1.0, 0.0));
  118.       pd2.vertices[1] := b2Mul(xf2, MakeVector(1.0, 0.0));
  119.       pd2.vertices[2] := b2Mul(xf2, MakeVector(0.0, 0.5));
  120.       pd2.density := 2.0;
  121.       bd := Tb2BodyDef.Create;
  122.       for i := 0 to 9 do
  123.       begin
  124.          {$IFDEF OP_OVERLOAD}
  125.          bd.position.SetValue(RandomRange(-10, 10) / 100, 2.05 + 2.5 * i);
  126.          {$ELSE}
  127.          SetValue(bd.position, RandomRange(-10, 10) / 100, 2.05 + 2.5 * i);
  128.          {$ENDIF}
  129.          bd.angle := 0.0;
  130.          body := m_world.CreateBody(bd, False);
  131.          body.CreateShape(pd1, False);
  132.          body.CreateShape(pd2, False);
  133.          body.SetMassFromShapes;
  134.       end;
  135.       bd.Free;
  136.       pd1.Free;
  137.       pd2.Free;
  138.    end;
  139.    begin
  140.       sd_bottom := Tb2PolygonDef.Create;
  141.       sd_bottom.SetAsBox(1.5, 0.15);
  142.       sd_bottom.density := 4.0;
  143.       sd_left := Tb2PolygonDef.Create;
  144.       sd_left.SetAsBox(0.15, 2.7, MakeVector(-1.45, 2.35), 0.2);
  145.       sd_left.density := 4.0;
  146.       sd_right := Tb2PolygonDef.Create;
  147.       sd_right.SetAsBox(0.15, 2.7, MakeVector(1.45, 2.35), -0.2);
  148.       sd_right.density := 4.0;
  149.       bd := Tb2BodyDef.Create;
  150.       {$IFDEF OP_OVERLOAD}
  151.       bd.position.SetValue(0.0, 2.0);
  152.       {$ELSE}
  153.       SetValue(bd.position, 0.0, 2.0);
  154.       {$ENDIF}
  155.       body := m_world.CreateBody(bd);
  156.       body.CreateShape(sd_bottom);
  157.       body.CreateShape(sd_left);
  158.       body.CreateShape(sd_right);
  159.       body.SetMassFromShapes;
  160.    end;
  161. end;
  162. initialization
  163.    RegisterTestEntry('Compound Shapes', TCompoundShapes);
  164. end.