Einzelnen Beitrag anzeigen

Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#404

Re: Balanced das Spiel für Starke Nerven und Starke Graphikk

  Alt 26. Dez 2006, 22: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
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat