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

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UCar;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain, UPhysics2DTypes, UPhysics2D, SysUtils;
  6. type
  7.    TCar = class(TTester)
  8.    public
  9.       m_leftWheel, m_rightWheel, m_vehicle: Tb2Body;
  10.       m_leftJoint, m_rightJoint: Tb2RevoluteJoint;
  11.       constructor Create; override;
  12.       procedure Step(var settings: TSettings; timeStep: Float); override;
  13.       procedure Keyboard(key: Byte); override;
  14.    end;
  15. implementation
  16. { TCar }
  17. constructor TCar.Create;
  18. var
  19.    poly1, poly2: Tb2PolygonDef;
  20.    bd: Tb2BodyDef;
  21.    circ: Tb2CircleDef;
  22.    jd: Tb2RevoluteJointDef;
  23.    box: Tb2PolygonDef;
  24. begin
  25.    inherited;
  26.    begin // car body
  27.       // bottom half
  28.       poly1 := Tb2PolygonDef.Create;
  29.       poly1.vertexCount := 5;
  30.       {$IFDEF OP_OVERLOAD}
  31.       poly1.vertices[4].SetValue(-2.2,-0.74);
  32.       poly1.vertices[3].SetValue(-2.2,0);
  33.       poly1.vertices[2].SetValue(1.0,0);
  34.       poly1.vertices[1].SetValue(2.2,-0.2);
  35.       poly1.vertices[0].SetValue(2.2,-0.74);
  36.       {$ELSE}
  37.       SetValue(poly1.vertices[4], -2.2,-0.74);
  38.       SetValue(poly1.vertices[3], -2.2,0);
  39.       SetValue(poly1.vertices[2], 1.0,0);
  40.       SetValue(poly1.vertices[1], 2.2,-0.2);
  41.       SetValue(poly1.vertices[0], 2.2,-0.74);
  42.       {$ENDIF}
  43.       poly1.filter.groupIndex := -1;
  44.       poly1.density := 20.0;
  45.       poly1.friction := 0.68;
  46.       poly1.filter.groupIndex := -1;
  47.       // top half
  48.       poly2 := Tb2PolygonDef.Create;
  49.       poly2.vertexCount := 4;
  50.       {$IFDEF OP_OVERLOAD}
  51.       poly2.vertices[3].SetValue(-1.7,0);
  52.       poly2.vertices[2].SetValue(-1.3,0.7);
  53.       poly2.vertices[1].SetValue(0.5,0.74);
  54.       poly2.vertices[0].SetValue(1.0,0);
  55.       {$ELSE}
  56.       SetValue(poly2.vertices[3], -1.7,0);
  57.       SetValue(poly2.vertices[2], -1.3,0.7);
  58.       SetValue(poly2.vertices[1], 0.5,0.74);
  59.       SetValue(poly2.vertices[0], 1.0,0);
  60.       {$ENDIF}
  61.       poly2.filter.groupIndex := -1;
  62.       poly2.density := 5.0;
  63.       poly2.friction := 0.68;
  64.       poly2.filter.groupIndex := -1;
  65.       bd := Tb2BodyDef.Create;
  66.       {$IFDEF OP_OVERLOAD}
  67.       bd.position.SetValue(-35.0, 2.8);
  68.       {$ELSE}
  69.       SetValue(bd.position, -35.0, 2.8);
  70.       {$ENDIF}
  71.       m_vehicle := m_world.CreateBody(bd);
  72.       m_vehicle.CreateShape(poly1);
  73.       m_vehicle.CreateShape(poly2);
  74.       m_vehicle.SetMassFromShapes;
  75.    end;
  76.    begin // vehicle wheels
  77.       circ := Tb2CircleDef.Create;
  78.       circ.density := 40.0;
  79.       circ.radius := 0.38608;
  80.       circ.friction := 0.8;
  81.       circ.filter.groupIndex := -1;
  82.       bd := Tb2BodyDef.Create;
  83.       bd.allowSleep := False;
  84.       {$IFDEF OP_OVERLOAD}
  85.       bd.position.SetValue(-33.8, 2.0);
  86.       {$ELSE}
  87.       SetValue(bd.position, -33.8, 2.0);
  88.       {$ENDIF}
  89.       m_rightWheel := m_world.CreateBody(bd, False);
  90.       m_rightWheel.CreateShape(circ, False);
  91.       m_rightWheel.SetMassFromShapes;
  92.       {$IFDEF OP_OVERLOAD}
  93.       bd.position.SetValue(-36.2, 2.0);
  94.       {$ELSE}
  95.       SetValue(bd.position, -36.2, 2.0);
  96.       {$ENDIF}
  97.       m_leftWheel := m_world.CreateBody(bd);
  98.       m_leftWheel.CreateShape(circ);
  99.       m_leftWheel.SetMassFromShapes;
  100.    end;
  101.    begin // join wheels to chassis
  102.       jd := Tb2RevoluteJointDef.Create;
  103.       jd.Initialize(m_vehicle, m_leftWheel, m_leftWheel.GetWorldCenter);
  104.       jd.collideConnected := False;
  105.       jd.enableMotor := True;
  106.       jd.maxMotorTorque := 10.0;
  107.       jd.motorSpeed := 0.0;
  108.       m_leftJoint := Tb2RevoluteJoint(m_world.CreateJoint(jd, False));
  109.       jd.Initialize(m_vehicle, m_rightWheel, m_rightWheel.GetWorldCenter);
  110.       jd.collideConnected := False;
  111.       m_rightJoint := Tb2RevoluteJoint(m_world.CreateJoint(jd));
  112.    end;
  113.    begin // ground
  114.       box := Tb2PolygonDef.Create;
  115.       box.SetAsBox(19.5, 0.5);
  116.       box.friction := 0.62;
  117.       bd := Tb2BodyDef.Create;
  118.       {$IFDEF OP_OVERLOAD}
  119.       bd.position.SetValue(-25.0, 1.0);
  120.       {$ELSE}
  121.       SetValue(bd.position, -25.0, 1.0);
  122.       {$ENDIF}
  123.       m_world.CreateBody(bd).CreateShape(box);
  124.    end;
  125.    begin // more ground
  126.       box := Tb2PolygonDef.Create;
  127.       bd := Tb2BodyDef.Create;
  128.       box.SetAsBox(9.5, 0.5, b2Vec2_zero, 0.1 * Pi);
  129.       box.friction := 0.62;
  130.       {$IFDEF OP_OVERLOAD}
  131.       bd.position.SetValue(27.0 - 30.0, 3.1);
  132.       {$ELSE}
  133.       SetValue(bd.position, 27.0 - 30.0, 3.1);
  134.       {$ENDIF}
  135.       m_world.CreateBody(bd).CreateShape(box);
  136.    end;
  137.    begin // more ground
  138.       box := Tb2PolygonDef.Create;
  139.       bd := Tb2BodyDef.Create;
  140.       box.SetAsBox(9.5, 0.5, b2Vec2_zero, -0.1 * Pi);
  141.       box.friction := 0.62;
  142.       {$IFDEF OP_OVERLOAD}
  143.       bd.position.SetValue(55.0 - 30.0, 3.1);
  144.       {$ELSE}
  145.       SetValue(bd.position, 55.0 - 30.0, 3.1);
  146.       {$ENDIF}
  147.       m_world.CreateBody(bd).CreateShape(box);
  148.    end;
  149.    begin // more ground
  150.       box := Tb2PolygonDef.Create;
  151.       bd := Tb2BodyDef.Create;
  152.       box.SetAsBox(9.5, 0.5, b2Vec2_zero, 0.03 * Pi);
  153.       box.friction := 0.62;
  154.       {$IFDEF OP_OVERLOAD}
  155.       bd.position.SetValue(41.0, 2.0);
  156.       {$ELSE}
  157.       SetValue(bd.position, 41.0, 2.0);
  158.       {$ENDIF}
  159.       m_world.CreateBody(bd).CreateShape(box);
  160.    end;
  161.    begin // more ground
  162.       box := Tb2PolygonDef.Create;
  163.       bd := Tb2BodyDef.Create;
  164.       box.SetAsBox(5.0, 0.5, b2Vec2_zero, 0.15 * Pi);
  165.       box.friction := 0.62;
  166.       {$IFDEF OP_OVERLOAD}
  167.       bd.position.SetValue(50.0, 4.0);
  168.       {$ELSE}
  169.       SetValue(bd.position, 50.0, 4.0);
  170.       {$ENDIF}
  171.       m_world.CreateBody(bd).CreateShape(box);
  172.    end;
  173.    begin // more ground
  174.       box := Tb2PolygonDef.Create;
  175.       bd := Tb2BodyDef.Create;
  176.       box.SetAsBox(20.0, 0.5);
  177.       box.friction := 0.62;
  178.       {$IFDEF OP_OVERLOAD}
  179.       bd.position.SetValue(85.0, 2.0);
  180.       {$ELSE}
  181.       SetValue(bd.position, 85.0, 2.0);
  182.       {$ENDIF}
  183.       m_world.CreateBody(bd).CreateShape(box);
  184.    end;
  185. end;
  186. procedure TCar.Step(var settings: TSettings; timeStep: Float);
  187. begin
  188.    inherited;
  189.  DrawText('Keys: left = a, brake = s, right = d');
  190. end;
  191. procedure TCar.Keyboard(key: Byte);
  192. begin
  193.    case key of
  194.       65{A}:
  195.          begin
  196.       m_leftJoint.m_maxMotorTorque := 800.0;
  197.       m_leftJoint.m_motorSpeed := 12.0;
  198.          end;
  199.       83{S}:
  200.          begin
  201.       m_leftJoint.m_maxMotorTorque := 100.0;
  202.        m_leftJoint.m_motorSpeed := 0.0;
  203.          end;
  204.       68{D}:
  205.          begin
  206.       m_leftJoint.m_maxMotorTorque := 1200.0;
  207.        m_leftJoint.m_motorSpeed := -36.0;
  208.          end;
  209.    end;
  210. end;
  211. initialization
  212.    RegisterTestEntry('Car', TCar);
  213. end.