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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UContactCallback;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain,
  6.    UPhysics2DTypes,
  7.    UPhysics2D,
  8.    SysUtils,
  9.    Classes;
  10. type
  11.    TContactCallback = class(TTester)
  12.    public
  13.       m_ball, m_bullet: Tb2Body;
  14.       m_ball_shape: Tb2Shape;
  15.       m_strings: TStringList;
  16.       constructor Create; override;
  17.       destructor Destroy; override;
  18.       procedure Step(var settings: TSettings; timeStep: Float); override;
  19.    end;
  20. implementation
  21. { TContactCallback }
  22. constructor TContactCallback.Create;
  23. var
  24.    sd, cd: Tb2PolygonDef;
  25.    bd: Tb2BodyDef;
  26.    w, b, s: Float;
  27. begin
  28.    inherited;
  29.    m_strings := TStringList.Create;
  30.    sd := Tb2PolygonDef.Create;
  31.    sd.friction := 0;
  32.    sd.vertexCount := 3;
  33.    {$IFDEF OP_OVERLOAD}
  34.    sd.vertices[0].SetValue(10, 10);
  35.    sd.vertices[1].SetValue(9, 7);
  36.    sd.vertices[2].SetValue(10, 0);
  37.    {$ELSE}
  38.    SetValue(sd.vertices[0], 10, 10);
  39.    SetValue(sd.vertices[1], 9, 7);
  40.    SetValue(sd.vertices[2], 10, 0);
  41.    {$ENDIF}
  42.    m_world.GetGroundBody.CreateShape(sd, False);
  43.    {$IFDEF OP_OVERLOAD}
  44.    sd.vertices[0].SetValue(9, 7);
  45.    sd.vertices[1].SetValue(8, 0);
  46.    sd.vertices[2].SetValue(10, 0);
  47.    {$ELSE}
  48.    SetValue(sd.vertices[0], 9, 7);
  49.    SetValue(sd.vertices[1], 8, 0);
  50.    SetValue(sd.vertices[2], 10, 0);
  51.    {$ENDIF}
  52.    m_world.GetGroundBody.CreateShape(sd, False);
  53.    {$IFDEF OP_OVERLOAD}
  54.    sd.vertices[0].SetValue(9, 7);
  55.    sd.vertices[1].SetValue(8, 5);
  56.    sd.vertices[2].SetValue(8, 0);
  57.    {$ELSE}
  58.    SetValue( sd.vertices[0], 9, 7);
  59.    SetValue(sd.vertices[1], 8, 5);
  60.    SetValue(sd.vertices[2], 8, 0);
  61.    {$ENDIF}
  62.    m_world.GetGroundBody.CreateShape(sd, False);
  63.    {$IFDEF OP_OVERLOAD}
  64.    sd.vertices[0].SetValue(8, 5);
  65.    sd.vertices[1].SetValue(7, 4);
  66.    sd.vertices[2].SetValue(8, 0);
  67.    {$ELSE}
  68.    SetValue(sd.vertices[0], 8, 5);
  69.    SetValue(sd.vertices[1], 7, 4);
  70.    SetValue(sd.vertices[2], 8, 0);
  71.    {$ENDIF}
  72.    m_world.GetGroundBody.CreateShape(sd, False);
  73.    {$IFDEF OP_OVERLOAD}
  74.    sd.vertices[0].SetValue(7, 4);
  75.    sd.vertices[1].SetValue(5, 0);
  76.    sd.vertices[2].SetValue(8, 0);
  77.    {$ELSE}
  78.    SetValue(sd.vertices[0], 7, 4);
  79.    SetValue(sd.vertices[1], 5, 0);
  80.    SetValue(sd.vertices[2], 8, 0);
  81.    {$ENDIF}
  82.    m_world.GetGroundBody.CreateShape(sd, False);
  83.    {$IFDEF OP_OVERLOAD}
  84.    sd.vertices[0].SetValue(7, 4);
  85.    sd.vertices[1].SetValue(5, 3);
  86.    sd.vertices[2].SetValue(5, 0);
  87.    {$ELSE}
  88.    SetValue(sd.vertices[0], 7, 4);
  89.    SetValue(sd.vertices[1], 5, 3);
  90.    SetValue(sd.vertices[2], 5, 0);
  91.    {$ENDIF}
  92.    m_world.GetGroundBody.CreateShape(sd, False);
  93.    {$IFDEF OP_OVERLOAD}
  94.    sd.vertices[0].SetValue(5, 3);
  95.    sd.vertices[1].SetValue(2, 2);
  96.    sd.vertices[2].SetValue(5, 0);
  97.    {$ELSE}
  98.    SetValue(sd.vertices[0], 5, 3);
  99.    SetValue(sd.vertices[1], 2, 2);
  100.    SetValue(sd.vertices[2], 5, 0);
  101.    {$ENDIF}
  102.    m_world.GetGroundBody.CreateShape(sd, False);
  103.    {$IFDEF OP_OVERLOAD}
  104.    sd.vertices[0].SetValue(2, 2);
  105.    sd.vertices[1].SetValue(0, 0);
  106.    sd.vertices[2].SetValue(5, 0);
  107.    {$ELSE}
  108.    SetValue(sd.vertices[0], 2, 2);
  109.    SetValue(sd.vertices[1], 0, 0);
  110.    SetValue(sd.vertices[2], 5, 0);
  111.    {$ENDIF}
  112.    m_world.GetGroundBody.CreateShape(sd, False);
  113.    {$IFDEF OP_OVERLOAD}
  114.    sd.vertices[0].SetValue(2, 2);
  115.    sd.vertices[1].SetValue(-2, 2);
  116.    sd.vertices[2].SetValue(0, 0);
  117.    {$ELSE}
  118.    SetValue(sd.vertices[0], 2, 2);
  119.    SetValue(sd.vertices[1], -2, 2);
  120.    SetValue(sd.vertices[2], 0, 0);
  121.    {$ENDIF}
  122.    m_world.GetGroundBody.CreateShape(sd, False);
  123.    {$IFDEF OP_OVERLOAD}
  124.    sd.vertices[2].SetValue(-2, 2);
  125.    sd.vertices[1].SetValue(0, 0);
  126.    sd.vertices[0].SetValue(-5, 0);
  127.    {$ELSE}
  128.    SetValue(sd.vertices[2], -2, 2);
  129.    SetValue(sd.vertices[1], 0, 0);
  130.    SetValue(sd.vertices[0], -5, 0);
  131.    {$ENDIF}
  132.    m_world.GetGroundBody.CreateShape(sd, False);
  133.    {$IFDEF OP_OVERLOAD}
  134.    sd.vertices[2].SetValue(-5, 3);
  135.    sd.vertices[1].SetValue(-2, 2);
  136.    sd.vertices[0].SetValue(-5, 0);
  137.    {$ELSE}
  138.    SetValue(sd.vertices[2], -5, 3);
  139.    SetValue(sd.vertices[1], -2, 2);
  140.    SetValue(sd.vertices[0], -5, 0);
  141.    {$ENDIF}
  142.    m_world.GetGroundBody.CreateShape(sd, False);
  143.    {$IFDEF OP_OVERLOAD}
  144.    sd.vertices[2].SetValue(-7, 4);
  145.    sd.vertices[1].SetValue(-5, 3);
  146.    sd.vertices[0].SetValue(-5, 0);
  147.    {$ELSE}
  148.    SetValue(sd.vertices[2], -7, 4);
  149.    SetValue(sd.vertices[1], -5, 3);
  150.    SetValue(sd.vertices[0], -5, 0);
  151.    {$ENDIF}
  152.    m_world.GetGroundBody.CreateShape(sd, False);
  153.    {$IFDEF OP_OVERLOAD}
  154.    sd.vertices[2].SetValue(-7, 4);
  155.    sd.vertices[1].SetValue(-5, 0);
  156.    sd.vertices[0].SetValue(-8, 0);
  157.    {$ELSE}
  158.    SetValue(sd.vertices[2], -7, 4);
  159.    SetValue(sd.vertices[1], -5, 0);
  160.    SetValue(sd.vertices[0], -8, 0);
  161.    {$ENDIF}
  162.    m_world.GetGroundBody.CreateShape(sd, False);
  163.    {$IFDEF OP_OVERLOAD}
  164.    sd.vertices[2].SetValue(-8, 5);
  165.    sd.vertices[1].SetValue(-7, 4);
  166.    sd.vertices[0].SetValue(-8, 0);
  167.    {$ELSE}
  168.    SetValue(sd.vertices[2], -8, 5);
  169.    SetValue(sd.vertices[1], -7, 4);
  170.    SetValue(sd.vertices[0], -8, 0);
  171.    {$ENDIF}
  172.    m_world.GetGroundBody.CreateShape(sd, False);
  173.    {$IFDEF OP_OVERLOAD}
  174.    sd.vertices[2].SetValue(-9, 7);
  175.    sd.vertices[1].SetValue(-8, 5);
  176.    sd.vertices[0].SetValue(-8, 0);
  177.    {$ELSE}
  178.    SetValue(sd.vertices[2], -9, 7);
  179.    SetValue(sd.vertices[1], -8, 5);
  180.    SetValue(sd.vertices[0], -8, 0);
  181.    {$ENDIF}
  182.    m_world.GetGroundBody.CreateShape(sd, False);
  183.    {$IFDEF OP_OVERLOAD}
  184.    sd.vertices[2].SetValue(-9, 7);
  185.    sd.vertices[1].SetValue(-8, 0);
  186.    sd.vertices[0].SetValue(-10, 0);
  187.    {$ELSE}
  188.    SetValue(sd.vertices[2], -9, 7);
  189.    SetValue(sd.vertices[1], -8, 0);
  190.    SetValue(sd.vertices[0], -10, 0);
  191.    {$ENDIF}
  192.    m_world.GetGroundBody.CreateShape(sd, False);
  193.    {$IFDEF OP_OVERLOAD}
  194.    sd.vertices[2].SetValue(-10, 10);
  195.    sd.vertices[1].SetValue(-9, 7);
  196.    sd.vertices[0].SetValue(-10, 0);
  197.    {$ELSE}
  198.    SetValue(sd.vertices[2], -10, 10);
  199.    SetValue(sd.vertices[1], -9, 7);
  200.    SetValue(sd.vertices[0], -10, 0);
  201.    {$ENDIF}
  202.    m_world.GetGroundBody.CreateShape(sd, False);
  203.    sd.SetAsBox(0.5, 6, MakeVector(10.5, 6), 0);
  204.    m_world.GetGroundBody.CreateShape(sd, False);
  205.    sd.SetAsBox(0.5, 6, MakeVector(-10.5, 6), 0);
  206.    m_world.GetGroundBody.CreateShape(sd);
  207.    bd := Tb2BodyDef.Create;
  208.    {$IFDEF OP_OVERLOAD}
  209.    bd.position.SetValue(9.5, 60);
  210.    {$ELSE}
  211.    SetValue(bd.position, 9.5, 60);
  212.    {$ENDIF}
  213.    m_ball := m_world.CreateBody(bd);
  214.    cd := Tb2PolygonDef.Create;
  215.    cd.vertexCount := 8;
  216.    w := 1.0;
  217.    b := w / (2.0 + Sqrt(2.0));
  218.    s := Sqrt(2.0) * b;
  219.    {$IFDEF OP_OVERLOAD}
  220.    cd.vertices[0].SetValue(0.5 * s, 0.0);
  221.    cd.vertices[1].SetValue(0.5 * w, b);
  222.    cd.vertices[2].SetValue(0.5 * w, b + s);
  223.    cd.vertices[3].SetValue(0.5 * s, w);
  224.    cd.vertices[4].SetValue(-0.5 * s, w);
  225.    cd.vertices[5].SetValue(-0.5 * w, b + s);
  226.    cd.vertices[6].SetValue(-0.5 * w, b);
  227.    cd.vertices[7].SetValue(-0.5 * s, 0.0);
  228.    {$ELSE}
  229.    SetValue(cd.vertices[0], 0.5 * s, 0.0);
  230.    SetValue(cd.vertices[1], 0.5 * w, b);
  231.    SetValue(cd.vertices[2], 0.5 * w, b + s);
  232.    SetValue(cd.vertices[3], 0.5 * s, w);
  233.    SetValue(cd.vertices[4], -0.5 * s, w);
  234.    SetValue(cd.vertices[5], -0.5 * w, b + s);
  235.    SetValue(cd.vertices[6], -0.5 * w, b);
  236.    SetValue(cd.vertices[7], -0.5 * s, 0.0);
  237.    {$ENDIF}
  238.    cd.density := 1.0;
  239.    m_ball_shape := m_ball.CreateShape(cd);
  240.    m_ball.SetMassFromShapes;
  241. end;
  242. destructor TContactCallback.Destroy;
  243. begin
  244.    m_strings.Free;
  245.    inherited;
  246. end;
  247. procedure TContactCallback.Step(var settings: TSettings; timeStep: Float);
  248. var
  249.    i: Integer;
  250. begin
  251.    inherited;
  252.    for i := 0 to m_pointCount - 1 do
  253.       with m_points[i] do
  254.       begin
  255.          case state of
  256.             e_contactAdded: m_strings.Add(Format('added: %d -> %d : %d', [Integer(shape1), Integer(shape2), id.key]));
  257.             e_contactRemoved: m_strings.Add(Format('removed: %d -> %d : %d', [Integer(shape1), Integer(shape2), id.key]));
  258.          end;
  259.       end;
  260.    while (m_strings.Count > 15) do
  261.       m_strings.Delete(0);
  262.    for i := 0 to m_strings.Count - 1 do
  263.       DrawText(m_strings[i]);
  264. end;
  265. initialization
  266.    RegisterTestEntry('Contact Callback', TContactCallback);
  267. end.