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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UDistanceTest;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils, OpenGL;
  6. type
  7.    TDistanceTest = class(TTester)
  8.    public
  9.       m_body1, m_body2: Tb2Body;
  10.       m_shape1, m_shape2: Tb2Shape;
  11.       constructor Create; override;
  12.       destructor Destroy; override;
  13.       procedure Step(var settings: TSettings; timeStep: Float); override;
  14.       procedure Keyboard(key: Byte); override;
  15.    end;
  16. implementation
  17. { TDistanceTest }
  18. constructor TDistanceTest.Create;
  19. var
  20.    sd: Tb2PolygonDef;
  21.    bd: Tb2BodyDef;
  22. begin
  23.    inherited;
  24.  begin
  25. sd := Tb2PolygonDef.Create;
  26. sd.SetAsBox(1.0, 1.0);
  27. sd.density := 0.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. m_body1 := m_world.CreateBody(bd);
  35. m_shape1 := m_body1.CreateShape(sd);
  36.    end;
  37.    begin
  38. sd := Tb2PolygonDef.Create;
  39. sd.vertexCount := 3;
  40.       {$IFDEF OP_OVERLOAD}
  41. sd.vertices[0].SetValue(-1.0, 0.0);
  42. sd.vertices[1].SetValue(1.0, 0.0);
  43. sd.vertices[2].SetValue(0.0, 15.0);
  44.       {$ELSE}
  45. SetValue(sd.vertices[0], -1.0, 0.0);
  46. SetValue(sd.vertices[1], 1.0, 0.0);
  47. SetValue(sd.vertices[2], 0.0, 15.0);
  48.       {$ENDIF}
  49. sd.density := 1.0;
  50.       bd := Tb2BodyDef.Create;
  51.       {$IFDEF OP_OVERLOAD}
  52.       bd.position.SetValue(0.0, 10.0);
  53.       {$ELSE}
  54.       SetValue(bd.position, 0.0, 10.0);
  55.       {$ENDIF}
  56. m_body2 := m_world.CreateBody(bd);
  57. m_shape2 := m_body2.CreateShape(sd);
  58. m_body2.SetMassFromShapes;
  59.    end;
  60.    m_world.SetGravity(MakeVector(0.0, 0.0));
  61.    m_world.m_positionCorrection := False;
  62. end;
  63. destructor TDistanceTest.Destroy;
  64. begin
  65.    m_world.m_positionCorrection := True;
  66.    inherited;
  67. end;
  68. procedure TDistanceTest.Step(var settings: TSettings; timeStep: Float);
  69. var
  70.    x1, x2: TVector2;
  71.    distance: Float;
  72. begin
  73.    settings.pause := True;
  74.    inherited;
  75.    settings.pause := False;
  76.    distance := b2Distance(x1, x2, m_shape1, m_shape2, m_body1.m_xf, m_body2.m_xf);
  77.    DrawText('Use WASD/QE to move object.');
  78.    DrawText(Format('distance = %g', [distance]));
  79.    DrawText(Format('iterations = %d', [g_GJK_Iterations]));
  80.    glPointSize(4.0);
  81.    glColor3f(1.0, 0.0, 0.0);
  82.    glBegin(GL_POINTS);
  83.    glVertex2f(x1.x, x1.y);
  84.    glVertex2f(x2.x, x2.y);
  85.    glEnd;
  86.    glPointSize(1.0);
  87.    glColor3f(1.0, 1.0, 0.0);
  88.    glBegin(GL_LINES);
  89.    glVertex2f(x1.x, x1.y);
  90.    glVertex2f(x2.x, x2.y);
  91.    glEnd;
  92. end;
  93. procedure TDistanceTest.Keyboard(key: Byte);
  94. var
  95.    p: TVector2;
  96.    a: Float;
  97. begin
  98.    p := m_body2.GetPosition;
  99.    a := m_body2.GetAngle;
  100.    case key of
  101.       65{A}: p.x := p.x - 0.1;
  102.       68{D}: p.x := p.x + 0.1;
  103.       83{S}: p.y := p.y - 0.1;
  104.       87{W}: p.y := p.y + 0.1;
  105.       81{Q}: a := a + 0.1 * Pi;
  106.       69{E}: a := a - 0.1 * Pi;
  107.    end;
  108.  m_body2.SetXForm(p, a);
  109. end;
  110. initialization
  111.    RegisterTestEntry('Distance Test', TDistanceTest);
  112. end.