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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UPyramid;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TPyramid = class(TTester)
  8.    private
  9.       m_bodyCount: Integer;
  10.    public
  11.       constructor Create; override;
  12.       procedure Step(var settings: TSettings; timeStep: Float); override;
  13.       procedure Keyboard(key: Byte); override;
  14.       procedure LaunchBomb(velocity_factor: Float = 1.0); override;
  15.    end;
  16. implementation
  17. var
  18.    m_level: Integer;
  19. { TPyramid }
  20. constructor TPyramid.Create;
  21. const
  22.    deltaX: TVector2 = (X: 0.5625; Y: 2.0);
  23.    deltaY: TVector2 = (X: 1.125; Y: 0.0);
  24. var
  25.    i, j: Integer;
  26.    sd: Tb2PolygonDef;
  27.    bd: Tb2BodyDef;
  28.    ground: Tb2Body;
  29.    body: Tb2Body;
  30.    x, y: TVector2;
  31. begin
  32.    inherited;
  33.    begin
  34.       sd := Tb2PolygonDef.Create;
  35.       sd.SetAsBox(50.0, 10.0);
  36.       bd := Tb2BodyDef.Create;
  37.       {$IFDEF OP_OVERLOAD}
  38.       bd.position.SetValue(0.0, -10.0);
  39.       {$ELSE}
  40.       SetValue(bd.position, 0.0, -10.0);
  41.       {$ENDIF}
  42.       ground := m_world.CreateBody(bd);
  43.       ground.CreateShape(sd);
  44.    end;
  45.    begin
  46.       sd := Tb2PolygonDef.Create;
  47.       sd.SetAsBox(0.5, 0.5);
  48.       sd.density := 5.0;
  49.       sd.friction := 0.7;
  50.       bd := Tb2BodyDef.Create;
  51.       {$IFDEF OP_OVERLOAD}
  52.       x.SetValue(-10.0, 0.75);
  53.       {$ELSE}
  54.       SetValue(x, -10.0, 0.75);
  55.       {$ENDIF}
  56.       m_bodyCount := 0;
  57.       for i := 0 to m_level do
  58.       begin
  59.          y := x;
  60.          for j := i to m_level do
  61.          begin
  62.             bd.position := y;
  63.             body := m_world.CreateBody(bd, False);
  64.             body.CreateShape(sd, False);
  65.             body.SetMassFromShapes;
  66.             Inc(m_bodyCount);
  67.             {$IFDEF OP_OVERLOAD}
  68.             y.AddBy(deltaY);
  69.             {$ELSE}
  70.             AddBy(y, deltaY);
  71.             {$ENDIF}
  72.          end;
  73.          {$IFDEF OP_OVERLOAD}
  74.          x.AddBy(deltaX);
  75.          {$ELSE}
  76.          AddBy(x, deltaX);
  77.          {$ENDIF}
  78.       end;
  79.       sd.Free;
  80.       bd.Free;
  81.    end;
  82. end;
  83. procedure TPyramid.Step(var settings: TSettings; timeStep: Float);
  84. begin
  85.    inherited;
  86.    DrawText(Format('Use +/- to change box count. Box Count: %d', [m_bodyCount]));
  87. end;
  88. procedure TPyramid.Keyboard(key: Byte);
  89. begin
  90.    inherited;
  91.    case key of
  92.       187{+}:
  93.          if m_level < 30 then
  94.             Inc(m_level);
  95.       189{-}:
  96.          if m_level > 1 then
  97.             Dec(m_level);
  98.    else
  99.       Exit;
  100.    end;
  101.    frmMain.btnResetClick(nil);
  102. end;
  103. procedure TPyramid.LaunchBomb(velocity_factor: Float);
  104. begin
  105.    inherited LaunchBomb(15.0);
  106. end;
  107. initialization
  108.    m_level := 25;
  109.    RegisterTestEntry('Pyramid', TPyramid);
  110. end.