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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UTimeOfImpact;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TTimeOfImpact = class(TTester)
  8.    public
  9.       m_body1, m_body2: Tb2body;
  10.       m_shape1: Tb2Shape;
  11.       m_shape2: Tb2PolygonShape;
  12.       constructor Create; override;
  13.       procedure Step(var settings: TSettings; timeStep: Float); override;
  14.    end;
  15.    TTimeOfImpact2 = class(TTester)
  16.    public
  17.       down, up: Tb2Body;
  18.       bullets: array[0..2] of Tb2Body;
  19.       bullet2: Tb2Body;
  20.       constructor Create; override;
  21.       procedure Step(var settings: TSettings; timeStep: Float); override;
  22.    end;
  23. implementation
  24. { TTimeOfImpact }
  25. constructor TTimeOfImpact.Create;
  26. var
  27.    sd: Tb2PolygonDef;
  28.    bd: Tb2BodyDef;
  29. begin
  30.    inherited;
  31.    sd := Tb2PolygonDef.Create;
  32.    sd.density := 0.0;
  33.    sd.SetAsBox(0.1, 10.0, MakeVector(10.0, 0.0), 0.0);
  34.    bd := Tb2BodyDef.Create;
  35.    {$IFDEF OP_OVERLOAD}
  36.    bd.position.SetValue(0.0, 20.0);
  37.    {$ELSE}
  38.    SetValue(bd.position, 0.0, 20.0);
  39.    {$ENDIF}
  40.    bd.angle := 0.0;
  41.    m_body1 := m_world.CreateBody(bd);
  42.    m_shape1 := m_body1.CreateShape(sd);
  43.    sd := Tb2PolygonDef.Create;
  44.    sd.SetAsBox(0.25, 0.25);
  45.    sd.density := 1.0;
  46.    bd := Tb2BodyDef.Create;
  47.    {$IFDEF OP_OVERLOAD}
  48.    bd.position.SetValue(9.6363468, 28.050615);
  49.    {$ELSE}
  50.    SetValue(bd.position, 9.6363468, 28.050615);
  51.    {$ENDIF}
  52.    bd.angle := 1.6408679;
  53.    m_body2 := m_world.CreateBody(bd);
  54.    m_shape2 := Tb2PolygonShape(m_body2.CreateShape(sd));
  55.    m_body2.SetMassFromShapes;
  56. end;
  57. procedure TTimeOfImpact.Step(var settings: TSettings; timeStep: Float);
  58. const
  59.    clVertices: RGBA = (0.5, 0.7, 0.9, 1.0);
  60.    clCoreVertices: RGBA = (0.5, 0.9, 0.7, 1.0);
  61. var
  62.    i: Integer;
  63.    sweep1, sweep2: Tb2Sweep;
  64.    toi: Float;
  65.    xf2: Tb2XForm;
  66.    vertices: Tb2PolyVertices;
  67. begin
  68.    settings.pause := True;
  69.    inherited;
  70.    settings.pause := False;
  71.    {$IFDEF OP_OVERLOAD}
  72.    sweep1.c0.SetValue(0.0, 20.0);
  73.    {$ELSE}
  74.    SetValue(sweep1.c0, 0.0, 20.0);
  75.    {$ENDIF}
  76.    sweep1.a0 := 0.0;
  77.    sweep1.c := sweep1.c0;
  78.    sweep1.a := sweep1.a0;
  79.    sweep1.t0 := 0.0;
  80.    sweep1.localCenter := m_body1.GetLocalCenter;
  81.    {$IFDEF OP_OVERLOAD}
  82.    sweep2.c0.SetValue(9.6363468, 28.050615);
  83.    sweep2.c := sweep2.c0 + MakeVector(-0.075121880, 0.27358246);
  84.    {$ELSE}
  85.    SetValue(sweep2.c0, 9.6363468, 28.050615);
  86.    sweep2.c := Add(sweep2.c0, MakeVector(-0.075121880, 0.27358246));
  87.    {$ENDIF}
  88.    sweep2.a0 := 1.6408679;
  89.    sweep2.a := sweep2.a0 - 10.434675;
  90.    sweep2.t0 := 0.0;
  91.    sweep2.localCenter := m_body2.GetLocalCenter;
  92.    toi := b2TimeOfImpact(m_shape1, m_shape2, sweep1, sweep2);
  93.    DrawText(Format('toi := %g', [toi]));
  94.    {$IFDEF OP_OVERLOAD}
  95.    sweep2.GetXForm(xf2, toi);
  96.    {$ELSE}
  97.    GetXForm(sweep2, xf2, toi);
  98.    {$ENDIF}
  99.    for i := 0 to m_shape2.GetVertexCount - 1 do
  100.       vertices[i] := b2Mul(xf2, m_shape2.m_vertices[i]);
  101.    m_debugDrawer.DrawPolygon(vertices, m_shape2.GetVertexCount, clVertices);
  102.    for i := 0 to m_shape2.GetVertexCount - 1 do
  103.       vertices[i] := b2Mul(xf2, m_shape2.m_coreVertices[i]);
  104.    m_debugDrawer.DrawPolygon(vertices, m_shape2.GetVertexCount, clCoreVertices);
  105. end;
  106. { TTimeOfImpact2 }
  107. constructor TTimeOfImpact2.Create;
  108. var
  109.    i: Integer;
  110.    pd: Tb2PolygonDef;
  111.    bd: Tb2BodyDef;
  112.    cd: Tb2CircleDef;
  113. begin
  114.    inherited;
  115.    pd := Tb2PolygonDef.Create;
  116.    bd := Tb2BodyDef.Create;
  117.    pd.SetAsBox(10, 0.1, MakeVector(-10, -5), 0);
  118.    {$IFDEF OP_OVERLOAD}
  119.    bd.position.SetValue(-10, -5);
  120.    {$ELSE}
  121.    SetValue(bd.position, -10, -5);
  122.    {$ENDIF}
  123.    down := m_world.CreateBody(bd, False);
  124.    down.CreateShape(pd, False);
  125.    pd.SetAsBox(10, 0.1, MakeVector(-10, 0), 0);
  126.    {$IFDEF OP_OVERLOAD}
  127.    bd.position.SetValue(-10, 0);
  128.    {$ELSE}
  129.    SetValue(bd.position, -10, 0);
  130.    {$ENDIF}
  131.    up := m_world.CreateBody(bd);
  132.    up.CreateShape(pd);
  133.    bd := Tb2BodyDef.Create;
  134.    bd.isBullet := True;
  135.    cd := Tb2CircleDef.Create;
  136.    cd.radius := 0.25;
  137.    cd.density := 15.0;
  138.    cd.restitution := 1.5;
  139.    {$IFDEF OP_OVERLOAD}
  140.    bd.position.SetValue(-20, -3.0);
  141.    {$ELSE}
  142.    SetValue(bd.position, -20, -3.0);
  143.    {$ENDIF}
  144.    for i := 0 to 2 do
  145.    begin
  146.       bullets[i] := m_world.CreateBody(bd, False);
  147.       bullets[i].SetLinearVelocity(MakeVector(0.0, 0.0));
  148.       bullets[i].CreateShape(cd, False);
  149.       bullets[i].SetMassFromShapes;
  150.    end;
  151.    bd.Free;
  152.    cd.Free;
  153.    //////////////////////////////////////
  154.    pd := Tb2PolygonDef.Create;
  155.    bd := Tb2BodyDef.Create;
  156.    pd.SetAsBox(10, 5, MakeVector(10, -5), 0);
  157.    {$IFDEF OP_OVERLOAD}
  158.    bd.position.SetValue(10, -5);
  159.    {$ELSE}
  160.    SetValue(bd.position, 10, -5);
  161.    {$ENDIF}
  162.    down := m_world.CreateBody(bd);
  163.    down.CreateShape(pd, False);
  164.    bd := Tb2BodyDef.Create;
  165.    {$IFDEF OP_OVERLOAD}
  166.    bd.position.SetValue(20, 20);
  167.    {$ELSE}
  168.    SetValue(bd.position, 20, 20);
  169.    {$ENDIF}
  170.    bd.isBullet := True;
  171.    cd := Tb2CircleDef.Create;
  172.    cd.radius := 0.25;
  173.    cd.density := 15.0;
  174.    bullet2 := m_world.CreateBody(bd);
  175.    bullet2.SetLinearVelocity(MakeVector(0.0, -500.0));
  176.    bullet2.CreateShape(cd);
  177.    bullet2.SetMassFromShapes;
  178. end;
  179. procedure TTimeOfImpact2.Step(var settings: TSettings; timeStep: Float);
  180. begin
  181.    inherited;
  182.    DrawText('Switch Time of Impact and Position Correction options and reset the scene.');
  183.    if m_world.m_continuousPhysics then
  184.       DrawText('TOI ON')
  185.    else
  186.       DrawText('TOI OFF');
  187.    if m_world.m_positionCorrection then
  188.       DrawText('Position Correction ON')
  189.    else
  190.       DrawText('Position Correction OFF');
  191. end;
  192. initialization
  193.    RegisterTestEntry('Time of Impact', TTimeOfImpact);
  194.    RegisterTestEntry('Time of Impact2', TTimeOfImpact2);
  195. end.