Frage zum "On"-Statement

WiZdooM

Erfahrenes Mitglied
Hallo

Ihr kennt sicher den Actionscripttext:

on(rollOver)
{
gotoAndPlay("...");
}

on(rollOut)
{
gotoAndPlay("...");
}

Ich habe nun eine Schaltfläche die bei einem Rollover Content einblendet und bei einem rollOut das auch wieder ausblendet. Ich würde das gerne mit einem press oder release machen, statt einem rollOver/rollOut. Es soll also auf den ersten Klick auf die Schaltfläche der Content dargestellt werden, und auf den 2. Klick dieser Content wieder ausgeblendet werden und sollte vorher ein anderer Content dargestellt werden, dass dieser erst geschlossen wird, ehe der aktuelle Content angezeigt wird. Direkt geht das nicht, soviel weiss ich, habe bereits versucht das über eine Variable zu definieren, aber das hat nicht funktioniert. Das ganze sah so aus:

on(press oder release)
{
var cnt = "false";
if(cnt == "false")
{
News06.gotoAndPlay("open");
cnt = "true";
}
}
on(press oder release)
{
if(cnt == "true")
{
News06.gotoAndPlay("close");
cnt = "false";
}
}

funktioniert hatte diese Version, die aber bei etwas mehr Content schwierig ist, denn sobald man scrollen will und verlässt die Schaltfläche wird ja der Content wieder ausgeblendet...:

on(rollOver)
{
News06.gotoAndPlay("open");
}

on(rollOut)
{
News06.gotoAndPlay("close");
}

Wie kann ich nun dieses Statement so in ein "press" oder "release" überführen, damit die gleiche Funktionalität gewährleistet ist - nur eben auf Druck auf die Schaltfläche.

Gruß und schonmal Danke
 
Hi,

ich habe nicht ganz verstanden, wodurch sich Deine funktionierende Variante, und die, die Du erreichen willst unterscheiden.

Hier erst einmal ein paar generelle Tipps von mir:
  1. Arbeite nach Möglichkeit nicht mit Schaltflächen, sondern mit MovieClips. Schaltflächen führen aufgrund Ihrer spezifischen Unterschiede/Einschränkungen öfter zu Problemen und langwierigeren Erklärungen (im Übrigen gelten Sie heutzutage als veraltet).

  2. Vermeide ebenso, Code (sprich: Ereignisse) auf Objektinstanzen zu notieren (dazu gehört z.B. das "on"-Statement, sondern arbeite lieber mit den Mausereignissen, die auf Zeitleisten notiert werden: onRollOver, onPress usw.

Ich würde als Button einen MovieClip anlegen, der sein onPress-Ereignis und seinen aktuellen Zustand an die übergeordnete Zeitleiste weitergibt:
Code:
// Code auf der Zeitleiste des MovieClip-Buttons:

var _active = false;

this.onPress = function() {
  _active = !_active;
  _parent.pressed(this);
}
Du kannst nun mehrere Instanzen dieses Buttons auf einer Zeitleiste (z.B. in einem Menü) platzieren, jedem einen anderen Content-Bereich zuweisen und auf den jeweiligen Status reagieren:
Code:
var buttons = new Array(but1, but2, but3); // but1, 2 und 3 sind die Instanznamen Deiner Butons

var contents = new Array(content1, content2, content3); // dies sind z.B. die Instanznamen Deiner abzuspielenden Zeitleisten

for (var i=0; i<buttons.length; i++) {
  buttons[i].idx = i; // damit jeder Button seine "Nummer" kennt
}

function pressed(obj) { // wurde ein Button angeklickt ...
  // kannst Du den jeweiligen Inhalt in Abhängigkeit seines _active-Status' abspielen:
  contents[obj.idx].gotoAndPlay((obj._active)? "rein" : "raus");
}

Gruß
.
P.S.: Bitte verwende beim Posten von Code die [CODE] - oder [ACTIONSCRIPT]-Tags - danke!
.
 
Hallo

Danke für Deine schnelle Antwort. Ich wollte es deswegen mit on(statement) machen, da ich nur das Grundgerüst das jemand anders entwickelt hat so modifizieren wollte, dass es meinen Bedürfnissen entspricht. Mein AS wissen reicht dafür jedoch nicht wirklich aus, wie mir scheint.

Zum Verständnis (das ganze is absolutes Neuland für mich *schäm*):
Code:
// Code auf der Zeitleiste des MovieClip-Buttons:

var _active = false;

this.onPress = function() {
  _active = !_active;
  _parent.pressed(this);
}

Ist damit 'in der Zeitleiste vom "Button"-MovieClip' gemeint oder in der Zeitleiste die die Instanz aufnimmt ?

Muss jede Instanz in einem eigenen Frame liegen?

Wohin muss dieser Code ?
Code:
var buttons = new Array(but1, but2, but3); // but1, 2 und 3 sind die Instanznamen Deiner Butons

var contents = new Array(content1, content2, content3); // dies sind z.B. die Instanznamen Deiner abzuspielenden Zeitleisten

for (var i=0; i<buttons.length; i++) {
  buttons[i].idx = i; // damit jeder Button seine "Nummer" kennt
}

function pressed(obj) { // wurde ein Button angeklickt ...
  // kannst Du den jeweiligen Inhalt in Abhängigkeit seines _active-Status' abspielen:
  contents[obj.idx].gotoAndPlay((obj._active)? "rein" : "raus");
}
Kommt der in die Instanz oder in das Frame/die Frames ?

Gruß
 
Hi,

Ist damit 'in der Zeitleiste vom "Button"-MovieClip' gemeint [..] ?
Ja.

Muss jede Instanz in einem eigenen Frame liegen?
Eigentlich dürften hier überhaupt keine Frames nötig sein. Wenn Du eine fertige Vorlage bearbeiten willst, musst Du Dich natürlich den Gegebenheiten anpassen, wobei es dann z.B. eine Rolle spielt, ob die Buttons gleichzeitig oder nacheinander zu sehen sein sollen ...

Wohin muss dieser Code ?
Der muss in die Zeitleiste, die die Buttons und die anzusteuernden Inhalte aufnimmt.

Wahrscheinlich wäre es am sinnvollsten, Du würdest Deine Datei einmal posten - dann kann ich Dir sagen, was die sinnvollste Herangehensweise an Dein Problem ist.

Gruß
.
 
Hallo

Bin aus dem verlängerten Wochenende zurück. Danke Dir vielmals für deine kompetente Hilfe. Der von Dir gegebene Code macht Sinn und ist genau die Antwort auf meine Frage bzw. mein Problem. Danke Dir vielmals.

An der Stelle noch eine Anmerkung:
Auf den ursprünglichen Buttons lag eine RollOver-Animation. Die konnte jetzt in dem Movieclip zwar schön getimed werden, jedoch führt jetzt dieser Code dazu, dass der Status des Moviebuttons immer mit false beginnt - was ganz klar ist, denn durch das RollOver/RollOut wird ja der MC immer neu aufgerufen und geprüft. Abhilfe schafft hier eine Zwischenvariable, die einfach den _active-Wert bekommt und diesen je nach Aktion immer wieder in _active zurückschreibt. Nach den regulären Programmierparadigmen sind zwar nicht-initialisierte Variablen eine potentielle Fehlerquelle, jedoch fällt mir an der Stelle kein besserer Workaround ein.

Code:
var _active = false;
var _status;

this.onPress = function() {
  _active = !_active;
  _status = _active;
  _parent.pressed(this);
}

//spielt den rollover Effekt der ehemaligen "buttons"
this.onRollOver = function(){
        _active = _status;
	_parent.rollin(this);
}

//spielt den rollout Effekt der ehemaligen "buttons"
this.onRollOut = function(){
        _active = _status;
	_parent.rollout(this);
}


Gruß
WiZdooM
 
Zuletzt bearbeitet:
Hi,

was ganz klar ist, denn durch das RollOver/RollOut wird ja der MC immer neu aufgerufen und geprüft.
Ok, dieses Problem entsteht, da Du Buttons/MCs schachtelst, und das Objekt mit dem Code auf einer Zeitleiste mit mehreren Schlüsselbildern sitzt. Dies ist ein Beispiel für die Gründe, aus denen ich immer rate, auf solche Konstruktionen zu verzichten: man muss sich mit solchen Workarounds behelfen. ;)

Gruß
.
 
Genau.

Mir ist jetzt noch etwas anderes aufgefallen, wo ich mir noch überlegen muss wie ich das löse. Folgender Fall: Ich habe 2 oder mehr movieButtons und 2 oder mehr contents. Jetzt ist es so, das bei erstem Klick auf den movieButton1 der content1 gezeigt, auf einem 2. Klick content1 geschlossen wird. Analog für die anderen movieButtons/contents. Soweit perfekt. Doch klickt man zuerst auf movieButton1 und danach auf movieButton2 hat man 2mal (oder mehr, je nach Menge an Buttons und Content) geöffneten Content, der sich überlappt und lesbarkeit nicht gewährleistet ist.

Gruß
WiZdooM
 
Hi,

die Funktion "pressed" kann so modifiziert werden, dass zunächst der aktive Content geschlossen wird, bevor ein neuer geöffnet wird. Dazu kannst Du auf der Hauptzeitleiste eine weitere Hilfsvariable anlegen, in der die Nummer der aktiven Contents festgehalten wird:

Code:
function pressed(obj) { // wurde ein Button angeklickt ...
  contents[currentContent].gotoAndPlay("raus");
  contents[obj.idx].gotoAndPlay((obj._active)? "rein" : "raus");
  currentContent = obj.idx;
}

Gruß
.
 
Hallo

So habe ich mir das auch gedacht.
Ich hab allerdings festgestellt, dass wenn man die buttons nach der Reihenfolge anklickt und wieder rückwärts geht, macht er ab einem gewissen punkt nicht mehr automatisch den neuen content auf sondern schliesst nur den alten. Das liegt daran dass der button noch active ist, und beim close nicht auf inactive gesetzt wird. Ich weiss jetzt auch nich wie ich das verstricke... für c# wüsst ichs aber bei AS weiss ichs nicht...

Das Ergebnis kann derzeit unter "http://sod.bitethebytes.de" angesehen werden.

Gruß
WiZdooM
 
Zuletzt bearbeitet:
Zurück