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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UDominos;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TDominos = class(TTester)
  8.    public
  9.       constructor Create; override;
  10.    end;
  11. implementation
  12. { TDominos }
  13. constructor TDominos.Create;
  14. var
  15.    i: Integer;
  16.    b1, b2, b3, b4, b5, b6, b7, ground, body: Tb2Body;
  17.    sd: Tb2PolygonDef;
  18.    bd: Tb2BodyDef;
  19.    jd: Tb2RevoluteJointDef;
  20.    djd: Tb2DistanceJointDef;
  21.    d: TVector2;
  22.    cd: Tb2CircleDef;
  23. begin
  24.    inherited;
  25.    begin
  26.       sd := Tb2PolygonDef.Create;
  27.       sd.SetAsBox(50.0, 10.0);
  28.       bd := Tb2BodyDef.Create;
  29.       {$IFDEF OP_OVERLOAD}
  30.       bd.position.SetValue(0.0, -10.0);
  31.       {$ELSE}
  32.       SetValue(bd.position, 0.0, -10.0);
  33.       {$ENDIF}
  34.       b1 := m_world.CreateBody(bd);
  35.       b1.CreateShape(sd);
  36.    end;
  37.    begin
  38.       sd := Tb2PolygonDef.Create;
  39.       sd.SetAsBox(6.0, 0.25);
  40.       bd := Tb2BodyDef.Create;
  41.       {$IFDEF OP_OVERLOAD}
  42.       bd.position.SetValue(-1.5, 10.0);
  43.       {$ELSE}
  44.       SetValue(bd.position, -1.5, 10.0);
  45.       {$ENDIF}
  46.       ground := m_world.CreateBody(bd);
  47.       ground.CreateShape(sd);
  48.    end;
  49.    begin
  50.       sd := Tb2PolygonDef.Create;
  51.       sd.SetAsBox(0.1, 1.0);
  52.       sd.density := 20.0;
  53.       sd.friction := 0.1;
  54.       bd := Tb2BodyDef.Create;
  55.       for i := 0 to 9 do
  56.       begin
  57.          {$IFDEF OP_OVERLOAD}
  58.          bd.position.SetValue(-6.0 + 1.0 * i, 11.25);
  59.          {$ELSE}
  60.          SetValue(bd.position, -6.0 + 1.0 * i, 11.25);
  61.          {$ENDIF}
  62.          body := m_world.CreateBody(bd, False);
  63.          body.CreateShape(sd, False);
  64.          body.SetMassFromShapes;
  65.       end;
  66.       sd.Free;
  67.       bd.Free;
  68.    end;
  69.    begin
  70.       sd := Tb2PolygonDef.Create;
  71.       sd.SetAsBox(7.0, 0.25, b2Vec2_zero, 0.3);
  72.       bd := Tb2BodyDef.Create;
  73.       {$IFDEF OP_OVERLOAD}
  74.       bd.position.SetValue(1.0, 6.0);
  75.       {$ELSE}
  76.       SetValue(bd.position, 1.0, 6.0);
  77.       {$ENDIF}
  78.       ground := m_world.CreateBody(bd);
  79.       ground.CreateShape(sd);
  80.    end;
  81.    begin
  82.       sd := Tb2PolygonDef.Create;
  83.       sd.SetAsBox(0.25, 1.5);
  84.       bd := Tb2BodyDef.Create;
  85.       {$IFDEF OP_OVERLOAD}
  86.       bd.position.SetValue(-7.0, 4.0);
  87.       {$ELSE}
  88.       SetValue(bd.position, -7.0, 4.0);
  89.       {$ENDIF}
  90.       b2 := m_world.CreateBody(bd);
  91.       b2.CreateShape(sd);
  92.    end;
  93.    begin
  94.       sd := Tb2PolygonDef.Create;
  95.       sd.SetAsBox(6.0, 0.125);
  96.       sd.density := 10.0;
  97.       bd := Tb2BodyDef.Create;
  98.       {$IFDEF OP_OVERLOAD}
  99.       bd.position.SetValue(-0.9, 1.0);
  100.       {$ELSE}
  101.       SetValue(bd.position, -0.9, 1.0);
  102.       {$ENDIF}
  103.       bd.angle := -0.15;
  104.       b3 := m_world.CreateBody(bd);
  105.       b3.CreateShape(sd);
  106.       b3.SetMassFromShapes;
  107.    end;
  108.    jd := Tb2RevoluteJointDef.Create;
  109.    jd.Initialize(b1, b3, MakeVector(-2.0, 1.0));
  110.    jd.collideConnected := True;
  111.    m_world.CreateJoint(jd, False);
  112.    begin
  113.       sd := Tb2PolygonDef.Create;
  114.       sd.SetAsBox(0.25, 0.25);
  115.       sd.density := 10.0;
  116.       bd := Tb2BodyDef.Create;
  117.       {$IFDEF OP_OVERLOAD}
  118.       bd.position.SetValue(-10.0, 15.0);
  119.       {$ELSE}
  120.       SetValue(bd.position, -10.0, 15.0);
  121.       {$ENDIF}
  122.       b4 := m_world.CreateBody(bd);
  123.       b4.CreateShape(sd);
  124.       b4.SetMassFromShapes;
  125.    end;
  126.    jd.Initialize(b2, b4, MakeVector(-7.0, 15.0));
  127.    m_world.CreateJoint(jd, False);
  128.    begin
  129.       bd := Tb2BodyDef.Create;
  130.       {$IFDEF OP_OVERLOAD}
  131.       bd.position.SetValue(6.5, 3.0);
  132.       {$ELSE}
  133.       SetValue(bd.position, 6.5, 3.0);
  134.       {$ENDIF}
  135.       b5 := m_world.CreateBody(bd);
  136.       sd := Tb2PolygonDef.Create;
  137.       sd.density := 10.0;
  138.       sd.friction := 0.1;
  139.       sd.SetAsBox(1.0, 0.1, MakeVector(0.0, -0.9), 0.0);
  140.       b5.CreateShape(sd, False);
  141.       sd.SetAsBox(0.1, 1.0, MakeVector(-0.9, 0.0), 0.0);
  142.       b5.CreateShape(sd, False);
  143.       sd.SetAsBox(0.1, 1.0, MakeVector(0.9, 0.0), 0.0);
  144.       b5.CreateShape(sd);
  145.       b5.SetMassFromShapes;
  146.    end;
  147.    jd.Initialize(b1, b5, MakeVector(6.0, 2.0));
  148.    m_world.CreateJoint(jd, False);
  149.    begin
  150.      sd := Tb2PolygonDef.Create;
  151.      sd.SetAsBox(1.0, 0.1);
  152.      sd.density := 30.0;
  153.      sd.friction := 0.2;
  154.      bd := Tb2BodyDef.Create;
  155.      {$IFDEF OP_OVERLOAD}
  156.      bd.position.SetValue(6.5, 4.1);
  157.      {$ELSE}
  158.      SetValue(bd.position, 6.5, 4.1);
  159.      {$ENDIF}
  160.      b6 := m_world.CreateBody(bd);
  161.      b6.CreateShape(sd);
  162.      b6.SetMassFromShapes;
  163.    end;
  164.    jd.Initialize(b5, b6, MakeVector(7.5, 4.0));
  165.    m_world.CreateJoint(jd);
  166.    begin
  167.      sd := Tb2PolygonDef.Create;
  168.      sd.SetAsBox(0.1, 1.0);
  169.      sd.density := 10.0;
  170.      bd := Tb2BodyDef.Create;
  171.      {$IFDEF OP_OVERLOAD}
  172.      bd.position.SetValue(7.4, 1.0);
  173.      {$ELSE}
  174.      SetValue(bd.position, 7.4, 1.0);
  175.      {$ENDIF}
  176.      b7 := m_world.CreateBody(bd);
  177.      b7.CreateShape(sd);
  178.      b7.SetMassFromShapes;
  179.    end;
  180.    djd := Tb2DistanceJointDef.Create;
  181.    djd.body1 := b3;
  182.    djd.body2 := b7;
  183.    {$IFDEF OP_OVERLOAD}
  184.    djd.localAnchor1.SetValue(6.0, 0.0);
  185.    djd.localAnchor2.SetValue(0.0, -1.0);
  186.    d := djd.body2.GetWorldPoint(djd.localAnchor2) - djd.body1.GetWorldPoint(djd.localAnchor1);
  187.    djd.length := d.Length;
  188.    {$ELSE}
  189.    SetValue(djd.localAnchor1, 6.0, 0.0);
  190.    SetValue(djd.localAnchor2, 0.0, -1.0);
  191.    d := Subtract(djd.body2.GetWorldPoint(djd.localAnchor2), djd.body1.GetWorldPoint(djd.localAnchor1));
  192.    djd.length := Length(d);
  193.    {$ENDIF}
  194.    m_world.CreateJoint(djd);
  195.    begin
  196.       cd := Tb2CircleDef.Create;
  197.       cd.radius := 0.2;
  198.       cd.density := 10.0;
  199.       bd := Tb2BodyDef.Create;
  200.       for i := 0 to 3 do
  201.       begin
  202.          {$IFDEF OP_OVERLOAD}
  203.          bd.position.SetValue(5.9 + 2.0 * cd.radius * i, 2.4);
  204.          {$ELSE}
  205.          SetValue(bd.position, 5.9 + 2.0 * cd.radius * i, 2.4); 
  206.          {$ENDIF}
  207.          body := m_world.CreateBody(bd, False);
  208.          body.CreateShape(cd, False);
  209.          body.SetMassFromShapes;
  210.       end;
  211.       cd.Free;
  212.       bd.Free;
  213.    end;
  214. end;
  215. initialization
  216.    RegisterTestEntry('Dominos', TDominos);
  217. end.