Anfängerfrage action script

ecki01

Grünschnabel
Erstmal Hallo zusammen, ich bin neu hier .
Neu bin ich auch in der flash Seitenerstellung (benutze flashMX) und da habe ich mal eine Frage an Euch:
Ich versuche einen sound abzuspielen, sobald ich mit der Maus auf ein Objekt klicke:

Zuerst erzeuge ich mir aus der Oberfläche ein neues sound objekt
Code:
music=new sound();
Jetzt kommen folgende zwei Objekte auf die Bühne(jeweils in eine eigene Ebene):
Eine Button Instanz (irgendein rechteck)
und
eine Movie Instanz (irgendein rechteck)

Ich wähle jetzt die Button Instanz mit der Maus aus und gebe folgenden Code ein:
Code:
on (press) {
	music.loadSound("eispiel.mp3");
	music.start(2,1);
	gotoandplay("los");
}
Dasselbe mache ich mit der Movie Instanz.

Nun das, was ich nicht verstehe:
Wenn ich auf die BUtton Instanz klicke funktioniert es(d.h. sound kommt),
wenn ich auf die Movie INstanz klicke funktioniert es nicht (d.h. kein sound kommt).
:confused:
Nur wenn ich zu dem code von der Movie instanz ein
Code:
music=new sound();
zufüge, geht es dort auch, jedoch wird mit jedem Klick das audio file erneut abgespielt (überlagert sich).:confused::confused:

Was mache ich falsch bzw. wie kann ich mit der movie INstanz ein Audio file abspielen, sobald ein ereingnis eintritt?


Danke schon einmal für die Antworten!
Mit schönen Grüssen
Ecki01
 
Zunächst mal zur ersten Frage:
Ein Movieclip hat im Gegensatz zu einer Schaltfläche eine eigene Zeitleiste. Willst du von diesem ein Objekt auf der Hauptzeitleiste ansprechen, musst du von der Movieclip-Zeitleiste eine Hierarchieebene zurück, also z.B. so
Code:
[...]
this._parent.music.loadSound("eispiel.mp3");
[...]
Und dann das zusätzliche music=new sound(); weglassen, denn damit erstellst du ein weiteres Soundobjekt, das ggf. mit dem ersten kollidiert.

Generell empfiehlt es sich, Soundobjekte eindeutig einer Zeitleiste zuzuordnen, also z.B.
Code:
music=new sound(this); // oder
music=new sound(instanznameeinesmovieclips);
Ansonsten landen alle auf _root und lassen sich auch nicht seperat steuern.

Möglicherweise erübrigen sich so auch die restlichen Fragen.

Gruß
Rena
 
Prima, das wars, hat geklappt!
Besten Dank für die Hilfe ! Umso ärgerlicher, dass in einem Flash MX Lernbuch dieser Beispielcode OHNE das this._root. stand :( :( :eek:

Nur zum verstehen:
Wenn ich zu Beginn
Code:
music=new sound (blabla)
schreibe, dann muss ich bei der Instanz mit der zeitleiste "blabla" trotzdem noch
Code:
this._parent.music.loadsound("eispiel.mp3")
schreiben, oder? (Betonung auf "this._parent.")

Stellen nur Zeitleisten eine neue Ebene dar? (Buttons z.B. liegen ja scheinbar auf derselben Ebene)?

Danke für die Antworten im voraus

grüsse
Ecki
 
Hallo,

verwechsel das bitte nicht:
_root bringt dich immer zur Hauptzeitleiste zurück; das heißt du brauchst kein this davor.
_parent bringt dich immer zu dem Movieclip zurück, der dem Movieclip, in dem der Code steht übereordnet ist. Beispiel: Du hast einen Movieclip "hallo_jens". In diesem Movieclip drin ist ein Movieclip "peter31". Wenn du jetzt innerhalb von peter31 _parent schreibst, bezieht sich der folgende Code auf hallo_jens. Würdest du _root schreiben, würde sich der Code auf keinen von Beiden beziehen.

Das blabla welches du bei new Sound() angiebst, gibt an, auf welchen Movieclip sich der Sound beziehen wird. Das heißt, dass du mit new Sound("hallo_jens") deinen Movieclip auf hallo_jens beziehst.

Ich persönlcih finde es besser, alle Sounds auf _root zu laden (also die Klammern frei zu lassen), dann weiß man von all seinen Sounds, wie man sie anspricht ohne ein MovieClip-Wirrwarr - wieso Rena dir das genau empfiehlt würde ich auch gerne wissen, vielleicht hab ich ja hier was verpasst :) Und dann halt so:

Code:
_root.meinSound = new Sound();
_root.meinSound.loadSound("bla.mp3", false);
_root.meinSound.onLoad = function() {
_root.meinSound.start();
}

Liebe Grü0e
jens
 
@Jens
Ich persönlcih finde es besser, alle Sounds auf _root zu laden (also die Klammern frei zu lassen), dann weiß man von all seinen Sounds, wie man sie anspricht ohne ein MovieClip-Wirrwarr - wieso Rena dir das genau empfiehlt würde ich auch gerne wissen, vielleicht hab ich ja hier was verpasst :)
Spätestens wenn du die Sounds getrennt voneinander steuern willst, also Buttonsounds lassen und Hintergrundgedudel ausschalten, oder die Musik in der Lautstärke reduzieren, während ein Erzähler spricht oder so, geht das nur, wenn die Soundobjekte verschiedenen Zeitleisten zugeordnet ist. :)

Auch bei hinzugeladenen Filmen könnte es für Verwirrung sorgen, da das Soundobjekt ohne eine konkrete Zuordnung dann auf einmal nicht mehr in dieser swf ist, sondern auf _level0, also im Hauptfilm. Die gleiche Geschichte wie mit _root, _parent und dem ganzen Pfadwirrwarr, der hier und da gefragt wird, das kennst du ja. :)
Deshalb bin ich generell immer dafür, selber zu bestimmen, wo was ist (das kann ja auch _root sein) und das nicht dem Programm zu überlassen. Es geht natürlich (abgesehen von der getrennten Soundsteuerung) auch anders, je nach persönlichem Gusto.

Das bewußt _nicht_ zu tun kann natürlich auch 'nen Sinn haben, eben wenn man z.B. ein globales Soundobjekt braucht um zum Beispiel auch Zeitleistensounds in der Lautstärke zu steuern oder Lautstärken von Videos in hinzugeladenen Filmen, von denen man z. B. den Aufbau nicht kennt und in denen kein Soundobjekt definiert ist, o.ä.. Das wären dann für mich aber eher Spezialfälle.

@ecki
Stellen nur Zeitleisten eine neue Ebene dar? (Buttons z.B. liegen ja scheinbar auf derselben Ebene)?
Buttons haben in der Tat keine eigene Zeitleiste, auch wenn das in der Autorenumgebung, mit den Zuständen "auf", "darüber" usw. so aussieht. Die sind so eine Art Zwitterwesen.
Generell ist der Begriff "Ebenen" auch nicht ganz zutreffend, sorry dafür. Die Hierarchie der durch Movieclips (auch _root ist eigentlich nur ein Movieclip, eben der Hauptmovieclip) verschachtelten Zeitleisten läßt sich vielleicht eher mit folgendem Beispiel beschreiben:
- Ein Auto (_root/Hauptzeitleiste), das fährt
- Ein Insasse in dem Auto (Movieclip "insasse" auf der Hauptzeitleiste) schwenkt einen MP3-Player hin und her
- In den MP3-Player (Movieclip "mp3" im Movieclip "insasse") wird Musik geladen

Wenn ich nun beim MP3-Player auf stop drücke, hält deswegen nicht das Auto an. Oder hört der Insasse auf zu schwenken, spielt die Musik dennoch weiter und auch das Auto fährt noch. Halte ich das Auto an, ist immer noch Musik zu hören usw.

Und nun zum Vergleich mit dem Soundobjekt (oder generell Befehlen innerhalb der Zeitleistenhierarchie):
Als Insasse muss ich (this) dem Auto (_parent) sagen, dass es anhalten oder nach links fahren soll, es genügt nicht, wenn ich es mir selbst (oder irgendwem, sprich undefiniert) sage. Will ich die Musik stoppen, muss ich von mir (Insasse/this) den Weg zum Soundobjekt suchen, das für das Gedudel im Mp3-Player verantwortlich ist. ;)

Grüße
Rena :)
 
Zuletzt bearbeitet:
Klare Ansage, verständlich ausgedrückt, so versteh ich das sogar heute abend nach nem Bier noch.

Und die Instanz des Buttons ist im Auto (sprich Hauptfilm) integriert, so dass er - im Gegensatz zum MP3 Player schwenkenden Beifahrer- den Befehl music= new Sound verstanden hat?
Jo, klingt logisch , dann will ich mal noch 'nen paar weitere Autos auf die Strasse schicken ;)

Bis dann und danke!

ecki01
 
Rena,
wie genau ist das denn mit den Soundobjekten? In der Hilfe steht nur, dass man mit dem Parameter einen Sound einem Movieclip zuweist. Wie spreche ich diesen dann an?

Was ist z.B. der Unterschied zwischen
_root.meinSound = new Sound(peter18);
_root.peter18.meinSound = new Sound();

Ich kann ja auch globale Sounds haben, z.b. "musik" und "erzaehler" und dann nur "musik.stop()" machen...?

Das mit dem Movieclipzuweisen war mir bisher nie so aufgefallen, deswegen wohl meine Vorliebe für _root :)
 
Zuletzt bearbeitet:
wie genau ist das denn mit den Soundobjekten? In der Hilfe steht nur, dass man mit dem Parameter einen Sound einem Movieclip zuweist. Wie spreche ich diesen dann an?
Immer mit dem Pfad zu der Zeitleiste, auf der das Soundobjekt erstellt wurde, sprich "lebt". Egal ob in der Klammer dann ein anderer Movieclip als "Behälter" definiert ist. Sag ich jetzt mal so ... irgendwie mach ich das immer "automatisch antrainiert", also ungetestet gerade.
Ich kann ja auch globale Sounds haben, z.b. "musik" und "erzaehler" und dann nur "musik.stop()" machen...?
Wenn beide auf einer Zeitleiste - oder eben ohne Definition in der Klammer immer auf _root bzw. _level0 - erstellt sind, stoppt das dann jedoch meines Wissens beide
Das mit dem Movieclipzuweisen war mir bisher nie so aufgefallen, deswegen wohl meine Vorliebe für _root :)
Das ging mir auch so, bis ich dann mal eben jenes Beispiel "Sound soll leiser werden weil Erzähler startet" gebraucht hab. Und das ging dann so nicht mehr, weil da beide leiser wurden. :)

@ecki
Schön, wenn's geholfen hat. :)

Gruß
Rena
 
Zuletzt bearbeitet:
Rena,
wieso funktioniert dann der Anhang? (Brauchst ne 1.mp3 und ne 2.mp3 im selben Verzeichnis). Dort werden 2 Sound-Objekte in _root unabhängig voneinander gestartet und gestoppt. Sorry für den schlechten Code, hab den einfach schnell hingeklatscht :)

Das ganze Thema erscheint mir sehr suspekt, vor allem aufgrund der spärlichen Dokumentation in der Flash Hilfe.
 

Anhänge

  • Unbenannt-1.fla
    64 KB · Aufrufe: 33
Ah .. ok. Da hab ich was verallgemeinert, das man in der Tat unterscheiden muss.
Per loadSound hinzugeladene Mucke läßt sich anscheinend wirklich in zwei "virtuellen" Objekten (_root.musik1 und _root.musik2) verwalten.
Bei importierten Sounds via attachSound funktioniert das ohne entsprechende "real existierende" Zeitleistenzuweisung nicht.

Und um loadSound ging's ja, nicht um attachSound - mein Fehler. Scheinbar agiert das Soundobjekt da zweigleisig. :)

Gruß
Rena
 

Neue Beiträge

Zurück