23.05.2017, 11:23 | #1 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
While > if > else Problem mit sounds
Hallo!
Ich habe folgendes Konstrukt: Code:
while {true} do { if (var > x) then { _obj say "sound"; } else { deleteVehicle _obj; }; sleep 0.5; }; - prüfe alle 0,5 Sek., ob var > x - wenn ja, spiele den Sound - spiele den Sound aber nicht mehrfach, sondern nur einmal - wenn var <= x, dann kille den Sound und prüfe wieder von vorne Mein Problem: Ohne ein Dummy anzulegen, das den Sound "sagt", kann ich den Sound unten in der else-Schleife nicht beenden. Ich müsste also irgendwie dem Dingens sagen "wenn der Sound spielt, dann leg' bitte beim nächsten Schleifendurchgang nicht noch eine Soundquelle an, sondern im besten Fall, lass den Sound doch einfach weiterspielen, bis else erfüllt ist, dann breche den Sound aber gnadenlos ab. Aber da habe ich mir bis jetzt (vermutlich durch Knoten im Kopf) die Zunge dran ausgebissen. Hat jemand 'ne Gnaden-Idee für mich, oder einen ganz anderen Ansatz, der das Ziel auch erfüllt? Wie gesagt, Optimum: Es spielt solange der Sound hintereinander, bis else erfüllt ist, aber gleichzeitig wird alle 0.5 Sek. überprüft, ob var > x. |
23.05.2017, 17:18 | #2 (permalink) |
_obj say "sound";
waitUntil {wasauchimmer}; deleteVehicle _obj; Man kann es sich auch kompliziert machen...
__________________
Niemand hat die Absicht eine Tüte zu bauen! ___<<<A3 Wounding System>>>___ |
|
23.05.2017, 18:34 | #3 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Danke Pfandgiraffe, aber so einfach ist es leider nicht.
Ziel: Spieler sollen unter Wasser Geräusche von sich geben. Gleichzeitig soll ein Effekt einsetzen, sobald sie unter Wasser sind und wieder langsam ausblenden, wenn sie rauskommen. Der Sound soll aber SOFORT enden, wenn die Spieler die Oberfläche durchbrechen und weiterloopen wenn sie unter Wasser sind. Problem 1: Wenn ich einen wait/sleep einbaue, klappt das mit dem Effekt nicht, weil der dann solange warten muss, wie der Sound spielt. Wenn der Sound neu generiert wird, muss der Effekt dann - selbst wenn die Spieler schon längst wieder an der Oberfläche sind - trotzdem solange warten, wie der Sound spielt. Das kann dazu führen, dass es komplett verschwommen und dunkel wird, obwohl die Spieler nicht mehr unter Wasser sind. Problem 2: Fange ich nichts ab, wird in der Schleife alle 0.5 Sekunden (Check ob Spieler unter Wasser) das _obj neu erzeugt, die Sounds fangen an, sich zu überlagern. Fange ich es ab, z.B. mit einem isNil _obj, dann habe ich das Problem, dass zwar die _obj nicht neu erzeugt werden, aber leider eben auch nicht, wenn der Sound zu Ende ist, sprich, da loopt dann auch nix mehr, der Sound endet nach einmal abspielen. Und da beisst sich der Code in den Schwanz. Ich kriege es nicht hin, dass der Sound loopt, solange der Spieler unter Wasser ist und sofort endet, wenn er die Oberfläche durchbricht. Es gibt nicht zufällig einen Befehl um Sounds zu beenden (was meiner Logik entspräche; dieses Objekt Erzeugen um Sound beenden zu können, ist irgendwie verquer)? Oder einen anderen Ansatz, der das Problem geschickt umgeht? VG! Geändert von wolkenstuermer (23.05.2017 um 18:38 Uhr). |
23.05.2017, 19:28 | #4 (permalink) |
Registriert seit: 08.08.2015
Beiträge: 46
|
Gibt es denn eine Möglichkeit abzufragen, wann er mit dem Sound fertig ist? Nach dem Motto
Code:
waitUntil {var == "false" or !alive player or (isNull sound) }; Warte bis: - die Variable auf "false" steht oder - der Spieler tot ist oder - der Sound fertig abgespielt hat Geht das und wenn ja wie? |
07.08.2017, 11:02 | #5 (permalink) |
Registriert seit: 29.10.2008
Beiträge: 1.192
|
Also erst einmal kann man in Arma nicht wirklich einen Sound, der bereits angefangen hat, beenden. Quelle: BI Forums.
https://forums.bistudio.com/forums/t...omment=1808120 Ähnlicher Workaround: Erstelle ein invisible H, attachTo Player. Lass das H den Sound ausgeben und wenn du willst, dass er beendet wird, lösch das invisible H. Ist der Spieler wieder unter Wasser mit createVehicle ein neues H und so weiter... Und den While true loop würde ich eher mit einem EventHandler lösen, wenn das möglich ist. Vllt. mit AnimChanged. Ist auch gleich der Erste in der Liste: https://community.bistudio.com/wiki/...rs#AnimChanged Dann finde heraus, wie die Animation unter Wasser heißt und gleiche diese dann mit If Else Condition ab. Das Problem mit While {true} ist, dass dieser niemals endet. Endlosschleife. Irgendwie nicht gut. Zu der Möglichkeit, ob der Sound fertig ist. Meines Wissens nicht. Jedoch kannst du einfach die genaue Zeit der Sound File herausfinden (z.B. 5 Sekunden) und mit sleep 5 halt dein Script schreiben. Würde eine .sqf verwenden. Code:
_unit addeventHandler {"AnimChanged", {if ((animationState player) == "deine_animation") then {"deineSqf.sqf"};}}; Code:
_h = "Land_HelipadEmpty_F" createvehicle (position player); player attachTo [_h, [0, 0, 0] ]; // zweiter Array ist bezogen auf offset _soundLength = 3; // oder '_this select 0' für Parameter beim Aufruf der Funktion /SQF while {(animationState player) == "deine_animation"} do { _h playSound3D _soundfile; sleep _soundLength; }; Geändert von JSR (07.08.2017 um 11:20 Uhr). |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|
Ähnliche Themen | ||||
Thema | Autor | Forum | Antworten | Letzter Beitrag |
Loadout nach Respawn geht mit EDEN nicht mehr | Wolkenbeisser | Editing & Scripting | 2 | 01.04.2016 23:42 |
Entwaffnung von toten Spielern | Wolkenbeisser | Editing & Scripting | 12 | 16.04.2014 08:49 |
J.S.R.S - Jarhead's Sounds-Redeployment Systems | Termi | Mods & Addons | 508 | 08.01.2013 15:19 |
eigene sounds problem | miromanu | Editing & Scripting | 27 | 03.10.2011 19:37 |
WarefareBE 2.069 (Probleme) | Jackrkc | Usermade Missions | 6 | 22.07.2011 14:01 |