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

📄 oxnewtonopenal.pas

📁 Newton Game Dynamic 1.52 Delphi下基于GLScene的OpenGL游戏开发控件。功能非常强大和易于使用。 Advanced physics engine for re
💻 PAS
📖 第 1 页 / 共 2 页
字号:
begin
  FActived:= False;
  if Fplaying then Stop;
  AlDeleteBuffers(1, @Fbuffer);
  AlDeleteSources(1, @FData);
  inherited destroy;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
constructor TOXVehicleOpenAL.Create;
begin
  FMotor:= false;
  FActived:= True;
  Fplaying:= false;
  gain:= 1.0;
  pitch:= 1.0;
  FIdle:= 0.4;
  FRevolution:= 0.0;
  AlGenBuffers(1, @Fbuffer);
  AlGenSources(1, @FData);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXVehicleOpenAL.LoadFromFile(filename: string);
var
  size: TALSizei;
  freq: TALSizei;
  Data: TALVoid;
  format: TALEnum;
  floop: TALInt;
begin
  AlutLoadWavFile(filename, format, data, size, freq, floop);
  AlBufferData(Fbuffer, format, data, size, freq);
  AlutUnloadWav(format, data, size, freq);
  loop:= floop;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXVehicleOpenAL.Play;
begin
  AlSourcePlay(FData);
  Update;
  Fplaying:=true;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXVehicleOpenAL.Pause;
begin
  AlSourcePause(FData);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXVehicleOpenAL.Stop;
begin
  Fplaying:=false;
  AlSourceStop(FData);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXVehicleOpenAL.update;
var
  vhl: TOXNewtonVehicle;
  listenerori: array [0..5] of TALfloat;
  aWomega: single;
  bWomega: single;
  cWomega: single;
  dWomega: single;
  RetroPitch: single;
begin
  if FActived = false then exit;
  //Source
  AlSourcei(FData, AL_BUFFER, Fbuffer);
  AlSourcef(FData, AL_PITCH, Fpitch);
  AlSourcef(FData, AL_GAIN, Fgain);
  AlSourcefv(FData, AL_POSITION, @FSource.Position.AsVector);
  //AlSourcefv(FData, AL_VELOCITY, @Fvelocity);
  AlSourcei(FData, AL_LOOPING, Flooping);
  //Listener
  AlListenerfv ( AL_POSITION, @FListener.Position.AsVector);
  //AlListenerfv ( AL_VELOCITY, @Flvelocity);
  with FListener.Up do begin listenerori[0]:= X; listenerori[1]:= Y; listenerori[2]:= Z; end;
  with FListener.Direction do begin listenerori[3]:= X; listenerori[4]:= Y; listenerori[5]:= Z; end;
  AlListenerfv ( AL_ORIENTATION, @listenerori);
  vhl:= TOXNewtonVehicle(Source);
  if FRevolution > 2.0 then FRevolution:= 2.0;
  if FRevolution < 0 then FRevolution:= 0;
  if FMotor then
  begin
    FRevolution:= FRevolution+0.1;
  end else
  begin
    FRevolution:= FRevolution-0.1;
  end;
  aWomega:= vhl.WheelaOmega;
  bWomega:= vhl.WheelbOmega;
  cWomega:= vhl.WheelcOmega;
  dWomega:= vhl.WheeldOmega;
  //
  aWomega:= Abs((aWomega+bWomega)/2);
  dWomega:= Abs((dWomega+cWomega)/2);
  //if (dWomega > 100) then dWomega:= 100;
  RetroPitch:= Abs((FRevolution)+(dWomega/50)*(aWomega/vhl.WheelaRadius)/1000);
  if (RetroPitch/1.5 > 2.2) then
  Pitch:= 2.2 else
  Pitch:= RetroPitch/1.5;
  //if RetroPitch<3.0 then Pitch:= RetroPitch
  //else  //(aWomega/100)+(dWomega/35)*vhl.WheelaRadius*(FRevolution/200);
  //Pitch:= 3.0;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
destructor TOXVehicleOpenAL.Destroy;
begin
  FActived:= False;
  if Fplaying then Stop;
  AlDeleteBuffers(1, @Fbuffer);
  AlDeleteSources(1, @FData);
  inherited destroy;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
constructor TOXManagerOpenAL.Create(aOwner: TComponent);
var argv: array of PChar;
begin
  inherited Create(aOwner);
  argv:= nil;
  AlutInit( nil, argv );
  //ReadOpenALExtensions;
  FVSList:= TList.Create;
  FVSCount:= 0;
  FSSList:= TList.Create;
  FSSCount:= 0;
  FActived:= True;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXManagerOpenAL.AddVehicleSound(name: string; soundfile:string; ssource, slistener: TGLBaseSceneObject);
begin
  if (FActived = false) then exit;
  Inc(FVSCount);
  SetLength(FVehicleSound,FVSCount);
  FVehicleSound[FVSCount-1]:= TOXVehicleOpenAL.Create;
  FVehicleSound[FVSCount-1].Name:= name;
  FVehicleSound[FVSCount-1].Source:= ssource;
  FVehicleSound[FVSCount-1].Listener:= slistener;
  FVehicleSound[FVSCount-1].LoadFromFile(soundfile);
  FVehicleSound[FVSCount-1].pitch:= 1.0;
  FVehicleSound[FVSCount-1].gain:= 1.0;
  FVehicleSound[FVSCount-1].loop:= 1;
  FVehicleSound[FVSCount-1].update;
  if not FVSList.indexOf(FVehicleSound[FVSCount-1])>-1 then
    FVSList.Add(FVehicleSound[FVSCount-1])
  else
    FVehicleSound[FVSCount-1].Free;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXManagerOpenAL.AddSimpleSound(name: string; soundfile:string; ssource, slistener: TGLBaseSceneObject);
begin
  if (FActived = false) then exit;
  Inc(FSSCount);
  SetLength(FSimpleSound,FSSCount);
  FSimpleSound[FSSCount-1]:= TOXSimpleOpenAL.Create;
  FSimpleSound[FSSCount-1].Name:= name;
  FSimpleSound[FSSCount-1].Source:= ssource;
  FSimpleSound[FSSCount-1].Listener:= slistener;
  FSimpleSound[FSSCount-1].LoadFromFile(soundfile);
  FSimpleSound[FSSCount-1].pitch:= 1.0;
  FSimpleSound[FSSCount-1].gain:= 1.0;
  FSimpleSound[FSSCount-1].loop:= 1;
  FSimpleSound[FSSCount-1].update;
  if not FSSList.indexOf(FSimpleSound[FSSCount-1])>-1 then
    FSSList.Add(FSimpleSound[FSSCount-1])
  else
    FSimpleSound[FSSCount-1].Free;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
function TOXManagerOpenAL.VehicleSound(name: string): TOXVehicleOpenAL;
var i: integer;
begin
  result:= nil;
  if FActived = false then exit;
  for i:= 0 to FVSList.Count-1 do
    if TOXVehicleOpenAL(FVSList.Items[i]).name = name then
      result:= TOXVehicleOpenAL(FVSList.Items[i]);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXManagerOpenAL.RemoveSound(name: string);
var i: integer;
begin
  if Assigned(FSSList) then
    for i:= FSSList.Count-1 downto 0 do
    begin
      if TOXSimpleOpenAL(FSSList.Items[i]).Name = name then
        FSSList.Delete(i);
    end;
  if Assigned(FVSList) then
    for i:= 0 to FVSList.Count-1 do
    begin
      if TOXVehicleOpenAL(FVSList.Items[i]).name = name then
        FVSList.Delete(i);
    end;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
function TOXManagerOpenAL.SimpleSound(name: string): TOXSimpleOpenAL;
var i: integer;
begin
  result:= nil;
  if FActived = false then exit;
  for i:= 0 to FSSList.Count-1 do
    if TOXSimpleOpenAL(FSSList.Items[i]).name = name then
      result:= TOXSimpleOpenAL(FSSList.Items[i]);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel.                 //
{******************************************************************************}
destructor TOXManagerOpenAL.Destroy;
var i: integer;
begin
  FActived:= false;
  for i:= 0 to FVSList.Count-1 do begin
    if  TOXVehicleOpenAL(FVSList.Items[i]).playing then
    begin
       TOXVehicleOpenAL(FVSList.Items[i]).Stop;
       TOXVehicleOpenAL(FVSList.Items[i]).loop:= 0;
       TOXVehicleOpenAL(FVSList.Items[i]).update;
    end;
    TOXVehicleOpenAL(FVSList.Items[i]).Free;
  end;
  for i:= 0 to FSSList.Count-1 do begin
    if  TOXSimpleOpenAL(FSSList.Items[i]).playing then
    begin
       TOXSimpleOpenAL(FSSList.Items[i]).Stop;
       TOXSimpleOpenAL(FSSList.Items[i]).loop:= 0;
       TOXSimpleOpenAL(FSSList.Items[i]).update;
    end;
    TOXSimpleOpenAL(FSSList.Items[i]).Free;
  end;
  FVSList.Clear;
  FSSList.Clear;
  FreeAndNil(FVSList);
  FreeAndNil(FSSList);
  alutExit;
  inherited Destroy;
end;
{******************************************************************************}
{$D '[05-25-2007]: TOXNewtonManager v1.48 by Dave Gravel under MPL-1.1 license.'}
{******************************************************************************}
initialization
  RegisterClasses( [ TOXManagerOpenAL] );

end.

⌨️ 快捷键说明

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