Variablen von MC zu MC weitreleiten

branko

Erfahrenes Mitglied
Hi, ich wieder,

Ich habe da in einem MC in allen Bildern eine Variable definiert. Auf der Bühne laufen mehrere MCs, und ich würde es gerne sehen, dass wenn über eins rorollt wird, dass die anderen stehen bleiben oder der Alpha-Wert heruntergesetzt wird oder sowas. Ich dachte mir, das würde am besten übe globale Variablen gehen. Nun die Frage: wie kann ich die variable in dem einem MC auf die anderen übertragen?

Vielen Dank im Voraus!
Grüße,
Branko
 
Hi,

das kommt ganz auf Dein Setup an (wo befinden sich diese MCs, wie sind sie benannt, hast Du die Möglichkeit, Instanzen in einem Array abzulegen usw.). So etwas:
Ich habe da in einem MC in allen Bildern eine Variable definiert.
lässt bei mir allerdings die Alarmglocken leise klingeln - ausser in ganz wenigen Fällen lässt die dahinterstehende Absicht auf eine andere Art und Weise eleganter verwirklichen (Schlüsselbilder sollte man nur einsetzen, wenn man unbedingt welche benötigt).

Poste bitte mal Deine Datei, dann schau ich mir das Problem gern mal an.

Gruß
.
 
Hm, ok, hier ist die Datei. Eigentlich hätte ich das lieber selbst gelöst, aber ich schätze, ich kann mehr lernen, wenn ich mir das direkt anschaue.

http://rapidshare.de/files/12747986/problem.fla.html

Die Sache ist, dass das Eine Bild (Schaltfläche) anhält, wenn man drüber fährt. Das andere nicht, obwohl sie den gleichen Code haben. Ferner wollte ich das so machen, dass wenn ein Bild aktiv ist, die anderen (es kommen ja noch mehr hinzu) auf 50% Alpha runtergehen. Ich bin echt ziemlich frisch in Flash, hoffentlich muss ich Euch nicht mehr so oft belästigen.

Danke,
branko
 
Hi,

dass einer der MCs anhält, und der andere nicht, liegt daran, dass die Schaltfläche im zweiten "MountainPokret_mc" heisst, Du aber mit Mountain_btn.onRollOver darauf zugreifen willst. ;)

Anbei nochmal ein Beispiel, wie ich es machen würde - für eine einfache Bewegung von links nach rechts brauchst Du eigentlich kein Tweening und zweitens sparst Du Dir Arbeit, wenn Du nur einen MovieClip verwendest: Ändert sich etwas, brauchst Du diese Änderung nicht an allen (fast identischen) Buttons vorzunehmen. ;)

Gruß
.
 

Anhänge

  • problem.zip
    110 KB · Aufrufe: 21
Ich muss zugeben, dass ich nicht im entferntesten verstehe, wie Du das angestellt hast. Du hast ja praktisch alles aussschließlich auf den Script umgestellt, da muss ich erstmal durchsteigen. Aber es scheint ja effizienter zu sein! Mir fehlt offensichtlich noch die korrekte Einstellung zu den Symbolen.

Sehe ich das richtig - Wäre eine .fla ein normaler Script in VBasic (z.B.), wären die einzelnen Symbole Unterprozeduren?
 
Hi,

das "Script" ist eigentlich recht kurz nicht besonders aufwändig. Ich erklär mal kurz, was ich gemacht habe:
  • Zuerst habe ich für jedes Bild einen MC erstellt, damit man die Bilder mit ActionScript (attachMovie) instanzieren kann. Für jedes Bild gibt es ja einen "an" und einen "aus"-Zustand.

  • Dann gibt es einen MC "moving_clip", der fast für den ganzen Rest zuständig ist. Dort befinden sich zwei leere MovieClips ("container" und "container2"), die die beiden Bilder (an und aus) aufnehmen sollen. Zum AS-Code:
    • Zuerst werden einige Variablen definiert: xmin und xmax bestimmen den linken und den rechten "Wendepunkt" auf der Bühne, speed die Bewegungsgeschwindigkeit. Die Variable "_moving" bestimmt, ob sich der Clip bewegen soll (true) oder nicht (false).

    • Nun warten wir zuerst mit einer onEnterFrame-Methode, bis zwei weitere Variablen "_sym" und "_dir" von aussen (d.h. von der Hauptzeitleiste aus) gesetzt werden: In "_sym" steht der Name des Bildes (ohne "_an" und "_aus"), das angezeigt werden soll und "_dir" bestimmt die anfängliche Bewegungsrichtung (ich dachte, es sollen sich nicht alle Bilder in die selbe Richtung bewegen).

    • Sind beide Variablen gesetzt worden, so instanzieren wir die Bilder in die beiden Container. Das "an"-Bild kommt in den zweiten Container, der zuerst einmal mit _visible = false unsichtbar geschaltet wird. Nun springen wir direkt in die Funktion "go", die mit der Bewegung beginnt:

    • In dieser Funktion wird zunächst die Richtung bestimmt, indem der Absolutwert der Geschwindigkeit mit dem Wert von _dir multipliziert wird (ist _dir = -1, so haben wir eine negative Geschwindigkeit: Der Clip geht nach links).

    • Nun starten wir eine zweite onEnterFrame-Methode (womit wir die erste überschreiben), die eigentlich nur prüft, ob _moving = true ist, und wenn das der Fall ist den Clip hin und her bewegt. Erreicht er eine der beiden Kanten xmin bzw. xmax, so wird die Geschwindigkeit umgedreht. ;)

    • Zudem erstellen wir hier einen onRollOver- und einen onRollOut-Handler, der erstmal nur den zweiten Container (mit dem farbigen Bild) "einschaltet" bzw. beim Mouse-Out wieder unsichtbar werden lässt. Ausserdem wird eine Funktion auf der Hauptzeitleiste aufgerufen (moveAll), die dafür sorgen wird, dass die anderen Clips auch anhalten.


  • Auf der Hauptzeitleiste befinden sich am Anfang zwei Instanzen dieses MovieClips (mit den Instanznamen "clip1" und "clip2"). Du kannst natürlich noch mehr davon unterbringen, wenn Du mehr Bilder hast. ;)

  • Scriptmäßig gibts auf _root nicht viel:
    • Wir geben beiden Clips Werte für "_sym" und "_dir" mit: Das ist bei clip1 z.B. "kinder" (er wird dann "kinder_an" und "kinder_aus" in seine beiden Container laden) und -1 (weil er sich zuerst nach links bewegen soll).

    • Nun brauchen wir nur noch die Funktion "moveAll", die einfach bei beiden Clips die Variable "_moving" auf den übergebenen Wert setzt (beim Mouse-Over ist das false für Anhalten bzw. true beim Mouse-Out zum Weitermachen). Wenn es mehr Clips werden, ist es sparsamer, diese in einem Array abzulegen und in dieser Funktion einfach das Array zu durchlaufen, z.B. so:
Code:
var clips = new Array(clip1, clip2); // können noch mehr werden!

function moveAll(flag) { // Alle anhalten/abspielen:
	for (var i in clips) { // alle im Array durchlaufen ...
		clips[i]._moving = flag; // ... und Flag zuweisen
	}
}

Das wars schon von dieser Seite.

Zu Deiner zweiten Frage: Du solltest wenn irgend möglich auf Schaltflächen verzichten (es gibt eigentlich so gut wie nichts, was sich mit MovieClips nicht genauso oder besser machen liesse). Schaltflächen sind im Prinzip nur abgespeckte MovieClips, mit denen man halt "superfix" einfache Buttons erstellen kann. Sobald aber Animationen oder weitere Verhalten als ein Drüber- Bild ins Spiel kommen, bist Du mit MCs besser bedient.

MovieClips (und andere Komponenten) lassen sich am ehesten mit Steuerelementen (bei VB z.B. ein Image-Objekt) vergleichen (bzw. mit Instanzen einer Klasse). Das "Besondere" an diesen Objekten ist unter anderem, dass sie als Container für beliebige weitere Objekte dienen können und eben auch über eine eigene Zeitleiste verfügen.

Gruß
.
 
Ok, cool. Jetzt müsste ich die ganzen Befehle sowie die Architektur von Flash etwas besser kennen lernen, von der Theorie her klingt das schlüssig. Mit seiner Oberfläche verführt Flash zur "manuellen" Produktion. Was mir noch ziemlich auf´n Sack geht ist die Artikulation von ActionScript, ziemlich C+/Java-lastig. Aber das ist Gewöhnungssache. Danke sehr für die riesige Hilfe, ich werde mich jetzt noch da reinwurschteln und schreien, falls es Probleme geben sollte.

Vielen Dank!
Branko
 
Achja, bevor ich es vergesse - ist es irgendwie möglich, das Projekt so zu veröffentlichen, dass diese Warnung von SP2 bezüglich aktiver Elemente nicht mehr vorkommt? Ich habe ne Menge Seiten gesehen, die diesen Alarm nicht ausgelöst haben...
 
Hi,

@Verführung: Mag daher rühern, dass Flash vielseitig sein will, bzw. bestimmte Wurzeln hat: Zum einen ist es ein Tool, um Animationen und Filmchen zu erstellen, die im Prinzip statisch ablaufen - zum anderen ist es in den letzten Jahren zu einer recht mächtigen RAD-Umgebung geworden, mit der komplexe Rich-Media/Client-Anwendungen erstellt werden können.

@Syntax: Ist tatsächlich Gewöhnungssache. Seit ich auf C-ähnliche Sprachen umgestiegen bin, danke ich den Göttern, dass ich
Code:
for (var i=0; i<10; i++) {}
statt
Code:
FOR i=0 to 9 STEP 1
NEXT i
und
Code:
if (a == b) {}
statt
Code:
IF a=b THEN
ENDIF
schreiben darf - es geht fixer, sieht besser aus und vermeidet Missverständnisse (ich sag nur: Vergleiche mit einem =). ^^

@Aktive Inhalte: Ist mir nicht bekannt; ich gehe davon aus, dass es eine Browsereinstellung ist, die vielleicht für einzelne Domains ausser Kraft gesetzt werden kann. Wenn Du mir zwei Links zeigst, einen mit dieser Warnung im IE und eine ohne, dann mach ich mich vielleicht mal auf die Suche. ;)

Gruß
.
 
Zurück