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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UWeb;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TWeb = class(TTester)
  8.    public
  9.       m_bodies: array[0..3] of Tb2Body;
  10.       m_joints: array[0..7] of Tb2Joint;
  11.       constructor Create; override;
  12.       procedure Step(var settings: TSettings; timeStep: Float); override;
  13.       procedure Keyboard(key: Byte); override;
  14.       procedure JointDestroyed(joint: Tb2Joint); override;
  15.    end;
  16. implementation
  17. { TWeb }
  18. constructor TWeb.Create;
  19. var
  20.    ground: Tb2Body;
  21.    sd: Tb2PolygonDef;
  22.    bd: Tb2BodyDef;
  23.    jd: Tb2DistanceJointDef;
  24.    p1, p2, d: TVector2;
  25. begin
  26.    inherited;
  27.    begin
  28.      sd := Tb2PolygonDef.Create;
  29.      sd.SetAsBox(50.0, 10.0);
  30.      bd := Tb2BodyDef.Create;
  31.      {$IFDEF OP_OVERLOAD}
  32.      bd.position.SetValue(0.0, -10.0);
  33.      {$ELSE}
  34.      SetValue(bd.position, 0.0, -10.0);
  35.      {$ENDIF}
  36.      ground := m_world.CreateBody(bd);
  37.      ground.CreateShape(sd);
  38.    end;
  39.    begin
  40.       sd := Tb2PolygonDef.Create;
  41.       sd.SetAsBox(0.5, 0.5);
  42.       sd.density := 5.0;
  43.       sd.friction := 0.2;
  44.       bd := Tb2BodyDef.Create;
  45.       {$IFDEF OP_OVERLOAD}
  46.       bd.position.SetValue(-5.0, 5.0);
  47.       {$ELSE}
  48.       SetValue(bd.position, -5.0, 5.0);
  49.       {$ENDIF}
  50.       m_bodies[0] := m_world.CreateBody(bd, False);
  51.       m_bodies[0].CreateShape(sd, False);
  52.       m_bodies[0].SetMassFromShapes;
  53.       {$IFDEF OP_OVERLOAD}
  54.       bd.position.SetValue(5.0, 5.0);
  55.       {$ELSE}
  56.       SetValue(bd.position, 5.0, 5.0);
  57.       {$ENDIF}
  58.       m_bodies[1] := m_world.CreateBody(bd, False);
  59.       m_bodies[1].CreateShape(sd, False);
  60.       m_bodies[1].SetMassFromShapes;
  61.       {$IFDEF OP_OVERLOAD}
  62.       bd.position.SetValue(5.0, 15.0);
  63.       {$ELSE}
  64.       SetValue(bd.position, 5.0, 15.0);
  65.       {$ENDIF}
  66.       m_bodies[2] := m_world.CreateBody(bd, False);
  67.       m_bodies[2].CreateShape(sd, False);
  68.       m_bodies[2].SetMassFromShapes;
  69.       {$IFDEF OP_OVERLOAD}
  70.       bd.position.SetValue(-5.0, 15.0);
  71.       {$ELSE}
  72.       SetValue(bd.position, -5.0, 15.0);
  73.       {$ENDIF}
  74.       m_bodies[3] := m_world.CreateBody(bd);
  75.       m_bodies[3].CreateShape(sd);
  76.       m_bodies[3].SetMassFromShapes;
  77.       jd := Tb2DistanceJointDef.Create;
  78.       jd.frequencyHz := 4.0;
  79.       jd.dampingRatio := 0.5;
  80.       jd.body1 := ground;
  81.       jd.body2 := m_bodies[0];
  82.       {$IFDEF OP_OVERLOAD}
  83.       jd.localAnchor1.SetValue(-10.0, 10.0);
  84.       jd.localAnchor2.SetValue(-0.5, -0.5);
  85.       {$ELSE}
  86.       SetValue(jd.localAnchor1, -10.0, 10.0);
  87.       SetValue(jd.localAnchor2, -0.5, -0.5);
  88.       {$ENDIF}
  89.       p1 := jd.body1.GetWorldPoint(jd.localAnchor1);
  90.       p2 := jd.body2.GetWorldPoint(jd.localAnchor2);
  91.       {$IFDEF OP_OVERLOAD}
  92.       d := p2 - p1;
  93.       jd.length := d.Length;
  94.       {$ELSE}
  95.       d := Subtract(p2, p1);
  96.       jd.length := Length(d);
  97.       {$ENDIF}
  98.       m_joints[0] := m_world.CreateJoint(jd, False);
  99.       jd.body1 := ground;
  100.       jd.body2 := m_bodies[1];
  101.       {$IFDEF OP_OVERLOAD}
  102.       jd.localAnchor1.SetValue(10.0, 10.0);
  103.       jd.localAnchor2.SetValue(0.5, -0.5);
  104.       {$ELSE}
  105.       SetValue(jd.localAnchor1, 10.0, 10.0);
  106.       SetValue(jd.localAnchor2, 0.5, -0.5);
  107.       {$ENDIF}
  108.       p1 := jd.body1.GetWorldPoint(jd.localAnchor1);
  109.       p2 := jd.body2.GetWorldPoint(jd.localAnchor2);
  110.       {$IFDEF OP_OVERLOAD}
  111.       d := p2 - p1;
  112.       jd.length := d.Length;
  113.       {$ELSE}
  114.       d := Subtract(p2, p1);
  115.       jd.length := Length(d);
  116.       {$ENDIF}
  117.       m_joints[1] := m_world.CreateJoint(jd, False);
  118.       jd.body1 := ground;
  119.       jd.body2 := m_bodies[2];
  120.       {$IFDEF OP_OVERLOAD}
  121.       jd.localAnchor1.SetValue(10.0, 30.0);
  122.       jd.localAnchor2.SetValue(0.5, 0.5);
  123.       {$ELSE}
  124.       SetValue(jd.localAnchor1, 10.0, 30.0);
  125.       SetValue(jd.localAnchor2, 0.5, 0.5);
  126.       {$ENDIF}
  127.       p1 := jd.body1.GetWorldPoint(jd.localAnchor1);
  128.       p2 := jd.body2.GetWorldPoint(jd.localAnchor2);
  129.       {$IFDEF OP_OVERLOAD}
  130.       d := p2 - p1;
  131.       jd.length := d.Length;
  132.       {$ELSE}
  133.       d := Subtract(p2, p1);
  134.       jd.length := Length(d);
  135.       {$ENDIF}
  136.       m_joints[2] := m_world.CreateJoint(jd, False);
  137.       jd.body1 := ground;
  138.       jd.body2 := m_bodies[3];
  139.       {$IFDEF OP_OVERLOAD}
  140.       jd.localAnchor1.SetValue(-10.0, 30.0);
  141.       jd.localAnchor2.SetValue(-0.5, 0.5);
  142.       {$ELSE}
  143.       SetValue(jd.localAnchor1, -10.0, 30.0);
  144.       SetValue(jd.localAnchor2, -0.5, 0.5);
  145.       {$ENDIF}
  146.       p1 := jd.body1.GetWorldPoint(jd.localAnchor1);
  147.       p2 := jd.body2.GetWorldPoint(jd.localAnchor2);
  148.       {$IFDEF OP_OVERLOAD}
  149.       d := p2 - p1;
  150.       jd.length := d.Length;
  151.       {$ELSE}
  152.       d := Subtract(p2, p1);
  153.       jd.length := Length(d);
  154.       {$ENDIF}
  155.       m_joints[3] := m_world.CreateJoint(jd, False);
  156.       jd.body1 := m_bodies[0];
  157.       jd.body2 := m_bodies[1];
  158.       {$IFDEF OP_OVERLOAD}
  159.       jd.localAnchor1.SetValue(0.5, 0.0);
  160.       jd.localAnchor2.SetValue(-0.5, 0.0);
  161.       {$ELSE}
  162.       SetValue(jd.localAnchor1, 0.5, 0.0);
  163.       SetValue(jd.localAnchor2, -0.5, 0.0);
  164.       {$ENDIF}
  165.       p1 := jd.body1.GetWorldPoint(jd.localAnchor1);
  166.       p2 := jd.body2.GetWorldPoint(jd.localAnchor2);
  167.       {$IFDEF OP_OVERLOAD}
  168.       d := p2 - p1;
  169.       jd.length := d.Length;
  170.       {$ELSE}
  171.       d := Subtract(p2, p1);
  172.       jd.length := Length(d);
  173.       {$ENDIF}
  174.       m_joints[4] := m_world.CreateJoint(jd, False);
  175.       jd.body1 := m_bodies[1];
  176.       jd.body2 := m_bodies[2];
  177.       {$IFDEF OP_OVERLOAD}
  178.       jd.localAnchor1.SetValue(0.0, 0.5);
  179.       jd.localAnchor2.SetValue(0.0, -0.5);
  180.       {$ELSE}
  181.       SetValue(jd.localAnchor1, 0.0, 0.5);
  182.       SetValue(jd.localAnchor2, 0.0, -0.5);
  183.       {$ENDIF}
  184.       p1 := jd.body1.GetWorldPoint(jd.localAnchor1);
  185.       p2 := jd.body2.GetWorldPoint(jd.localAnchor2);
  186.       {$IFDEF OP_OVERLOAD}
  187.       d := p2 - p1;
  188.       jd.length := d.Length;
  189.       {$ELSE}
  190.       d := Subtract(p2, p1);
  191.       jd.length := Length(d);
  192.       {$ENDIF}
  193.       m_joints[5] := m_world.CreateJoint(jd, False);
  194.       jd.body1 := m_bodies[2];
  195.       jd.body2 := m_bodies[3];
  196.       {$IFDEF OP_OVERLOAD}
  197.       jd.localAnchor1.SetValue(-0.5, 0.0);
  198.       jd.localAnchor2.SetValue(0.5, 0.0);
  199.       {$ELSE}
  200.       SetValue(jd.localAnchor1, -0.5, 0.0);
  201.       SetValue(jd.localAnchor2, 0.5, 0.0);
  202.       {$ENDIF}
  203.       p1 := jd.body1.GetWorldPoint(jd.localAnchor1);
  204.       p2 := jd.body2.GetWorldPoint(jd.localAnchor2);
  205.       {$IFDEF OP_OVERLOAD}
  206.       d := p2 - p1;
  207.       jd.length := d.Length;
  208.       {$ELSE}
  209.       d := Subtract(p2, p1);
  210.       jd.length := Length(d);
  211.       {$ENDIF}
  212.       m_joints[6] := m_world.CreateJoint(jd, False);
  213.       jd.body1 := m_bodies[3];
  214.       jd.body2 := m_bodies[0];
  215.       {$IFDEF OP_OVERLOAD}
  216.       jd.localAnchor1.SetValue(0.0, -0.5);
  217.       jd.localAnchor2.SetValue(0.0, 0.5);
  218.       {$ELSE}
  219.       SetValue(jd.localAnchor1, 0.0, -0.5);
  220.       SetValue(jd.localAnchor2, 0.0, 0.5);
  221.       {$ENDIF}
  222.       p1 := jd.body1.GetWorldPoint(jd.localAnchor1);
  223.       p2 := jd.body2.GetWorldPoint(jd.localAnchor2);
  224.       {$IFDEF OP_OVERLOAD}
  225.       d := p2 - p1;
  226.       jd.length := d.Length;
  227.       {$ELSE}
  228.       d := Subtract(p2, p1);
  229.       jd.length := Length(d);
  230.       {$ENDIF}
  231.       m_joints[7] := m_world.CreateJoint(jd);
  232.    end;
  233. end;
  234. procedure TWeb.Step(var settings: TSettings; timeStep: Float);
  235. begin
  236.    inherited;
  237.  DrawText('This demonstrates a soft distance joint.');
  238.  DrawText('Press: (b) to delete a body, (j) to delete a joint');
  239. end;
  240. procedure TWeb.Keyboard(key: Byte);
  241. var
  242.    i: Integer;
  243. begin
  244.    case key of
  245.       66{B}:
  246.          begin
  247.             for i := 0 to 3 do
  248.               if Assigned(m_bodies[i]) then
  249.               begin
  250.                  m_world.DestroyBody(m_bodies[i]);
  251.                  m_bodies[i] := nil;
  252.                  Break;
  253.               end;
  254.          end;
  255.       74{J}:
  256.          begin
  257.             for i := 0 to 7 do
  258.               if Assigned(m_joints[i]) then
  259.               begin
  260.                  m_world.DestroyJoint(m_joints[i]);
  261.                  m_joints[i] := nil;
  262.                  Break;
  263.               end;
  264.          end;
  265.    end;
  266. end;
  267. procedure TWeb.JointDestroyed(joint: Tb2Joint);
  268. var
  269.    i: Integer;
  270. begin
  271.    for i := 0 to 7 do
  272.      if m_joints[i] = joint then
  273.      begin
  274.         m_joints[i] := nil;
  275.         Break;
  276.      end;
  277. end;
  278. initialization
  279.    RegisterTestEntry('Web', TWeb);
  280. end.