1
votes

How can I get a single view in my PureMVC app to use Starling with it's own mediator and communicate with the rest of the application?

The rest of the application will NOT be using starling.

From my research so far, it looks like starling can only be activated on the main "Document class" of a swf?

1
Thats great but what about when combining more than 1 Starling instance with possibly an Away3D instance? Would you make use of a PureMVC proxy to represent the stage3D instance as in this example? adobe.com/devnet/flashplayer/articles/… stackoverflow.com/users/… - Bachalo
I think this is supposed to be a comment? But yes, you can pass in the stage3D context into the starling instance, and use a Proxy to manage that. - Avik
You definitely would not use a Proxy to interface with the Stage3D instance (or Away3D). Proxies are for providing access to the application's data and remote services. A Mediator is more appropriate. - Cliff Hall
thanks cliff for the feedback - Bachalo
I think part of the confusion lies in the way Away3d refers to the Stage3D instance. Specifically getFreeStage3DProxy() of the Stage3Dmanager class and associated stage3DProxy property of the View3D class So though semantically, it would make sense to refer to it as a 'mediator' in practice I'm not sure in matters. If you check lee Brimelow's tutorial gotoandlearn.com/play.php?id=166 he has both initStarling and initAway3D methods, which, in a PureMVC world, would be part of the Starling and Away3D mediator onRegister methods respectively. - Bachalo

1 Answers

2
votes

Ok, so I figured out how to do this. A few things you need to know.

  1. Though Starling feels like a black box/walled garden, you do get a reference to your rootClass in the latest version via Starling.current.root
  2. You can create your starling instance just about anywhere if you have a reference to stage. So your mediator can look something like

    override public function onRegister():void {
        starlingInstance = new Starling(StarlingContainer, stageReference);
        starlingInstance.addEventListener(starling.events.Event.ROOT_CREATED, onStarlingRootCreated);
        starlingInstance.viewPort = new Rectangle(x, y, width, height);
        starlingInstance.start();
    }
    
    private function onStarlingRootCreated(event:starling.events.Event):void {
    
        viewComponent = Starling.current.root as StarlingContainer;
    }
    
  3. The important part is waiting for the Event.ROOT_CREATED event before setting the viewComponent to your Starling rootClass.

  4. You can get access to the starging stage3d context using Starling.current.stage or acccess to the nativeStage using Starling.current.nativeStage This is useful for listening to events outside of the StarlingContainer context.

Once you have set up your mediator in this way, you can treat your starling viewComponent just like any other viewComponent, send notifications etc.

Many thanks to the Starling forums.