Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[AS3] Event flow goed krijgen.

Pagina: 1
Acties:

  • CTVirus
  • Registratie: Januari 2000
  • Laatst online: 14-11 11:45

CTVirus

Dexterslab FAN

Topicstarter
Ik heb schematisch gezien onderstaande code. Met deze classes bouw ik een boom op die de view van mijn applicatie is. Nu wil ik graag dat als mijn Stage resized alle componenten in mijn boom in een bepaalde volgorde gaan resizen.

Eerst de base class ESprite daarna Component en daarna de kinderen. Als namelijk een van de kinderen eerder een ESprite.resize heeft kan ik niet garanderen dat alle waardes die door Component.resize van de parent ge-set moeten worrden correct zijn.

Hoe kan ik dit het meest elegant oplossen?

Flash ActionScript 3: ESprite.as
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class ExtendedSprite extends Sprite
{
    protected var changed : Boolean;

    public function ESprite () 
    {
        if (stage) init();
        else this.addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init (e: Event = null) : void 
    {       
        this.removeEventListener(Event.ADDED_TO_STAGE, init);
        resize();
        parent.addEventListener(Event.RESIZE, resize);
    }

    private function resize (e : Event = null) : void 
    {
        if (this.changed ||  ((parent is ExtendedSprite) ? (parent as ExtendedSprite).changed : true)) 
        {
            // recalculate position (if changes sets this.changed)
                
            // recalculate dimensions and apply mask (if changes sets this.changed)
                
            if (this.changed) 
            {
                dispatchEvent(new Event(Event.RESIZE));
            }

            this.changed = false;
        }
    }
}


Flash ActionScript 3: Component
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Component extends ESprite 
{
    public function Component () 
    {
        super();
        
        if (stage) init();
        else this.addEventListener(Event.ADDED_TO_STAGE, init);
    }

    private function init (e: Event = null) : void 
    {       
        this.removeEventListener(Event.ADDED_TO_STAGE, init);
        resize();
        parent.addEventListener(Event.RESIZE, resize);
    }

    private function resize(e : Event = null) : void
    {

    }
}

  • CTVirus
  • Registratie: Januari 2000
  • Laatst online: 14-11 11:45

CTVirus

Dexterslab FAN

Topicstarter
Solved.

In de init functie in de class Component:

code:
1
    super.addEventListener(Event.RESIZE, resize, false, 10, true);


Zodat deze (priority op 10 gezet) altijd als eerste zal worden uitgevoerd, als de super class een resize event dispatched.

[ Voor 10% gewijzigd door CTVirus op 01-10-2008 16:04 ]