sound Problem, oder auch was ist passiert?

ikon

Mit Glied
Hi,
ich bin immer noch an meinem Spiel beschäftigt und wollt mich nun an den sound machen. Da es in keinem der von mir gefundenen Tutorials eine Beschreibung dazu gab wie man z.B. in einer onClipEvent Prozedur einen sound nicht ständig abspielen lässt. Eines meiner Probleme ist dass auf Tastendruck ein Movieclip abgespielt wird, der sich gleichzeitig bewegt. Funktioniert ja alles ganz toll. Aber nun soll genau auf Tastendruck ein Sound abgespielt werden, was durch die onClipEvent(enterFrame) Prozedur nicht möglich ist da der sound, genau wie die Bewegung ständig instanziiert wird.
Das ganze wär auch gar nicht so schwer gewesen, bin ja nicht auf den Kopf gefallen und kann auch suchen, nur auf meiner Suche bin ich dann auf Sackgassen wie diese hier gestossen. Also was ist passiert? Habt ihr das per PN oder ähnliches gelöst? Ich wüsste gern wie der thread weitergeht, weil bisher hab ich nichts besseres gefunden und scheinbar hatte der Herr loeffellutscher damals ähnliche Probleme wie ich jetzt.

mfg

ikon

//edit:
loeffellutscher hat gesagt.:
upps.... hab was vergessen.

Ich hab im Suchen gesucht aber nichts gefunden....

Thx schonmal und frohe Weihnachten
loeffellutscher
 
Zuletzt bearbeitet:
Hi,

hmm, es gibt hier meiner Meinung nach noch mehr Sound-Threads, bei denen auch eine Lösung genannt wurde...

Na ja, Du hast generell zwei Möglichkeiten:
  • Einen MovieClip, in dem sich der Sound im ersten Frame befindet, abspielen

  • Mit dem Sound-Objekt arbeiten (die elegantere Variante)
Lege Dir zunächst auf _root die Sounds an, die Du brauchst:
PHP:
var laser = new Sound();
laser.attachSound("laser.mp3");

var explosion = new Sound();
explosion.attachSound("explosion.mp3");

Die beiden Sounds "laser.mp3" und "explosion.mp3" müssen sich in der Bibliothek befinden, und zum Export für AS freigegeben sein (Rechtsklick: Verknüpfung).

Nun kannst Du diese Sounds von überall aus starten:
PHP:
on(press) {
    _root.laser.start();
}
, oder eben auch auff Tastendruck.

Tipp: schau Dir mal die Hilfe zum Sound-Objekt an, da findest Du auch praktische Methoden wie "setVolume" oder "setPan".

Gruß
.
 
Hi,
danke für die Blitzantwort. Das implementieren der sounds und damit als Objekt arbeiten dürfte kein Problem darstellen, da es ja in der Tat ausführlich in anderen Threads schon beschrieben wurde. Mein Problem ist viel mehr die fehlende Erfahrung meinen Denkansatz wie ich das ganze nur einmal abspielen lasse umzusetzen. Dafür benötige ich eine Funktion die dem sound sagt dass obwohl die Taste gedrückt ist, der sound nur im ersten abfragenden Frame abgespielt wird.

mfg und thx nochmal

D
 
Hi,

ich würde die Tastenanschläge nicht mit Key.isDown oder dergleichen abfragen, sondern mit einem KeyListener (onKeyDown) - dann wird nichts aufgerufen, solange Du mit dem Finger auf der Taste bist...

Alternativ kannst Du die Funktionen zum Abspielen der Sounds "wrappen" und so z.B. erst erlauben, einen Sound erneut abzuspielen, wenn der vorherige zu Ende ist (oder eine bestimmte Zeitspanne vergangen ist):
PHP:
sound1.attachSound("bla.mp3");
sound1_blocked = false;
sound1.onSoundComplete = function() {
    sound1_blocked = false;
}

function playSound(sname, vol) {
    if (this[sname + "_blocked"] == false) {
        this[sname].setVolume(vol);
        this[sname].start();
        this[sname + "_blocked"] = true;
    }
}

Wenn Du an isDown etc. gebunden bist, könntest Du dennoch beim Abspielen eine "blocked"-Variable setzen, die Du beim Ereignis "onKeyUp" (diesen Listener müsstest Du dann eben implementieren) wieder zurücksetzt.

Gruß
.
 
Hi,
jo, genau sowas habe ich gesucht. Sowas ähnliches hatte ich sogar schon probiert allerdings mit sound in movieclips verpackt und wieder verworfen weils nicht funktioniert hat. Das ganze sah bei mir so aus:
PHP:
onClipEvent(load){
	this.playagain=function() {
		this.soundplayed=0;
	}
}
onClipEvent (enterFrame) {
	if(key.isDown(key.RIGHT)){
	this.soundplayed=1;{
		if (this.soundplayed==1){
			gotoAndStop(1);
			}
		}
	}
	else if(key.isDown(key.LEFT)){
	this.soundplayed=1;{
		if (this.soundplayed==1){
			gotoAndStop(1);
			}
		}
	}
}
onClipEvent (keyUp) { 
	if (Key.getCode() == key.RIGHT) { 
	this.playagain;
	}
	if (Key.getCode() == key.LEFT) { 
	this.playagain;
	}
}

Ich werde das mal mit einer "blocked" Variable versuchen, da ich keine Lust habe meine ganzen Bewegungs-"engine" ;) umzuschreiben. Vielen Dank erstmal für Deine Mühe, falls Interesse an der Datei besteht, ich habe sie hier hochgeladen.

mfg

//edit:
Datei mit Rechtsklick-> "speichern unter..." speichern, weil sonst lycos meckert...
 
Zuletzt bearbeitet:
Hallo nochmal,
ich habe das ganze jetzt mal ausprobiert. Im Grunde genommen müsste es funktionieren. Die Funktion habe ich auf ein Schlüsselbild auf einer extra Ebene geschrieben. Sie wird dann im script des Movieclips, welcher per Tastatur gesteuert wird, aufgerufen. Dort habe ich auch noch den keyUp Listener eingefügt um die "blocked" Variable wieder zurückzusetzen

@Datic: Es wäre nett wenn Du mal in meine Datei schauen könntest was ich wo falsch gemacht habe, denn ich finde keinen anderen Lösungsansatz. Ich habe sie ins Netz gestellt, Du kannst sie mit Rechte Maustaste->"Ziel speichern unter..." runterladen.
Leider ist der komplette gepackte Ordner 4.5 MB gross, da ich keine Lust habe jedesmal wenn ich eine Frage habe meine .fla auf 200kb zu reduzieren.

mfg

D
 
Hi,

Aaaaalso:

- zuerst musst Du Deine Sounds in der Bibliothek zum Export freigeben

- dann darf der der Funktion "playSound" übergebene Parameter nicht den gleichen Variablennamen wie Deine Soundvariable haben. Ausserdem fehlt bei Deinem Vergleich ein Gleichheitszeichen (so weist Du der Variable einen Wert zu und die Bedingung ist immer wahr). Die Funktion kann dann so aussehen:
PHP:
function playSound(sound, vol) { 
	if (this[sound + "_blocked"] == false) { 
		this[sound].setVolume(100); 
		this[sound].start(); 
		this[sound + "_blocked"] = true; 
	}
}

- Dann rufst Du die Funktion playSound auf _root.sounds auf - es gibt aber kein Objekt namens "sounds" auf _root. "_root.playSound" genügt.

- Zudem übergibst Du der Funktion keinen Parameter... hier sollte (siehe mein Posting) der Name des Sounds als String übergeben werden, also so:
PHP:
	if((Key.isDown(key.RIGHT))&&(this._x<400)){
		this._x+=Geschwindigkeit;
		_root.playSound("sound1");
		gotoAndPlay(3);
	}
	else if((Key.isDown(key.LEFT))&&(this._x>65)){
		this._x-=Geschwindigkeit;
		_root.playSound("sound1");
		gotoAndPlay(2);
	}

- Dann versuchst Du bei keyUp wieder _root.sounds... anzusprechen - auch hier: weg damit!

- Zusätzlich ist der Ausdruck _root[sound1 + "_blocked] falsch, denn sound1 ist ja das Soundobjekt und kein String. Dieser Block müsste dann so aussehen:
PHP:
onClipEvent (keyUp) { 
	if (Key.getCode() == key.RIGHT) { 
		_root["sound1_blocked"] = false;
	}
	if (Key.getCode() == key.LEFT) { 
		_root["sound1_blocked"] = false;
	}
}

Ändere das und es funktioniert.

Gruß
.
 
Hi,
vielen Dank für deine ausführliche Antwort, Datic. Das mit den Parameternamen in Deinem vorigen Post hatte ich auch nicht ganz verstanden, hatte deswegen auch mehrere Fehlermeldungen die ich dann irgendwie behoben habe. _root.sounds versuche ich anzusprechen weil ich eine Bildmarkierung namens "sounds" habe, auf dem Frame liegt auch die Funktion. Ich wusste nicht wie ich sie sonst ansprechen sollte da sie zwar auf der Hauptzeitleiste, allerdings auf einer neuen Ebene liegt.
Werd mich gleich mal ransetzen und versuchen das ganze umzusetzen.

Danke und Gruß

D
 
Hi,

Objekte werden über ihre Verschachtelungstiefe (sprich: MovieCliphierarchie) angesprochen. Die Ebene ist irrelevant. Dabei wird immer der Frame adressiert, in dem sich der Abspielkopf zur Zeit befindet - Scripts in anderen Schlüsselbildern kannst Du nicht ansprechen. Das macht aber hier nichts, weil sich der Film ja die ganze Zeit im richtigen Frame befindet. ;)

Gruß
.
 
Hi,
hab mein Script nach Deinen Angaben verändert. Ich musste nur noch die onSoundComplete Funktion rausnehmen, da der sound ja erst bei Richtungswechsel oder erneutem Tastendruck abgespielt werden soll. Aber nun funktioniert es genau so wie ich möchte. thx nochmal

mfg

D
 
Zurück