Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 03-12-2007, 13:13   #1 (permalink)
Bionicman
 
Benutzerbild von dark-future
 
Registriert seit: Apr 2007
Ort: Oberhausen - NRW
Beiträge: 29
Question MovieClip.enabled Problem (fla)

Hallo,

Folgendes Problem:
Ich habe einen Container der draggable ist, in dem aber noch Submovies liegen die ebenfalls MouseEvents ausführen sollen.

Mein Lösungsansatz ist ein MouseListener mit dem ich das draggen löse. Die Submovies können dann Events auf sich selbst haben die noch funktionieren, da auf dem _parent MovieClip kein Event liegt.

Problem ist nun, das die Events auf den Submovies nur dann ausgelöst werden sollen, wenn man ohne zu ziehen geklickt hat. Das löse ich indem ich onMouseMove im MouseListener die Submovies auf enabled = false; setze.

Leider scheint das gelingen dieser Aktion aber davon abzuhängen wie schnell man die Maus danach bewegt. Zieht man nur langsam bleibt das Event auf dem Submovie erhalten, zieht man schnell verschwindet es!?

Weiss jemand wieso und wie ich das Problem lösen kann?

Mein Lösungsansatz gefällt mir gut, deshalb wenn möglich bitte keine Alternativen bieten, sondern nur die Mausgeschwindigkeitsproblematik behandeln. Alternativen habe ich schon selbst gefunden. Gefallen mir aber alle nicht so besonders

Siehe Test SWF (inkl. fla) dragtest.zip
Auf die kleine Box klicken, ziehen und dann loslassen. Je nachdem wie schnell man zieht wird der klick ausgeführt
__________________
Gruß, Bionicman

Deutscher Entwicklerpreis
Aruba Studios
Quo Vadis Deutsche Spielebranche


Dass mir mein Hund das Liebste sei, sagst du oh Mensch sei Sünde,
mein Hund ist mir im Sturme treu, der Mensch nicht mal im Winde.

Franz von Assisi

Geändert von dark-future (04-12-2007 um 10:29 Uhr) Grund: .fla hinzugefügt
dark-future ist offline   Mit Zitat antworten
Alt 04-12-2007, 16:44   #2 (permalink)
Bionicman
 
Benutzerbild von dark-future
 
Registriert seit: Apr 2007
Ort: Oberhausen - NRW
Beiträge: 29
???

Hat wirklich Niemand eine Idee?
Sehe ehrlich gesagt keinen Programmierfehler, kann das ein Flashbug sein?

Wäre nett eine Antwort zu bekommen, auch wenn das Prob. unlösbar sein sollte!
__________________
Gruß, Bionicman

Deutscher Entwicklerpreis
Aruba Studios
Quo Vadis Deutsche Spielebranche


Dass mir mein Hund das Liebste sei, sagst du oh Mensch sei Sünde,
mein Hund ist mir im Sturme treu, der Mensch nicht mal im Winde.

Franz von Assisi
dark-future ist offline   Mit Zitat antworten
Alt 05-12-2007, 12:31   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
tipp: nicht nochmal posten ;-) wenn die magische 0 bei antworten fehlt, dann glauben alle da wäre schon eine antwort gegeben worden.



kapiere nicht so ganz was du machen willst (will mich damit auch nicht ewig beschäftigen).
wer soll geklickt und wer bewegt werden? erklär vielleicht nochmal: was dein ziel ist und nicht, was nicht geht.


entweder:
alle event-mc's auf einer ebene; also im container-mc drinn und das container-mc hat keine funktion.

oder alle functionen im container-mc und den rest mit hitTest usw. machen.
und irgendwo ein altX=_x um feststellen zu können, ob sich was bewegt hat.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (05-12-2007 um 12:33 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 05-12-2007, 13:48   #4 (permalink)
Bionicman
 
Benutzerbild von dark-future
 
Registriert seit: Apr 2007
Ort: Oberhausen - NRW
Beiträge: 29
Zitat:
Zitat von hgseib Beitrag anzeigen
entweder:
alle event-mc's auf einer ebene; also im container-mc drinn und das container-mc hat keine funktion.
genau so ist ja mein Beispiel aufgebaut, nur klappt das mc.enabled nicht

Sorry, dachte das wäre verständlich gewesen was ich möchte. Du hast es ja offenbar auch verstanden. In welchem Kontext ich das später verwenden möchte tut ja nichts zur Sache. Könnte ja zB auch nur ein Template sein, ohne konkretes Projekt.

Wie auch immer, ich werkle an einer Art Livepaper, ein Heft zum Blättern. Wenn man auf eine Seite klickt wird diese vergrößert und muss daher draggable sein, damit man in alle Ecken sehen kann. Trotzdem sollten darin noch Mousevents verfügbar sein.

Und da mir diese Möglichkeit nicht gefällt
Zitat:
Zitat von hgseib Beitrag anzeigen
alle functionen im container-mc und den rest mit hitTest usw. machen.
versuche ich alle event-mc's auf enabled=false zu setzen damit onRelease keine Aktion ausgeführt wird, wenn man zufällig dort geklickt hat.

Nur dieses enabled=false ist nicht zuverlässig, da es anscheinend von der Mausgeschwindigkeit abhängt (Gut zu sehen in meinem Beispiel). Aber die event-mc's zu disablen ist die einzige Möglichkeit, das diese nicht ihre Events ausführen. Oder gibt es noch andere Möglichkeiten ein zB onRelease zu deaktivieren ohne eine if-Abfrage darin ala if(_parent.moved == false)?

Danke für deine Mühe
__________________
Gruß, Bionicman

Deutscher Entwicklerpreis
Aruba Studios
Quo Vadis Deutsche Spielebranche


Dass mir mein Hund das Liebste sei, sagst du oh Mensch sei Sünde,
mein Hund ist mir im Sturme treu, der Mensch nicht mal im Winde.

Franz von Assisi
dark-future ist offline   Mit Zitat antworten
Alt 05-12-2007, 15:42   #5 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
nochmal sorry, das ich nicht die zeit habe (haben will) in dein problem tiefer ein zu steigen.

generell:
wenn ein objekt irgend ein event hat, dann bekommen alle untergeordneten absolut kein event mehr ab (ist in AS3 anders - da gibt es nur Listener - und andere probleme ;-)

schon mal daran gedacht nicht deinen container selbst mit events zu belegen, sondern ein rechteck darunter damit zu beglücken, ein objekt unter allen anderen? das bekäme z.b. alle klicks ab, die nicht über im schon abgefangen wurden.


"..dieses enabled=false ist nicht zuverlässig.."
das glaube ich nicht (um das zu analysieren will ich keine zeit inverstieren). entweder setzt du das zu spät oder es wird was vergessen?


"..andere Möglichkeiten ein zB onRelease zu deaktivieren.."
du kannst zu jeder zeit eine funktion an und wieder abhängen:

tuirgendwas = function(){}

_btn.onRelease= tuirgendwas;

delete _btn.onRelease;
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (05-12-2007 um 15:43 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 06-12-2007, 10:48   #6 (permalink)
Bionicman
 
Benutzerbild von dark-future
 
Registriert seit: Apr 2007
Ort: Oberhausen - NRW
Beiträge: 29
Unhappy

Zitat:
Zitat von hgseib Beitrag anzeigen
nochmal sorry, das ich nicht die zeit habe (haben will) in dein problem tiefer ein zu steigen.
kein Problem, Zeitprobleme hab ich auch immer
Aber es könnte ja anderen noch etwas sinnvolles einfallen.

Zitat:
Zitat von hgseib Beitrag anzeigen
schon mal daran gedacht nicht deinen container selbst mit events zu belegen, sondern ein rechteck darunter damit zu beglücken, ein objekt unter allen anderen? das bekäme z.b. alle klicks ab, die nicht über im schon abgefangen wurden.
das würde zwar gehen, aber ist nicht Sinn der Sache, schließlich sollte man den Container ja auch bewegen können wenn man auf ein Objekt mit Event geklickt hat. Stichwort Benutzerfreundlichkeit.

Zitat:
Zitat von hgseib Beitrag anzeigen
"..dieses enabled=false ist nicht zuverlässig.."
das glaube ich nicht (um das zu analysieren will ich keine zeit inverstieren). entweder setzt du das zu spät oder es wird was vergessen?
Anscheinend hängt mein Problem damit zusammen, in welcher Reihenfolge Flash, ActionScript abhandelt.

Zitat:
Zitat von hgseib Beitrag anzeigen
du kannst zu jeder zeit eine funktion an und wieder abhängen:

tuirgendwas = function(){}
_btn.onRelease= tuirgendwas;
delete _btn.onRelease;
Habe ich ausprobiert, aber ergibt dasselbe Problem wie bei MovieClip.enabled. Hier mein entsprechender Code:
PHP-Code:
someListener.onMouseMove = function() {
    if(
dragStat == 1) {
        
newText("box_mc.enabled = false");
        
//_root.cont_mc.box_mc.enabled = false;
        
delete _root.cont_mc.box_mc.onRelease;
        
startDrag(c_mc,false);
        
dragStat 2;
    }
}; 
Offenbar wird das delete onRelease in einem onMouseMove nicht ausgeführt. Dort nehme ich an liegt mein Problem.

Aber auch wenn es ginge wäre auch das nicht Sinn der Sache, weil ich die Events ja gerne original auf den MC's im Container hätte und nicht irgendwo in Funktionen.

Vielleicht weiß ja Jemand über die internen Routinen von Flash bescheid und kann mir sagen wieso in einem onMouseMove das enabled = false unzuverlässig ist und das delete onRelease gar nicht geht. Und nochmal der Hinweis, dass in meinem Beispiel von oben zu sehen ist, wie Merkwürdig sich MC.enabled verhält.
__________________
Gruß, Bionicman

Deutscher Entwicklerpreis
Aruba Studios
Quo Vadis Deutsche Spielebranche


Dass mir mein Hund das Liebste sei, sagst du oh Mensch sei Sünde,
mein Hund ist mir im Sturme treu, der Mensch nicht mal im Winde.

Franz von Assisi
dark-future ist offline   Mit Zitat antworten
Alt 06-12-2007, 13:41   #7 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Wieso willst du keine Alternativ? Hoffe mal, ich hab's überhaupt verstanden:
PHP-Code:
cont_mc.onPress = function() {
    
_root.sX this._x;
    
_root.sY this._y;
    
this.startDrag();
};
cont_mc.onRelease = function() {
    
stopDrag()
    if (
this._x == _root.sX && this._y == _root.sY) {
        for (var 
i in this) {
            if (
this[i].hitTest(_root._xmouse_root._ymouse)) {
                
this[i].onRelease();
                break;
            }
        }
    }
};
cont_mc.box_mc.onRelease = function() {
    
trace(this+" geklickt");
}; 
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 06-12-2007, 13:55   #8 (permalink)
Bionicman
 
Benutzerbild von dark-future
 
Registriert seit: Apr 2007
Ort: Oberhausen - NRW
Beiträge: 29
Zitat:
Zitat von Der Frager Beitrag anzeigen
Wieso willst du keine Alternativ? Hoffe mal, ich hab's überhaupt verstanden
Verstanden hast du es, funktioniert auch einwandfrei.

Nur ist das Problem wieder, dass ich die Funktionalität der Event-MC's nicht auf sich selbst lassen kann. Sinn der Sache ist es nämlich, dass mir die Leute funktionierende swf's geben können die ich dann dynamisch in einen Container laden möchte, der aber trotzdem noch draggable sein soll.
__________________
Gruß, Bionicman

Deutscher Entwicklerpreis
Aruba Studios
Quo Vadis Deutsche Spielebranche


Dass mir mein Hund das Liebste sei, sagst du oh Mensch sei Sünde,
mein Hund ist mir im Sturme treu, der Mensch nicht mal im Winde.

Franz von Assisi
dark-future ist offline   Mit Zitat antworten
Alt 06-12-2007, 14:04   #9 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
Das kannst du (sage ich mal) vergessen.

Nehmen wir mal an, in einem SWF hat der Programmierer onMouseMove() benutzt. Das gilt immer für den ganzen Film. Wenn du es also in deinem Script killst / überschreibst, ist's auch in dem SWF futsch.

Oder anstelle von onRelease() wurde onPress() verwendet - watt nu?

Versthst du, was ich meine?

edit: Gut, wenn man mit MouseListenern arbeitet erledigt sich vielleicht Problem 1. Das zweite bleibt aber bestehen.
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++

Geändert von Der Frager (06-12-2007 um 14:07 Uhr)
Der Frager ist offline   Mit Zitat antworten
Alt 06-12-2007, 14:15   #10 (permalink)
Bionicman
 
Benutzerbild von dark-future
 
Registriert seit: Apr 2007
Ort: Oberhausen - NRW
Beiträge: 29
Ich verstehe schon was du meinst. Allerdings meinte ich mit "Leute" nicht irgendwelche Fremde die mir schei** schicken, sondern meine Kollegen in der Firma. Die sich natürlich an strikte Vorlagen halten würden.

Zitat:
Zitat von Der Frager Beitrag anzeigen
Oder anstelle von onRelease() wurde onPress() verwendet - watt nu?
Deshalb war mein ursprünglicher Plan ja mit MovieClip.enabled zu arbeiten. Da brauche ich keine Funktionen ala onRelease() sondern on(release) auf den MC's im Container.

Deshalb auch meine ursprüngliche Frage wieso MovieClip.enabled mit der Mausgeschwindigkeit zusammenhängt. Es würde ja perfekt funktionieren, wenn der Mist nicht nur disabled werden würde wenn man die Maus mit einer bestimmten Mindestgeschwindigkeit zieht

Hier der ursprüngliche Code (Auszug):
PHP-Code:
someListener.onMouseDown = function() {
    if(
customHitTest(c_mc)) {
        
dragStat 1;
    }
};
someListener.onMouseUp = function() {
    if(
customHitTest(c_mc)) {
        if(
dragStat == 2) {
            
c_mc.stopDrag();
            
newText("box_mc.enabled = true");
            
_root.cont_mc.box_mc.enabled true;
        }
        
dragStat 0;
    }
};
someListener.onMouseMove = function() {
    if(
dragStat == 1) {
        
newText("box_mc.enabled = false");
        
_root.cont_mc.box_mc.enabled false;
        
startDrag(c_mc,false);
        
dragStat 2;
    }
}; 
__________________
Gruß, Bionicman

Deutscher Entwicklerpreis
Aruba Studios
Quo Vadis Deutsche Spielebranche


Dass mir mein Hund das Liebste sei, sagst du oh Mensch sei Sünde,
mein Hund ist mir im Sturme treu, der Mensch nicht mal im Winde.

Franz von Assisi

Geändert von dark-future (06-12-2007 um 14:17 Uhr)
dark-future ist offline   Mit Zitat antworten
Alt 06-12-2007, 14:54   #11 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
So? Weiß jetzt gar nicht mehr, was im Original von dir großartig anders war - aber scheint zu klappen.
PHP-Code:
var c_mc:Object _root.cont_mc;
var 
dragStat:Number 0;
someListener = new Object();
someListener.onMouseDown = function() {
    if (
customHitTest(c_mc)) {
        
dragStat 1;
    }
};
someListener.onMouseMove = function() {
    if (
dragStat == 1) {
        
buttons(falsec_mc);
        
c_mc.startDrag();
        
dragStat 2;
    }
};
someListener.onMouseUp = function() {
    
stopDrag();
    
dragStat 0;
    
c_mc.onEnterFrame = function() {
        
delete this.onEnterFrame;
        
buttons(truec_mc);
    };
};
Mouse.addListener(someListener);
//
function customHitTest(object:Object):Boolean {
    var 
c_mc:Object object;
    if (
_xmouse>c_mc._x && _xmouse<c_mc._x+c_mc._width && _ymouse>c_mc._y && _ymouse<c_mc._y+c_mc._height) {
        return 
true;
    }
    return 
false;
}
//
function buttons(onOffmc) {
    for (var 
i in mc) {
        
mc[i].enabled onOff;
        if (
mc[i] instanceof (MovieClip)) {
            
buttons(onOffmc[i]);
        }
    }

edit: Vielleicht liegt's ja am erzwungenen Framewechsel, dass es so zu gehen scheint.
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++

Geändert von Der Frager (06-12-2007 um 14:55 Uhr)
Der Frager ist offline   Mit Zitat antworten
Alt 06-12-2007, 15:10   #12 (permalink)
Bionicman
 
Benutzerbild von dark-future
 
Registriert seit: Apr 2007
Ort: Oberhausen - NRW
Beiträge: 29
Sehr cool. Super großen Dank Frager
So hatte ich mir das anfangs vorgestellt.

Kleine Frage noch, wenn jemand Zeit hat:
Zitat:
Zitat von Der Frager Beitrag anzeigen
PHP-Code:
someListener.onMouseUp = function() {
    
c_mc.onEnterFrame = function() {
        
delete this.onEnterFrame;
        
buttons(truec_mc);
    };
}; 
Nehme an das hier ist der erzwungene Framewechsel, hab ich noch nie gesehen, gibts dafür evtl. ne kleine Erklärung oder Link?
__________________
Gruß, Bionicman

Deutscher Entwicklerpreis
Aruba Studios
Quo Vadis Deutsche Spielebranche


Dass mir mein Hund das Liebste sei, sagst du oh Mensch sei Sünde,
mein Hund ist mir im Sturme treu, der Mensch nicht mal im Winde.

Franz von Assisi
dark-future ist offline   Mit Zitat antworten
Alt 06-12-2007, 15:23   #13 (permalink)
................
 
Benutzerbild von Der Frager
 
Registriert seit: Jun 2004
Beiträge: 15.890
onMouseUp ist schneller als onRelease. Das heißt, wenn man direkt die Buttons wieder enablen würde sähe das so aus:
MouseUp -> enablen -> onRelease

Durch den erzwungenen Framewechsel ist die Reihenfolge jetzt halt so:
MouseUp -> onRelease (bzw. eben nicht, da disabled) -> enablen

So ungefähr zumindest.


PHP-Code:
mc.onEnterFrame = function()
{
delete this.onEnterFrame
machWas
()

Sorgt nur dafür, das mit der Ausführung von "machWas()" einen Frame lang gewartet wird.
__________________

ternärer Konditionaloperator

+++ Bitte keine Privat-Nachrichten bezüglich Flashfragen! +++
Der Frager ist offline   Mit Zitat antworten
Alt 06-12-2007, 17:04   #14 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
ich darf auch nochmal meinen senf dazu geben ;-)
mal ein mc mit dem instanznamen test anlegen und diesen script übernehmen.
also das enabled und das umhängen (somit auch das deleten) geht schon und ohne einen frame warten zu müssen. hier wird enabled, wenn sich die maus auf der linken hälfte des mc's befindet.
Code:
function mach1() {
  trace(333);
}
function mach2() {
  trace(444);
}
function umhaenger() {
  this.onRelease = mach1;
  this.onRelease();
  this.onRelease = mach2;
  this.onRelease();
  this.onRelease = umhaenger;
}
test.onRelease = umhaenger;
//
test.onMouseUp = function() {
  trace("---");
  trace(222);
  this.enabled = _xmouse>this._x;
};
test.onMouseMove = function() {
  this.enabled = _xmouse>this._x;
};
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (06-12-2007 um 17:06 Uhr)
hgseib ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 23:44 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele