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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UPolyShapes;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils, Math;
  6. const k_maxBodies = 256;
  7. type
  8.    TPolyShapes = class(TTester)
  9.    private
  10.       procedure CreateBody(index: Int32);
  11.       procedure DestroyBody;
  12.    public
  13.       bodyIndex: Int32;
  14.       bodies: array[0..k_maxBodies - 1] of Tb2Body;
  15.       sds: array[0..3] of Tb2PolygonDef;
  16.       circleDef: Tb2CircleDef;
  17.       constructor Create; override;
  18.       destructor Destroy; override;
  19.       procedure Step(var settings: TSettings; timeStep: Float); override;
  20.       procedure Keyboard(key: Byte); override;
  21.    end;
  22. implementation
  23. { TPolyShapes }
  24. constructor TPolyShapes.Create;
  25. var
  26.    w, b, s: Single;
  27.    sd: Tb2PolygonDef;
  28.    bd: Tb2BodyDef;
  29. begin
  30.    inherited;
  31.    // Ground body
  32.    begin
  33.       sd := Tb2PolygonDef.Create;
  34.       sd.SetAsBox(50.0, 10.0);
  35.       sd.friction := 0.3;
  36.       sd.filter.categoryBits := $0001;
  37.       bd := Tb2BodyDef.Create;
  38.       {$IFDEF OP_OVERLOAD}
  39.       bd.position.SetValue(0.0, -10.0);
  40.       {$ELSE}
  41.       SetValue(bd.position, 0.0, -10.0);
  42.       {$ENDIF}
  43.       m_world.CreateBody(bd).CreateShape(sd);
  44.    end;
  45.    sds[0] := Tb2PolygonDef.Create;
  46.    sds[0].vertexCount := 3;
  47.    {$IFDEF OP_OVERLOAD}
  48.    sds[0].vertices[0].SetValue(-0.5, 0.0);
  49.    sds[0].vertices[1].SetValue(0.5, 0.0);
  50.    sds[0].vertices[2].SetValue(0.0, 1.5);
  51.    {$ELSE}
  52.    SetValue(sds[0].vertices[0], -0.5, 0.0);
  53.    SetValue(sds[0].vertices[1], 0.5, 0.0);
  54.    SetValue(sds[0].vertices[2], 0.0, 1.5);
  55.    {$ENDIF}
  56.    sds[0].density := 1.0;
  57.    sds[0].friction := 0.3;
  58.    sds[0].filter.categoryBits := $0002;
  59.    //sds[0].maskBits := 0x0003;
  60.    sds[1] := Tb2PolygonDef.Create;
  61.    sds[1].vertexCount := 3;
  62.    {$IFDEF OP_OVERLOAD}
  63.    sds[1].vertices[0].SetValue(-0.1, 0.0);
  64.    sds[1].vertices[1].SetValue(0.1, 0.0);
  65.    sds[1].vertices[2].SetValue(0.0, 1.5);
  66.    {$ELSE}
  67.    SetValue(sds[1].vertices[0], -0.1, 0.0);
  68.    SetValue(sds[1].vertices[1], 0.1, 0.0);
  69.    SetValue(sds[1].vertices[2], 0.0, 1.5);
  70.    {$ENDIF}
  71.    sds[1].density := 1.0;
  72.    sds[1].friction := 0.3;
  73.    sds[1].filter.categoryBits := $0004;
  74.    sds[2] := Tb2PolygonDef.Create;
  75.    sds[2].vertexCount := 8;
  76.    w := 1.0;
  77.    b := w / (2.0 + Sqrt(2.0));
  78.    s := Sqrt(2.0) * b;
  79.    {$IFDEF OP_OVERLOAD}
  80.    sds[2].vertices[0].SetValue(0.5 * s, 0.0);
  81.    sds[2].vertices[1].SetValue(0.5 * w, b);
  82.    sds[2].vertices[2].SetValue(0.5 * w, b + s);
  83.    sds[2].vertices[3].SetValue(0.5 * s, w);
  84.    sds[2].vertices[4].SetValue(-0.5 * s, w);
  85.    sds[2].vertices[5].SetValue(-0.5 * w, b + s);
  86.    sds[2].vertices[6].SetValue(-0.5 * w, b);
  87.    sds[2].vertices[7].SetValue(-0.5 * s, 0.0);
  88.    {$ELSE}
  89.    SetValue(sds[2].vertices[0], 0.5 * s, 0.0);
  90.    SetValue(sds[2].vertices[1], 0.5 * w, b);
  91.    SetValue(sds[2].vertices[2], 0.5 * w, b + s);
  92.    SetValue(sds[2].vertices[3], 0.5 * s, w);
  93.    SetValue(sds[2].vertices[4], -0.5 * s, w);
  94.    SetValue(sds[2].vertices[5], -0.5 * w, b + s);
  95.    SetValue(sds[2].vertices[6], -0.5 * w, b);
  96.    SetValue(sds[2].vertices[7], -0.5 * s, 0.0);
  97.    {$ENDIF}
  98.    sds[2].density := 1.0;
  99.    sds[2].friction := 0.3;
  100.    sds[2].filter.categoryBits := $0004;
  101.    sds[3] := Tb2PolygonDef.Create;
  102.    sds[3].vertexCount := 4;
  103.    {$IFDEF OP_OVERLOAD}
  104.    sds[3].vertices[0].SetValue(-0.5, 0.0);
  105.    sds[3].vertices[1].SetValue(0.5, 0.0);
  106.    sds[3].vertices[2].SetValue(0.5, 1.0);
  107.    sds[3].vertices[3].SetValue(-0.5, 1.0);
  108.    {$ELSE}
  109.    SetValue(sds[3].vertices[0], -0.5, 0.0);
  110.    SetValue(sds[3].vertices[1], 0.5, 0.0);
  111.    SetValue(sds[3].vertices[2], 0.5, 1.0);
  112.    SetValue(sds[3].vertices[3], -0.5, 1.0);
  113.    {$ENDIF}
  114.    sds[3].density := 1.0;
  115.    sds[3].friction := 0.3;
  116.    sds[3].filter.categoryBits := $0004;
  117.    circleDef := Tb2CircleDef.Create;
  118.    circleDef.radius := 0.5;
  119.    circleDef.density := 1.0;
  120.    bodyIndex := 0;
  121. end;
  122. destructor TPolyShapes.Destroy;
  123. begin
  124.    sds[0].Free;
  125.    sds[1].Free;
  126.    sds[2].Free;
  127.    sds[3].Free;
  128.    circleDef.Free;
  129.    inherited;
  130. end;
  131. procedure TPolyShapes.Step(var settings: TSettings; timeStep: Float);
  132. begin
  133.    inherited;
  134.    DrawText('Press 1-5 to drop stuff. D to destroy bodies.');
  135. end;
  136. procedure TPolyShapes.CreateBody(index: Int32);
  137. var
  138.    bd: Tb2BodyDef;
  139. begin
  140.    if Assigned(bodies[bodyIndex]) then
  141.    begin
  142.       m_world.DestroyBody(bodies[bodyIndex]);
  143.       bodies[bodyIndex] := nil;
  144.    end;
  145.    bd := Tb2BodyDef.Create;
  146.    {$IFDEF OP_OVERLOAD}
  147.    bd.position.SetValue(RandomRange(-200, 200) / 100, 10.0);
  148.    {$ELSE}
  149.    SetValue(bd.position, RandomRange(-200, 200) / 100, 10.0);
  150.    {$ENDIF}
  151.    bd.angle := RandomRange(Round(-Pi) * 100, Round(Pi) * 100) / 100;
  152.    if index = 4 then
  153.       bd.angularDamping := 0.02;
  154.    bodies[bodyIndex] := m_world.CreateBody(bd);
  155.    if index < 4 then
  156.       bodies[bodyIndex].CreateShape(sds[index], False)
  157.    else
  158.       bodies[bodyIndex].CreateShape(circleDef, False);
  159.    bodies[bodyIndex].SetMassFromShapes;
  160.    bodyIndex := (bodyIndex + 1) mod k_maxBodies;
  161. end;
  162. procedure TPolyShapes.DestroyBody;
  163. var
  164.    i: Integer;
  165. begin
  166.    for i := 0 to k_maxBodies - 1 do
  167.       if Assigned(bodies[i]) then
  168.       begin
  169.          m_world.DestroyBody(bodies[i]);
  170.          bodies[i] := nil;
  171.          Exit;
  172.       end;
  173. end;
  174. procedure TPolyShapes.Keyboard(key: Byte);
  175. begin
  176.    case key of
  177.       49, 50, 51, 52, 53{1~5}:
  178.          CreateBody(key - 49);
  179.       68{D}: DestroyBody;
  180.    end;
  181. end;
  182. initialization
  183.    RegisterTestEntry('Poly Shapes', TPolyShapes);
  184. end.