Problem beim zugreifen auf Sound Methoden ...

mosha

Mitglied
Einen schoenen guten Tag Flash Forum,

ich habe jetzt schon verschiedene Varianten ausprobiert, und wenn ich das Soundobjekt nicht in einer Funktion erstelle, kann ich auch auf seine Methoden zugreifen, aber sonst nicht.
Der Soundfile befindet sich, mit entsprechenden Identifier, in der Library. Da ich das ganze fuer eine Soundinstallation nutzen moechte, brauche ich kein Streaming zu nutzen.
Der Button ist eigentlich nur als Test gedacht um zu schauen, ob ich auf die Methoden zugreifen kann.
Wie auch immer, das beste ist, ich zeige euch einfach den Code:
Code:
function addSound(container:String, mySoundID:String, my_sound:Sound) {
	this.createEmptyMovieClip(container, this.getNextHighestDepth());
	
	my_sound = new Sound(conatiner);
	my_sound.attachSound(mySoundID);
	my_sound.onSoundComplete = function() {
		my_sound.start();
	};
	my_sound.start(0, 100);
}

addSound("sndHolder8_mc", "8", snd8);

var leise:Boolean = false;

this.btn_mc.onRelease = function() {
	trace(this.sndHolder8_mc.snd8.getVolume());
	if (leise == false) {
		this.sndHolder8_mc.snd8.setVolume(20);
		leise = true;
	} else {
		this.sndHolder8_mc.snd8.setVolume(100);
		leise = false;
	}
};

Ich dachte es laege daran, dass ich das Soundobjekt keinem Movieclip zugewiesen habe, aber das scheint es auch nicht zu sein.

P.S.
Bei der aktuellen Umfrage, zaehlt da Studium zu Beruf oder Freizeit? Wahrscheinlich ist das Ansichtssache, oder?
 
Hi,

auf den ersten Blick:

Fehler #1: Schau mal hier:
Code:
my_sound = new Sound(conatiner);
Fällt Dir was auf? ;)

Fehler #2:
Code:
	my_sound.onSoundComplete = function() {
		my_sound.start();
	}
In der Funktion "onSoundComplete" dürfte "my_sound" nicht mehr bekannt sein, wenn die Variable lokal in einer Funktion definiert wird. Du verwendest zwar kein "var" in der Funktion, kannst diese so aber nur für genau einen Sound verwenden. Probiers lieber so:
Code:
	my_sound.onSoundComplete = function() {
		this.start();
	}

Fehler #3:
Code:
this.sndHolder8_mc.snd8.setVolume(20);
Du erstellst nirgendwo ein Soundobjekt namens "snd8" in Deinem Container. Du müsstest den Sound schon in Deiner Funktion dem Container als Unterobjekt zuordnen:
Code:
var ct = this.createEmptyMovieClip(container, this.getNextHighestDepth());
ct.snd= new Sound(ct);

// und später:
this.sndHolder8_mc.snd.setVolume(20);

Fehler #4: Es kommt zur Konfusion, wenn Du a) den Container als String an Deine Methode übergibst, dann aber b) einen MC mit diesem Instanznamen erstellst. Zweifelhaft, ob dann beim Erstellen des Soundobjektes korrekterweise die neue Referenz verwendet wird. In meinem vorherigen Beispiel habe ich das korrigiert.

Gruß
.
 
Hallo Tobias (ich hoffe ich darf dich duzen),

danke fuer deine Antwort.

Ich bin irrtuemlicher Weise, davon ausgegangen, dass, da der Name in der createEmptyMovieClip Methode(?) in Anfuehrungszeichen steht, man ihn als String uebergeben kann.
Irgendwie funktioniert es immer noch nicht.

Bei dem Code muesste doch jetzt eigentlich alles stimmen, oder?

Code:
function addSound(container:MovieClip, mySoundID:String, my_sound:Sound) {
	var ct = this.createEmptyMovieClip(container, this.getNextHighestDepth());
	
	var my_sound = new Sound(ct);
	my_sound.attachSound(mySoundID);
	my_sound.onSoundComplete = function() {
		this.start();
	};
	my_sound.start();
}

addSound(sndHolder8_mc, "8", snd8);

var leise:Boolean = false;

this.btn_mc.onRelease = function() {
	trace(this.sndHolder8_mc.my_snd8.getVolume());
	if (leise == false) {
		this.sndHolder8_mc.snd8.setVolume(20);
		leise = true;
	} else {
		this.sndHolder8_mc.snd8.setVolume(100);
		leise = false;
	}
};

Ich habe es ohne Parameterangaben bei der addSound Funktion probiert – nix. Dann ohne einen Container Movieclip zu erstellen – nix. Anschliessend ohne das ganze in eine addSound Funktion einzubetten – nix. Letztendlich ohne addSound und ohne createEmptyMovieClip, kann ich auf den Sound zugreifen. But why that?:

Works:
Code:
//function addSound() {
	//var ct = this.createEmptyMovieClip("container", this.getNextHighestDepth());
	
	var my_sound = new Sound();
	my_sound.attachSound("8");
	my_sound.onSoundComplete = function() {		
		this.start();
	};
	my_sound.start();
//}

//addSound();

var leise:Boolean = false;

this.btn_mc.onRelease = function() {
	trace(my_sound.getVolume());
	if (leise == false) {
		my_sound.setVolume(20);
		leise = true;
	} else {
		my_sound.setVolume(100);
		leise = false;
	}
};
Was mich wirklich frustriert, ist, dass es bereits bei einer so einfachen Sache nicht funktioniert. Die ich nur erstellt habe um heraus zu finden, wieso ich nicht auf den Sound zugreifen kann.

Mein eigentliches Ziel ist es, mehrere, um genau zu sein 12 sound instancen zu erstellen, und denen unter bestimmten Bedingungen, bestimmte Funktionen zuweisen.
Ich dachte an eine for Schleife, wenn alle Soundfiles in der Bibliothek nummeriert waeren.
Gestern habe ich noch folgenden Code geschrieben, der sogar funktioniert.
Code:
function addSound() {
	for(i = 0; i <=10; i++){
		var strValue:String = i.toString();
		trace(strValue);
		
		var mcName:String = strValue+"_mc";
		var depth:Number = i + 100;
		var sndName:String = "snd" + strValue;
		var sound:Sound = i;
		
	this.createEmptyMovieClip(mcName, depth);
	
	sound = new Sound(mcName);
	sound.attachSound(i);
	sound.onSoundComplete = function() {
		this.start();
	};
	sound.start();
	}
}

addSound();
Allerdings ist hier die Deklarierung(sagt man das?) wieder nicht korrekt.
Aber wie kann man zum Beispiel einen String in einen Variablennamen umwandeln? Also sagen wir ich habe, wie in meinem Fall, "8", moechte daran noch ein "_mc" dranhaengen, oder ein "snd" davorstellen. Um anschliessend das eine als Namen fuer einen MovieClip und das andere fuer ein Soundobjekt zu nutzen.

Ist jetzt ziemlich viel auf einmal und ich hoffe nicht zu dreist, das Thema gleich mit meinem weiteren Vorhaben aufzufuellen. Jedoch ist es denke ich sinnvoll, im Falle dessen, das man dann anders vorgehen sollte.

Danke schon mal im Voraus.
Ich schaue morgen wieder rein. Ist naemlich schon spaet hier in Sydney und morgen ist ja Uni. ;)
 
Das ist falsch:
Code:
addSound(container:MovieClip, mySoundID:String, my_sound:Sound) {
Ich habe nicht gesagt, dass Du eine Referenz auf einen MC übergeben sollst (der MC existiert ja noch nicht einmel). createEmptyMovieClip erwartet schon einen String als Bezeichner. Du solltest jedoch von der Rückgabefunktion dieser Methode gebrauch machen und die neue Referenz in einer anders benannten Variable ablegen.

Gruß
.
 
Entschuldige bitte, dass ich die Sache nicht "abgehakt" habe. Ich hatte mein Posting hier im Forum total vergessen, weil ich die letzten Tage an ganz anderen Sachen gearbeitet habe.

Gruss
 
Zurück