ActionScript - Anfänger - Probleme mit Button-Sounds

Tinobee

Mitglied
hallo gemeinde,

ich bin grad die 2. woche an flash dran, weil ich eine arbeit erstellen und abgeben muss. das soll ein handy für blinde-interface sein, welches logischerweise alle aktionen akustisch rückmeldet. das interface steht und die navigation läuft soweit auch wie gewünscht. das einzige, was die ganze geschichte enorm verkompliziert ist der button-sound. ich lege dazu für eine zifferntaste zum beispiel folgenden code an:
PHP:
on(press) {
   var tmpSound:Sound = new Sound(this);
   if(Bedingung1) {
       tmpSound.attachSound("filex.wav");
       tmpSound.start();
   } else {
       tmpSound.attachSound("frage1.wav");
       tmpSound.start();
       timeout = setTimeout(ansage(text),1000);
       tmpSound.attachSound("frage2.wav");
       tmpSound.start();
   }
}
das timeout funktioniert nur, wenn ich damit die soundausgabe einer anderen funktion aufrufe, sprich zwischen frage1.wav und timeout wird eine pause von 1 sekunde gemacht, aber zwischen frage1.wav und frage2.wav nicht. folglich werden frage2.wav und der sound der funktion ansage() zeitgleich abgespielt und überlappen. dieses problem verteilt sich flächendeckend über meine ganze anwendung.

weil mir auffiel, dass es mit dem delay beim aufrufen von funktionen klappt, hab ich mir direkt eine solche angelegt:
PHP:
function playSound(soundName:String) {
   var tmpSound:Sound = new Sound(this);
   tmpSound.attachSound(soundName+".wav");
   tmpSound.start();
}
an diese übergebe ich nun per on(press) den dateinamen. jedoch wurde meine hoffnung dadurch zerstört, dass ein aufruf der art...
PHP:
on(press) playSound("file1");
timeout = setTimeout(playSound("file2"),5000);
... nicht die gewünschte lösung liefern konnte. ich finde einfach mit meinem aktuellen wissen keine möglichkeit, tmpSound mit seiner ersten belegung zuende spielen zu lassen und danach erst die neue belegung derselben variablen zu starten. dadurch wird es mir unmöglich, soundausgaben zu kombinieren und so flexibler zu sein. ich muss zum gegenwärtigen zeitpunkt alle möglichken kombinationen vorweg aufnehmen und habe so schon zig .wav dateien in der bibliothek, die jedes mal in einer if-abfrage auf den jeweiligen zustand hin verteilt werden - und das pro knopf! das ist echt anstrengend und kann nicht der einzige weg sein.

habe ich eine etwas übersehen? oder weiß ich etwas noch nicht? vielleicht nur ein kommando, oder wie kann ich die sache ohne größeren aufwand noch in den griff bekommen? ( ... noch ... weil ich in 3 tagen meine arbeit in der schule abgeben muss)

grüße,

tinobee
 
14 klicks und niemand weiß was dazu zu sagen?
Die können auch durch Suchmaschinen-Spider entstehen. Ich habe den Thread bisher übersehen, insofern ist das Threadpushing noch mal verzeihbar. ;)

Ich habe jetzt Feierabend, aber morgen Vormittag werde ich mich dem Thema annehmen.

Gruß
.
 
na da hab ich ja nochmal glück gehabt :)

ich konnte inzwischen einen teil des problems lösen. mir war nicht bekannt, dass man die setTimeout() funktion anders schreiben muss, damit es auch damit klappt, eine verzögerung zu verursachen. anstelle von
PHP:
timeout = setTimeout(playSound("file2"),5000);
muss es nämlich so heißen
PHP:
timeout = setTimeout(playSound,5000,"file2");
allerdings besteht noch immer das problem, dass ich stellenweise mit dynamisch wachsenden sprachausgaben (unbestimmbar lange telefonnummer) zu tun habe und hier nicht eine ausgabe von zum beispiel
(Verbindung)+(zu nummer)+(1234567890)+(wird hergestellt)
über die setTimeout()-funktion erstellen kann, weil die ansage der telefonnummer durch eine funktion erzeugt wird, welche den string erst zerhackt und die substrings den einzelnen buchstaben-soundfiles zuweist, welche dann ihrerseits wieder zurückkommen. obiges beispiel ist also eine kombi aus
PHP:
//play Soundfile
playSound("Verbindung");
//play zweites Soundfile
timeout = setTimeout(playSound,1200,"zu_nummer");
//starte String to Soundfile-Funktion
timeout = setTimeout(getSoundFromString,2000);
//play drittes Soundfile
timeout = setTimeout(playSound, ........ ,"wird_hergestellt");
hier bräuchte ich eine möglichkeit, unmittelbar am ende der telefonnummer ansetzen zu können, wobei diese ausgabe wie gesagt beliebing lang sein kann. wie kann ich das ohne größeren aufwand lösen? bitte bedenke bei deiner antwort, dass ich grad die erste woche an flash sitze und daher noch so gut wie keinen plan von den schweren sachen habe. über entsprechend ausführlichere erläuterungen würde ich mich wirklich sehr freuen. ;-)

schonmal vielen dank vorweg für deine bemühung! ich geh jetzt auch mal pennen. kann ja nicht jede nacht bis 3 machen... :rolleyes:

gruß, tino

PS:
du hast denselben namen, wie mein alter schulkamerad, welcher einst konditor lernte. hatte schon gegrübelt, ob du das eventuell sein könntest, aber vom konditor zum flasher... :suspekt:
 
Hi,

wenn Du Sounds sequentiell abspielen willst, würde ich mit Callbacks über die onSoundComplete-Methode arbeiten.

Ein kleines Beispiel:
Code:
var _soundchain = new Array();
var _soundidx = 0;

var snd = new Sound(this);

snd.onSoundComplete = function() {
	_soundidx ++;
	if (_soundidx < _soundchain.length) playNextSound();
}

function playChain(sounds) {
	_soundchain = sounds;
	_soundidx = 0;
	playNextSound();
}

function playNextSound() {
	snd.attachSound(_soundchain[_soundidx]);
	snd.start();
}

playChain(new Array("01.mp3", "02.mp3", "03.mp3"));

Gruß

P.S.:
hatte schon gegrübelt, ob du das eventuell sein könntest
Eher nicht, ich mag nicht mal Kuchen ... ;)
.
 
hallo tobi,

vielen dank schonmal für deine frühe und detaillierte antwort. was mir zum verständnis fehlt sind ein paar kommentare zu den funktionen. ich steige da so spontan nicht wirklich durch - auch nicht über die wahl der bezeichner. auch erschließt sich mir nicht, woher du in diesem codefragment
PHP:
#
function playChain(sounds) {
#
    _soundchain = sounds;
auf einmal den parameter "sounds" hast. ich weiß nicht, ob ich meine 50+ sound files jetzt alle in dieses array eintippen muss oder wie das genau sein soll. wie ist in umgangssprache beschrieben der ablauf deines scriptes? ich meine, wer ruft wen und was bedeuten die variablen? ich will ja im prinzip nur 2 soundereignisse aufeinander ausrichten, von dem das eine über eine eigenständige funktion erzeugt wird. ich habs zwischenzeitig mal mit der online referenz von adobe zum thema onSoundComplete versucht und meinen zweiten soundaufruf gegen diesen code ersetzt
PHP:
var next_Sound:Sound = new Sound();
next_Sound.attachSound("wird_hergestellt.wav");
next_Sound.onSoundComplete = callNextSound;
next_Sound.start();
diesen habe ich per if/else abfrage in die splitfunktion gehängt, sodass wenn der string zuende zerhackt ist und die letzte soundausgabe erfolgte, der leere string diese funktion aufruft. das funktioniert soweit. dennoch blicke ich bei meinem derzeitigen wissensstand von einer woche noch nicht wirklich was dein script genau tun soll. daher wären "übersetzungen" doch recht hilfreich :)

gruß, tino
 
Zuletzt bearbeitet:
Hi,

hier mal mit Kommentaren:
Code:
var _soundchain = new Array();// Array, welches die Liste der hintereinander
// abzuspielenden Sounds aufnimmt
var _soundidx = 0; // Nummer des aktuell abgespielten Sounds

var snd = new Sound(this); // wir brauchen nur ein Soundobjekt

snd.onSoundComplete = function() { // ist der Sound zuende ...
	_soundidx ++; // ... zählen wir hoch, und ...
	// wenn ich noch nicht am Ende der Liste bin ...
	if (_soundidx < _soundchain.length) playNextSound(); // .. wird der nächste Sound abgespielt.
}

function playChain(sounds) { // Mit dieser Funktion kann eine Liste von Sounds
	// hintereinander abgespielt werden
	_soundchain = sounds; // wir speichern die übergebene Liste
	// in unserem globalen Array
	_soundidx = 0; // der aktuelle Sound ist 0, da wir ja von vorne beginnen
	playNextSound(); // ersten Sound abspielen (und die Kette damit starten)
}

function playNextSound() { // nächsten Sound abspielen
	snd.attachSound(_soundchain[_soundidx]); // Sound mit der aktuellen Nummer instanzieren
	snd.start(); // Sound abspielen
}


// Das folgende ist ein Beispielaufruf der Funktion "playChain", um zu zeigen,
// wie eine Liste von Sounds hintereinander abgespielt werden kann.
// Die Sounds werden der Funktion als Array übergeben.
// Du übergibst immer nur die Sounds, die auf einmal hintereinander
// abgespielt werden sollen.

// Dies ist übrigens die einzige Funktion aus meinem Code, die Du aufrufen musst.

playChain(new Array("01.mp3", "02.mp3", "03.mp3"));
// spielt 3 Sounds hintereinander ab

Beim Aufruf wie in meinem Beispiel, wird der Code folgendermaßen abgearbeitet:
Code:
-- Funktion playChain startet
-- Funktion playNextSound startet
-- Ereignis "onSoundComplete" für den ersten Sound tritt ein
-- Soundnummer wird hochgezählt
-- Funktion playNextSound für den zweiten Sound startet
-- Ereignis "onSoundComplete" für den zweiten Sound tritt ein
-- Soundnummer wird hochgezählt
-- Funktion playNextSound für den dritten Sound startet
-- Ereignis "onSoundComplete" für den dritten Sound tritt ein
-- da der dritte der letzte in der Liste ist, wird die Folge beendet.

Gruß
.
 
ok, damit wird es schon klarer. danke für deine mühe! :)

gibt es eine möglichkeit, einen laufenden sound zu stoppen, damit sich die durch andere buttons aufgerufene sounds nichts überlagern? also z.b. wenn ich das gerät einschalte, wird eine lange meldung über den status und die bedienung ausgegeben. für nutzer, die das schon wissen, sollte beim druck auf eine andere taste z.b. die taste telefonbuch, welche "telefonbuch geöffnet" ausgibt, die noch laufende vorige Ausgabe damit sofort gestoppt werden.

ich hab mal was gelesen von Sound.stop()

nur wie übergeb ich das meiner obigen funktion playSound(file:String) {} ? oder gibts dafür ein globales kommando?
 
Hi,

wenn Du die Funktion "playChain" aufrufst, wird die aktuelle Kette automatisch unterbrochen.

Wenn Du andere Soundobjekte stoppen willst, kannst Du die Methode "stopAllSounds()" verwenden.

Gruß
.
 
hallo tobias,

ich hab mich mit meinem alten script inzwischen schon so verheddert, dass ich es bis heute abend nicht mehr schaffe, das auf dein system umzuschreiben. ich bin froh, dass überhaupt was rauskommt, auch wenn es sicher anfängertypisch in den wichtigsten funktionen total kompliziert geschrieben ist. das mit dem array verstehe ich theoretisch, jedoch bekomme ich es nicht implementiert. dazu fehlt mir noch einiges grundlagenwissen. das stopAllSounds-events funktioniert prinzipiell, jedoch nicht wie gewünscht bei meiner implementierung.muss mir das alles nochmal in ruhe durch den kopf gehen lassen und etwas neues bauen. meine hausarbeit kann ich nicht mehr retten.

dennoch danke für deine gute hilfe! :)

gruß, tino
 
Zurück