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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UVerticalStack;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TVerticalStack = class(TTester)
  8.    public
  9.       m_bullet: 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. { TVerticalStack }
  16. constructor TVerticalStack.Create;
  17. const
  18.    xs: array[0..4] of Float = (0.0, -10.0, -5.0, 5.0, 10.0);
  19. var
  20.    i, j: Integer;
  21.    sd: Tb2PolygonDef;
  22.    bd: Tb2BodyDef;
  23.    ground: Tb2Body;
  24.    body: Tb2Body;
  25. begin
  26.    inherited;
  27.    begin
  28.       sd := Tb2PolygonDef.Create;
  29.       sd.SetAsBox(50.0, 10.0, MakeVector(0.0, -10.0), 0.0);
  30.       bd := Tb2BodyDef.Create;
  31.       {$IFDEF OP_OVERLOAD}
  32.       bd.position.SetValue(0.0, 0.0);
  33.       {$ELSE}
  34.       SetValue(bd.position, 0.0, 0.0);
  35.       {$ENDIF}
  36.       ground := m_world.CreateBody(bd);
  37.       ground.CreateShape(sd, False);
  38.       sd.SetAsBox(0.1, 10.0, MakeVector(20.0, 10.0), 0.0);
  39.       ground.CreateShape(sd);
  40.    end;
  41.    sd := Tb2PolygonDef.Create;
  42.    sd.SetAsBox(0.5, 0.5);
  43.    sd.density := 1.0;
  44.    sd.friction := 0.3;
  45.    bd := Tb2BodyDef.Create;
  46.    // For this test we are using continuous physics for all boxes.
  47.    // This is a stress test, you normally wouldn't do this for
  48.    // performance reasons.
  49.    //bd.isBullet = true;
  50.    bd.allowSleep := True;
  51.    for j := 0 to 4 do
  52.    begin
  53.       for i := 0 to 11 do
  54.       begin
  55.          {$IFDEF OP_OVERLOAD}
  56.          bd.position.SetValue(xs[j], 0.752 + 1.54 * i);
  57.          {$ELSE}
  58.          SetValue(bd.position, xs[j], 0.752 + 1.54 * i);
  59.          {$ENDIF}
  60.          body := m_world.CreateBody(bd, False);
  61.          body.CreateShape(sd, False);
  62.          body.SetMassFromShapes;
  63.       end;
  64.    end;
  65.    bd.Free;
  66.    sd.Free;
  67. end;
  68. procedure TVerticalStack.Step(var settings: TSettings; timeStep: Float);
  69. begin
  70.    inherited;
  71.  DrawText('Press: B to launch a bullet.');
  72. end;
  73. procedure TVerticalStack.Keyboard(key: Byte);
  74. var
  75.    sd: Tb2CircleDef;
  76.    bd: Tb2BodyDef;
  77. begin
  78.    if key = 66{B} then
  79.    begin
  80. if Assigned(m_bullet) then
  81. begin
  82.  m_world.DestroyBody(m_bullet);
  83.  m_bullet := nil;
  84. end;
  85.       sd := Tb2CircleDef.Create;
  86.       sd.density := 20.0;
  87.       sd.radius := 0.25;
  88.       sd.restitution := 0.05;
  89.       bd := Tb2BodyDef.Create;
  90.       bd.isBullet := True;
  91.       bd.allowSleep := False;
  92.       {$IFDEF OP_OVERLOAD}
  93.       bd.position.SetValue(-31.0, 5.0);
  94.       {$ELSE}
  95.       SetValue(bd.position, -31.0, 5.0);
  96.       {$ENDIF}
  97.       m_bullet := m_world.CreateBody(bd);
  98.       m_bullet.CreateShape(sd);
  99.       m_bullet.SetMassFromShapes;
  100.       m_bullet.SetLinearVelocity(MakeVector(400.0, 0.0));
  101.    end;
  102. end;
  103. initialization
  104.    RegisterTestEntry('Vertical Stack', TVerticalStack);
  105. end.