Sound nur 1 mal abspielen

  • Hi,


    ich habe das lowFuelIndicator Script etwas erweitert.
    Es wird jetzt bei erreichen/unterschreiten der % Zahl ein OverlayHud Bild eingeblendet und ein Sound abgespielt.
    Leider wiederholt sich der Sound so lange, bis der Tank wieder voll ist bzw die %-Zahl überschritten ist.
    Der Sound soll aber nur 1 mal abgespielt werden (optional vielleichts sogar 1 mal alle 60 Sekunden :) ).


    Ich habe folgenden Code in der load Funktion:
    [lua]
    lowFuelSoundFile = Utils.getFilename("Sounds/fuelIndicator_bing.wav", self.baseDirectory);
    self.lowFuelSoundId = createSample("LFSound");
    loadSample(self.lowFuelSoundId, lowFuelSoundFile, false);
    self.lowFuelSoundPlaying = false;
    [/lua]


    In der draw Funktion innerhalb der IF Bedingung steht folgendes:
    [lua]
    playSample(self.lowFuelSoundId,1,1,0);
    [/lua]


    Ich habe versucht mehr über die einzelnen Bezeichnungen raus zu finden aber leider ist die GIANTS Script Doku z.Z. nicht erreichbar :(


    Hat jemand einen Tipp für mich?


    cu
    Webby

  • Naja..


    Meine Idee wäre, dass du im load Tei zunächst eine weitere Variable definierst, so was wie self.playedSound = false;


    Dann in einer If Bedinung noch eine weiter da rein:
    [lua]if self.playedSound == false then
    playSample(self.lowFuelSoundId,1,1,0);
    self.playedSound = true;
    end;[/lua]


    Nun wird das ganze genau ein mal abgespielt, weil self.playedSound nach dem ersten abspielen auf true gesetzt wird, und somit die If-Bedingung nicht mehr erfüllt ist.


    Das ganze funktioniert so ja nur genau ein einziges mal, und dann nicht mehr, auch wenn der Tank wieder voll und wieder leer wird. Je nach dem wie du deine Berechnung nun letztenendes gemacht hast, dürfte sie ja in etwa so aussehen.
    wenn tankinhalt weniger wie grenze dann
    rendere den text
    spiele den sound
    ende


    Falls die Rechnung so in der Art ist, kannst du nun einfach die if-Bedinung der Berechnung um ein else erweitern, und da dann die variable self.playedSound wieder auf false setzen.
    Sodass im Endeffekt die Varaible erst mal auf false ist. Dann wird der Tank unter die Grenze leer, die If-Bedinung mit dem Sound wird aufgerufen und der Sound abgespielt. self.playedSound wird auf true gesetzt und der Sound wird nicht mehr abgespielt. Sobald du dann wieder tankst, und der Tank voller wird als deine Mindestgrenze, wird self.playedSound wieder auf false gestellt, sodass der Sound beim nächsten mal wenn der Tank unter die Grenze fällt wieder abspielt.



    LG

  • öhm, eine passende Variable habe ich doch drin mit:
    [lua]self.lowFuelSoundPlaying = false;[/lua]


    Aber ich versuchs mal mit dem ELSE, von der Logik her sollte es so gehen..


    Ich bin eigentlich davon aus gegangen, das die erste 1 (die ja für Loops (Wiederholungen)) steht ausreicht aber war nicht so ^^


    EDIT: Die GIANTS Scriptdoku geht überings wieder :)

  • Ja, die 1 steht für einen Loop, aber der Draw-Bereich wird ja sehr oft aufgerufen im Spieldurchlauf, und deine if-Bedingung damit ebenfalls.. D.h. er spielt den Sound zwar jedes mal wenn er an die Zeile kommt nur ein mal ab, aber er kommt eben in jedem Programmdurchlauf an die Zeile ;)



    LG

  • Hmm..ok, also ich hab das Ganze jetzt erstmal in den draw Bereich gepackt und zwar so:
    [lua]
    function lowFuelIndicator:draw()
    if self.fuelFillLevel <= (self.fuelCapacity / 100) * 90 then -- 90% nur zu Testzwecke
    self.lowFuelIndicatorHud:render(); -- Ruft das overlayHud auf
    if self.playedSound == false then
    playSample(self.lowFuelSoundId,1,1,0);
    self.playedSound = true;
    else
    self.playedSound = false;
    end;
    end;
    end;
    [/lua]


    Im load Bereich habe ich zusätzlich noch:
    [lua]
    self.playedSound = false;
    [/lua]
    ..nachgetragen aber es ändert sich nicht, wird immernoch x mal abgespielt.

  • jap..


    Schau mal, ich versuche das mal mit Kommenaren in der LUA zu erklären.


    [lua]
    function lowFuelIndicator:draw() -- das hier wird bei jedem Programmdurchlauf ein mal aufgerufen, sofern du nicht im Händler bist oder so
    if self.fuelFillLevel <= (self.fuelCapacity / 100) * 90 then -- 90% nur zu Testzwecke -- diese If Bedinung wird also jedes mal abgefragt. SOBALD sie erfüllt ist wird das was darin steht aufgerufen
    self.lowFuelIndicatorHud:render(); -- Ruft das overlayHud auf
    if self.playedSound == false then -- Falls nun also deine erste Bedingung erfüllt ist, der Tank unter 90%, dann wird das Hud gerendert, und diese If-Bedinung aufgerufen.
    playSample(self.lowFuelSoundId,1,1,0); -- ist self.playedSound false, ist die Bedingung erfüllt, und der Sound wird abgespielt
    self.playedSound = true; -- ebenfalls wird nun self.playedSound auf false gesetzt. Damit ist die Bedinung nicht mehr erfühllt
    else -- dieses Else bedeutet, dass wenn das was in der if-Bedinung abgefragt wird nicht erfüllt wird, das dem else folgende aufgerufen wird.
    self.playedSound = false; -- ist also self.playedSound false, ist die if-Bedinung nicht erfüllt, und das hier wird aufgerufen.
    end;
    end;
    end;


    [/lua]


    Du setzt also gerade in dem Moment self.playedSound immer wieder auf false, sobald es auf true ist.. ;) Könnte dir ja auch einfach sagen, dass das else in der falschen if-Bedinung ist, und ich die andere gemeint habe. Aber ich möchte ja dass du verstehst was genau in der LUA passiert, und was warum ist :)




    LG
    ps. das else muss in die if-Abfrage, die abfragt ob der Tank unter dein minFüllstand fällt. D.h. sobald der Tank größer ist wird self.playedSound auf false gesetzt, sodass wenn der Tank kleiner wird der Sound wieder abgespielt werden kann

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!