⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oxnewtonvehicle4wheels.pas

📁 Newton Game Dynamic 1.52 Delphi下基于GLScene的OpenGL游戏开发控件。功能非常强大和易于使用。 Advanced physics engine for re
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  inherited Create( AOwner );
  StreamList:= TStringList.create;
  StreamList.Sorted:= true;
end;

destructor TOXVehicleStreams.Destroy;
begin
  ClearStreams;
  StreamList.free;
  inherited Destroy;
end;

procedure TOXVehicleStreams.GetStream( const ID: string; Dest: TStream );
var i: integer;
begin
  if ( length( id ) > 0 ) then begin
    i:= Streamlist.IndexOf( ID );
    if i >= 0 then
      dest.CopyFrom( TMemoryStream( Streamlist.objects[i] ), 0 );
    dest.Position:= 0;
  end;
end;

procedure TOXVehicleStreams.LoadFromFile( const Filename: string );
var fs: TFileStream;
begin
  Fs:=TFileStream.Create( FileName, fmOpenRead );
  try
    LoadFromStream( fs );
  finally
    FS.free;
  end;
end;

Procedure TOXVehicleStreams.FoundCorrupt;
begin
  if assigned( FOnCorrupt ) then FOnCorrupt( Self );
  raise ECorruptFile.Create( 'File is corrupt.' );
end;

function TOXVehicleStreams.CheckGood( ms : TStream ): boolean;
var
  GoodTest: TGoodBytes; a: integer;
begin
  ms.Position:= 0;
  ms.read( GoodTest, sizeof( TGoodBytes ) );
  result:= true;
  for a:= 1 to sizeof( TGoodBytes ) do
    if goodbytes[a] <> GoodTest[a] then begin
      FoundCorrupt;
      result:= false;
      exit;
    end;
end;

procedure TOXVehicleStreams.LoadFromStream( ms: TStream );
var CMem, mem: TMemoryStream; e, c : byte;
begin
  Cmem:= TMemoryStream.create;
  mem:= TMemoryStream.create;
  try
    ms.Position:= 0;
    ms.read( c, sizeof( c ) );
    ms.read( e, sizeof( e ) );
    CMem.copyfrom( ms, ms.size -2 );
    CMEm.position:= 0;
    Mem.copyfrom( Cmem, 0 );
    LoadFromStreamNor( Mem );
  finally
    CMem.Free;
    mem.free;
  end;
end;

procedure TOXVehicleStreams.LoadFromStreamNor( ms: TStream );
var
  Mem: TMemoryStream;
  Count, size, a: integer;
  ID: string;
begin
  if not CheckGood( ms ) then exit;
  ClearStreams;
  ms.Position:= sizeof( TGoodBytes );
  ms.read( count, sizeof( count ) );
  for a:= 0 to count - 1 do begin
    mem:= TMemoryStream.create;
    ID:= ReadStr( ms );
    ms.read( Size, sizeof( size ) );
    if size <> 0 then
      mem.CopyFrom(ms,size);
    Streamlist.AddObject( ID, mem );
  end;
end;

function TOXVehicleStreams.ReadStr( Stream: TStream ): string;
var
  i: word;
  s: string;
begin
  stream.Read( i, sizeof( i ) );
  setlength( s, i );
  stream.Read( pchar( s )^, i );
  result:= s;
end;

procedure TOXVehicleStreams.RemoveStream( const ID: String );
var i: integer;
begin
  if ( length( id ) > 0 ) then begin
    i:= Streamlist.IndexOf( ID );
    if i >= 0 then begin
      TMemoryStream( Streamlist.objects[i] ).free;
      Streamlist.Delete( i );
    end;
  end;
end;

procedure TOXVehicleStreams.SaveToFile( const Filename: string );
var fs: TFileStream;
begin
  Fs:= TFileStream.Create( FileName, fmCreate );
  try
    SaveToStream( fs );
  finally
    FS.free;
  end;
end;

procedure TOXVehicleStreams.SaveToStream( ms: TStream );
var
  mem,CMem: TMemoryStream; c: byte;
begin
  CMem:= TMemoryStream.Create;
  mem:= TMemoryStream.Create;
  try
    SaveToStreamNor( mem );
    mem.position:= 0;
    ms.Write( c, sizeof( c ) );
    CMem.CopyFrom( mem, 0 );
    ms.CopyFrom( CMem, 0 );
  finally
    mem.free;
    CMem.free;
  end;
end;

procedure TOXVehicleStreams.SaveToStreamNor( ms: TStream );
var
  Count, size, a: integer;
begin
  ms.write( goodbytes, sizeof( Tgoodbytes ) );
  count:= Streamlist.Count;
  ms.write( count, sizeof( count ) );
  for a:= 0 to count -1 do begin
    Writestr( Streamlist.strings[a], ms );
    size:= TMemoryStream( Streamlist.Objects[a] ).size;
    ms.Write( size, sizeof( size ) );
    ms.CopyFrom( TMemoryStream( StreamList.Objects[a] ), 0 )
  end;
end;

procedure TOXVehicleStreams.WriteStr( S: String; Stream: TStream );
var
  i: word;
begin
  i:= length( s );
  stream.Write( i, sizeof( i ) );
  stream.write( pchar( s )^, i );
end;

{******************************************************************************}
// [15-9-2007]: TOXNewtonVehicle last change by Dave Gravel.                 //
{******************************************************************************}
constructor TOXNewtonVehicle.Create( aOwner: TComponent );
begin
  inherited create( aOwner );
  FOrionX3D:= 100;
  FVehicleStreams:= TOXVehicleStreams.Create( Self );
  FMeshModel:= 0;
  FOXVisual:= True;
  FActived:= False;
  FPath:= '';
  FWheelaMeshName:= '';
  FWheelbMeshName:= '';
  FWheelcMeshName:= '';
  FWheeldMeshName:= '';
  FFrameModel:= '';
  FWheelaModel:= '';
  FWheelbModel:= '';
  FWheelcModel:= '';
  FWheeldModel:= '';
  FWheelRotation:= 300;
  FMassRegulation:= 15;
  FWheelSideSleepCoeficient:= 0.0;
  FWheelMaxSideSleepSpeed:= 0.01;
  FWheelaNormalLoad:= 0.0;
  FWheelbNormalLoad:= 0.0;
  FWheelcNormalLoad:= 0.0;
  FWheeldNormalLoad:= 0.0;
  FRollingFriction:= 0;
  FWheelaOmega:= 0.0;
  FWheelbOmega:= 0.0;
  FWheelcOmega:= 0.0;
  FWheeldOmega:= 0.0;
  FWheelaOnAir:= False;
  FWheelbOnAir:= False;
  FWheelcOnAir:= False;
  FWheeldOnAir:= False;
  FWheelaLostSideGrip:= False;
  FWheelbLostSideGrip:= False;
  FWheelcLostSideGrip:= False;
  FWheeldLostSideGrip:= False;
  FWheelaLostTraction:= False;
  FWheelbLostTraction:= False;
  FWheelcLostTraction:= False;
  FWheeldLostTraction:= False;
  FWheelMaxLongitudinalSlideSpeed:= 1000;
  FWheelaBrakeForce:= 30000;
  FWheelbBrakeForce:= 30000;
  FWheelcBrakeForce:= 30000;
  FWheeldBrakeForce:= 30000;
  FFreezeSpeedMag2:= 0.01;
  FFreezeOmegaMag2:= 0.01;
  FFreezeFramesCount:= 10;
  FOriginX:= 0.0; FOriginY:= 0.0; FOriginZ:= 0.0;
  FInertiaX:= 0.0; FInertiaY:= 0.0; FInertiaZ:= 0.0;
  FConcretX:= 0.0; FConcretY:= 0.0; FConcretZ:= 0.0;
  FAngularDampingX:= 0.0; FAngularDampingY:= 0.0; FAngularDampingZ:= 0.0;
  FGetMatrix:= oxEmptyHmgM;
  FSetMatrix:= oxEmptyHmgM;  
  FisSetMatrix:= False;
  FisAddImpulse:= False;
  FisAddTorque:= False;
  FisAddForce:= False;
  FisSetOmega:= False;
  FisSetVelocity:= False;
  FisSetForce:= False;
  FisSetTorque:= False;
  FAddImpulse:= oxV3Make(0,0,0);
  FAddImpulseVel:= oxV3Make(0,0,0);
  FAddForce:= oxV3Make(0,0,0);
  FAddTorque:= oxV3Make(0,0,0);
  FSetOmega:= oxV3Make(0,0,0);
  FSetVelocity:= oxV3Make(0,0,0);
  FSetForce:= oxV3Make(0,0,0);
  FSetTorque:= oxV3Make(0,0,0);
  FWheelaPos:= TGLCoordinates.CreateInitialized( Self, VectorMake( 1.2, -1.65, -1 ), csVector );
  FWheelbPos:= TGLCoordinates.CreateInitialized( Self, VectorMake( -1.2, -1.65, -1 ), csVector );
  FWheelcPos:= TGLCoordinates.CreateInitialized( Self, VectorMake( 1.2, 1.6, -1 ), csVector );
  FWheeldPos:= TGLCoordinates.CreateInitialized( Self, VectorMake( -1.2, 1.6, -1 ), csVector );
  FPin:= TGLCoordinates.CreateInitialized( Self, VectorMake( 0, -1, 0 ), csVector );
  FUpDir:= TGLCoordinates.CreateInitialized( Self, VectorMake( 0, 0, 1 ), csVector );
  FWID:= -1;
  FContactID:= -1;
  FContinuousCollisionMode:= False;
  FMaterialCustom:= False;
  FWheelsMaterialCustom:= False;
  FCustomMassInertiaOrigin:= False;
  FAutoFreeze:= False;
  FFrameModel:='';
  FWheelaModel:='';
  FWheelbModel:='';
  FWheelcModel:='';
  FWheeldModel:='';
  FMass:= 2500;
  FLinearDamping:= 0.0;
  FWheelaWidth:= 1;
  FWheelaRadius:= 0.6;
  FWheelbWidth:= 1;
  FWheelbRadius:= 0.6;
  FWheelcWidth:= 1;
  FWheelcRadius:= 0.6;
  FWheeldWidth:= 1;
  FWheeldRadius:= 0.6;
  FSpeedForce:= 30000;
  FSpeedDivide:= 1000;
  FSteeringForce:= 0.015;
  FSteeringDivide:= 60;
  FSteeringMultiply:= 45;
  FTraction:= mdRear;
  FShockLength:= 0.3;
  FShockSpring:= 90.0;
  FShockValue:= 4.0;
  FWheelPitchAngle:= 0;
  FWheelRollAngle:= 90;
  FWheelTurnAngle:= 0;
  FWheelMass:= 10;
  FOnAir:= True;
  FCustomUpVector:= False;
  FInternalForceAndTorque:= false;
  FFrictionMotion1:= true;
  FFrictionMotion2:= false;  
end;
{******************************************************************************}
// [15-9-2007]: TOXNewtonVehicle last change by Dave Gravel.                 //

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -