Delphi XE2 Professional
|
26. Dez 2006, 23:38
@tumm,
Verstehe ich das Richtig.
Du Aktivierst Sound, und Deaktivierst Rollsounds. Und dann gehts ?
was eigentlich überhaupt keinen Sinn macht. Erst Recht dann nicht wenn dann diese Fehlermeldung sein soll.
Ich Poste euch mal den Gesamten Code der Mit den Rollsounds dazu gekommen ist.
Delphi-Quellcode:
// Das ist die Procedure die Aktiv wird wenn die Kugel Fliegt.
// hat eigentlich nichts direkt mit dem fehler zu tun. Aber ihr seid bestimmt neugierig wie ich das alles mache ;)
Var
ocolls: boolean = False;
Colls: Boolean = False;
Colltime: Dword;
Const
Colltimefact = 50;
Procedure SoundBeginContact;
Begin
ocolls := Colls;
colls := false;
End;
Procedure SoundEndContact;
Begin
If Ocolls And Not Colls Then Begin // Negative Flanke !!
Colltime := GetTickCount;
End;
// Messen der Zeit seit Negativer Flanke !!
If (Not Ocolls) And (Not Colls) Then Begin
If Gettickcount - Colltime > Colltimefact Then
Soundmanager.stop;
End;
End;
So hier kommt dann der Code von meinem Sound Manager.
Delphi-Quellcode:
Type
TSoundmanager = Class
private
Finitialized: Boolean;
Sounds: Array Of HStream;
Playing: Array Of boolean;
fsoundpath: String;
Procedure Playchannel(Value: Integer);
public
Procedure Play(Playermaterial, Bottommaterial: integer; Waited: Boolean);
Procedure Stop;
Constructor create(SoundPath: String; h_Wnd: Hwnd);
Destructor destroy; override;
End;
Das ganze Greift auf Bass.dll zu.
Der Constructor Lädt direct die Sound Files :
Delphi-Quellcode:
Constructor TSoundmanager.create(SoundPath: String; h_Wnd: Hwnd);
Var
i: integer;
Begin
Inherited create;
// Bass.dll initialisieren
Finitialized := BASS_Init(-1, 44100, 0, h_Wnd, Nil);
If Not Finitialized Then MessageBox(0, 'Could not load Bass.dll', 'Error', MB_ICONWARNING Or MB_OK);
// Laden der Sound Files
If Finitialized Then Begin
fsoundpath := Soundpath;
setlength(Sounds, 23);
Sounds[0] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Hit_Paper.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[1] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Hit_Wood_Wood.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[2] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Hit_Wood_Stone.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[3] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Hit_Wood_Metal.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[4] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Hit_Stone_Wood.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[5] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Hit_Stone_Stone.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[6] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Hit_Stone_Metal.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[7] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Misc_Fall.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[8] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Misc_Checkpoint.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[9] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Music_Final.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[10] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Misc_extraball.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[11] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Extra_Start.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[12] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Misc_Enlargeball.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[13] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Misc_shrinkball.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[14] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Misc_die.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[15] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Menu_click.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[16] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Roll_Paper.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[17] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Roll_Stone_Metal.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[18] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Roll_Stone_Stone.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[19] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Roll_Stone_Wood.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[20] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Roll_Wood_Metal.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[21] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Roll_Wood_Stone.wav'), 0, 0, BASS_SAMPLE_FX);
Sounds[22] := BASS_StreamCreateFile(False, PChar(Soundpath + 'Roll_Wood_Wood.wav'), 0, 0, BASS_SAMPLE_FX);
setlength(Playing, High(sounds) + 1);
For i := 0 To High(playing) Do
Playing[i] := false;
End;
End;
Und diese Function hier startet dann die Endlosschleifen von Sound [ 16- 22 ]
Delphi-Quellcode:
Procedure Tsoundmanager.Playchannel(value: Integer);
Var
info: BASS_CHANNELINFO;
AChannel: HStream;
i: integer;
Begin
If UseRollsounds Then Begin
// Beenden der Anderen Channels
For i := 0 To High(Playing) Do Begin
If (i <> value) And PLaying[i] Then Begin
BASS_ChannelStop(Sounds[i]);
Playing[i] := false;
End;
End;
If Not Playing[value] Then Begin
// Starten des Channels
aChannel := Sounds[value];
BASS_ChannelGetInfo(aChannel, Info);
// Loop setzen / nicht setzen
If ((Not (Info.Flags = BASS_SAMPLE_LOOP)) And (True)) Or
(Info.Flags = BASS_SAMPLE_LOOP) And (Not true) Then
BASS_ChannelSetFlags(aChannel, BASS_SAMPLE_LOOP);
// Abspielen
BASS_ChannelPlay(aChannel, true);
Playing[value] := true;
End;
End;
End;
Irgendwo im Code ist glaubig noch die Stop Routine aufgerufen die ist hier :
Delphi-Quellcode:
Procedure TSoundmanager.Stop;
Var
i: Integer;
Begin
For i := 0 To High(playing) Do Begin
If Playing[i] Then
BASS_ChannelStop(Sounds[i]);
Playing[i] := false;
End;
End;
Das Ganze Läuft nu wie Folgt ab.
Das Programm Ruft Render auf. dann wird die szene Gerendert.
dann wird mit folgendem Code die Physik und damit dann auch die Audio Aktualisiert.
Delphi-Quellcode:
While AccTimeSlice > 12 Do Begin
If Assigned(NewtonWorld) Then Begin
SoundBeginContact;
NewtonUpdate(NewtonWorld, (12 / 1000));
SoundEndContact;
End;
AccTimeSlice := AccTimeSlice - 12;
End;
Mehr ist nich. Wo da dein TFont Error geschieht ist mir nich Klar.
Die "MS Sans Serif" Font wird über TopenGlSimple Font geladen. die entsprechende Unit gibts auf meiner HP. Die kannst du Gerne mal runterladen und versuchen ob die bei dir Läuft.
Uwe
|