Was ist der bevorzugte Weg, um eine Maus-rollover/rollout-Erkennung in Flash mit AS3

Nehmen wir an, wir haben eine Bühne mit zwei Plätzen, und zwar so:
Was ist der bevorzugte Weg, um eine Maus-rollover/rollout-Erkennung in Flash mit AS3

Nehmen wir an, wir möchten das gelbe Quadrat werden zunächst ausgeblendet, und wir möchten, dass, solange der Mauszeiger innerhalb der Grenzen des roten Platzes - das gelbe Quadrat soll sichtbar sein, und solange Sie den Mauszeiger über die Grenzen des roten Platzes - das gelbe Quadrat versteckt.

Der intuitive Ansatz ist das schreiben etwas wie dieses:

inSqr.visible = false;
outSqr.addEventListener (MouseEvent.ROLL_OVER,sqrOver);
outSqr.addEventListener (MouseEvent.ROLL_OUT,sqrOut);

function sqrOver(e:MouseEvent) {
    inSqr.visible = true;
}

function sqrOut (e:MouseEvent) {
    inSqr.visible = false;
}

Mit diesem code, jedoch - zu jeder Zeit, bewegen Sie den Mauszeiger innerhalb des gelbe Quadrat -
es, offenbar, zählt ROLL_OUT für die ROT Quadrat -
so ist die sqrOut Funktion ausgelöst wird - machen Sie das gelbe Quadrat verschwinden, und sobald Sie das gelbe Quadrat ist nicht da - der cursor ist plötzlich innerhalb der Grenzen der ROT Platz wieder - so die sqrOver Funktion
aufgerufen wird - womit wieder das gelbe Quadrat die Sichtbarkeit der auslösende sqrOut und so weiter und so Fort, wodurch ein "flackern" gelbe Quadrat, wenn die Maus-cursr ist über ihn:
das gelbe Quadrat verschwindet und erscheint wieder immer wieder immer und immer wieder.

Möglichkeit einen "fix" für diese ist das entfernen der listener für die rote roll-out-Ereignis während der cursor innerhalb des gelb (wenn es im inneren des gelben es ist sicherlich innerhalb der roten als auch), und bringen Sie es zurück, wenn es aus ist, indem diese an den obigen code:

 inSqr.addEventListener (MouseEvent.ROLL_OVER,insqrOver);
 inSqr.addEventListener (MouseEvent.ROLL_OUT,insqrOut);
 function insqrOver(e:MouseEvent) {
     if (outSqr.hasEventListener (MouseEvent.ROLL_OUT)) {
         outSqr.removeEventListener(MouseEvent.ROLL_OUT,sqrOut);
     }
     inSqr.visible = true;
 }
 function insqrOut(e:MouseEvent) {
     if (!outSqr.hasEventListener (MouseEvent.ROLL_OUT)) {
         outSqr.addEventListener(MouseEvent.ROLL_OUT,sqrOut);
     }
 }

Dieser funktioniert.
Aber es ist umständlich. Sie haben zu tun, es für jedes beliebige Objekt innerhalb der Grenzen des dem roten Platz, wodurch es zu langen code und viele Ereignis-Listener und eine kontinuierliche listener-Registrierung und unregisteration.


Vor ein paar Jahren jemand vorgeschlagen, der mir diese Technik:

 outSqr.addEventListener (Event.ENTER_FRAME,hoverCheck);

 function hoverCheck (e:Event) {
     if (e.currentTarget.hitTestPoint(stage.mouseX,stage.mouseY,true)) {
         inSqr.visible = true;
     }
     else {
         inSqr.visible = false;
     }
 }

Dies ist ein einfacher, kurzer code, der funktioniert.
Aber, wenn Ihr Projekt nicht wirklich brauchen, zu verwenden, das ENTER_FRAME-Ereignis schafft es die unnötigen overhead und cpu-Zyklen wiederholt ausgeführt wird der hit-test.
Auch, wenn das rote Quadrat deckt die gesamte Bühne (hat die gleichen Maße wie die Bühne) -
es schafft Probleme (es funktioniert nicht).

Ist jemand bekannt, der eine einfache und elegante Möglichkeit, dies zu erreichen - eine, die würde nicht mit zu umständlich und zu lange code und würde nicht verwenden Sie eine wiederholte timer, der die Treffer-tests immer und immer wieder...?

InformationsquelleAutor Yuval A. | 2011-10-03
Schreibe einen Kommentar