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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UApplyForce;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TApplyForce = class(TTester)
  8.    public
  9.       m_body: Tb2Body;
  10.       constructor Create; override;
  11.       procedure Step(var settings: TSettings; timeStep: Float); override;
  12.       procedure Keyboard(key: Byte); override;
  13.    end;
  14. implementation
  15. { TApplyForce }
  16. constructor TApplyForce.Create;
  17. const
  18.    k_restitution = 0.4;
  19. var
  20.    bd: Tb2BodyDef;
  21.    ground: Tb2Body;
  22.    sd, sd1, sd2: Tb2PolygonDef;
  23.    xf1, xf2: Tb2XForm;
  24. begin
  25.    inherited;
  26.    m_world.SetGravity(MakeVector(0.0, 0.0));
  27.    frmMain.editGravityX.Text := '0';
  28.    frmMain.editGravityY.Text := '0';
  29.    begin
  30.       bd := Tb2BodyDef.Create;
  31.       {$IFDEF OP_OVERLOAD}
  32.       bd.position.SetValue(0.0, 20.0);
  33.       {$ELSE}
  34.       SetValue(bd.position, 0.0, 20.0);
  35.       {$ENDIF}
  36.       ground := m_world.CreateBody(bd);
  37.       sd := Tb2PolygonDef.Create;
  38.       sd.density := 0.0;
  39.       sd.restitution := k_restitution;
  40.       sd.SetAsBox(0.2, 20.0, MakeVector(-20.0, 0.0), 0.0);
  41.       ground.CreateShape(sd, False);
  42.       sd.SetAsBox(0.2, 20.0, MakeVector(20.0, 0.0), 0.0);
  43.       ground.CreateShape(sd, False);
  44.       sd.SetAsBox(0.2, 20.0, MakeVector(0.0, -20.0), 0.5 * Pi);
  45.       ground.CreateShape(sd, False);
  46.       sd.SetAsBox(0.2, 20.0, MakeVector(0.0, 20.0), -0.5 * Pi);
  47.       ground.CreateShape(sd);
  48.    end;
  49.    begin
  50.       {$IFDEF OP_OVERLOAD}
  51.       xf1.R.SetValue(0.3524 * Pi);
  52.       {$ELSE}
  53.       SetValue(xf1.R, 0.3524 * Pi);
  54.       {$ENDIF}
  55.       xf1.position := b2Mul(xf1.R, MakeVector(1.0, 0.0));
  56.       sd1 := Tb2PolygonDef.Create;
  57.       sd1.vertexCount := 3;
  58.       sd1.vertices[0] := b2Mul(xf1, MakeVector(-1.0, 0.0));
  59.       sd1.vertices[1] := b2Mul(xf1, MakeVector(1.0, 0.0));
  60.       sd1.vertices[2] := b2Mul(xf1, MakeVector(0.0, 0.5));
  61.       sd1.density := 2.0;
  62.       {$IFDEF OP_OVERLOAD}
  63.       xf2.R.SetValue(-0.3524 * Pi);
  64.       {$ELSE}
  65.       SetValue(xf2.R, -0.3524 * Pi);
  66.       {$ENDIF}
  67.       xf2.position := b2Mul(xf2.R, MakeVector(-1.0, 0.0));
  68.       sd2 := Tb2PolygonDef.Create;
  69.       sd2.vertexCount := 3;
  70.       sd2.vertices[0] := b2Mul(xf2, MakeVector(-1.0, 0.0));
  71.       sd2.vertices[1] := b2Mul(xf2, MakeVector(1.0, 0.0));
  72.       sd2.vertices[2] := b2Mul(xf2, MakeVector(0.0, 0.5));
  73.       sd2.density := 2.0;
  74.       bd := Tb2BodyDef.Create;
  75.       bd.angularDamping := 2.0;
  76.       bd.linearDamping := 0.1;
  77.       {$IFDEF OP_OVERLOAD}
  78.       bd.position.SetValue(0.0, 1.05);
  79.       {$ELSE}
  80.       SetValue(bd.position, 0.0, 1.05);
  81.       {$ENDIF}
  82.       bd.angle := Pi;
  83.       m_body := m_world.CreateBody(bd);
  84.       m_body.CreateShape(sd1);
  85.       m_body.CreateShape(sd2);
  86.       m_body.SetMassFromShapes;
  87.    end;
  88. end;
  89. procedure TApplyForce.Step(var settings: TSettings; timeStep: Float);
  90. begin
  91.    inherited;
  92.    DrawText('Use WAD to control the plane.');
  93. end;
  94. procedure TApplyForce.Keyboard(key: Byte);
  95. var
  96.    f, p: TVector2;
  97. begin
  98.    case key of
  99.       87{W}:
  100.          begin
  101.             f := m_body.GetWorldVector(MakeVector(0.0, -70.0));
  102.             p := m_body.GetWorldPoint(MakeVector(0.0, 2.0));
  103.             m_body.ApplyForce(f, p);
  104.          end;
  105.       65{A}: m_body.ApplyTorque(20.0);
  106.       68{D}: m_body.ApplyTorque(-20.0);
  107.    end;
  108. end;
  109. initialization
  110.    RegisterTestEntry('Apply Force', TApplyForce);
  111. end.