21
Robotlegs Workshop 29 january 2011 Eric-Paul Lecluse & Erik van Nieuwburg Monday, January 31, 2011

Robotlegs Introduction

Embed Size (px)

DESCRIPTION

A basic introduction about the tools of robotlegs and swiftsuspenders to create a basic Robotlegs project.

Citation preview

Page 1: Robotlegs Introduction

Robotlegs Workshop29 january 2011

Eric-Paul Lecluse & Erik van Nieuwburg

Monday, January 31, 2011

Page 2: Robotlegs Introduction

What is Robotlegs?• MVC framework

• Looks a lot like pureMVC

• Focused on wiring application tiers

• Lightweight / small footprint

• Based on ‘dependency injection’ via SwiftSuspenders library

Monday, January 31, 2011

Page 3: Robotlegs Introduction

Dependency Injection?

• It’s the act of supplying objects with their required data.

• Passing an argument to a constructor is an example of dependency injection.

• Less boilerplate code

• Flexible adding of alternative implementations of a given service.

Monday, January 31, 2011

Page 4: Robotlegs Introduction

Robotlegs + Dependency Injection

• Based on SwiftSuspenders (metadata driven Inversion Of Control solution for AS3)

• Evolves around 2 meta tags: [Inject] and [PostConstruct]

• If you don’t use the supplied SWC files , add these parameters to MXMLC:

• -keep-as3-metadata+=Inject

• -keep-as3-metadata+=PostConstruct

Monday, January 31, 2011

Page 5: Robotlegs Introduction

So what does a class look like?

package com.rumblingskies.view{ import com.rumblingskies.model.ScoreModel; import org.robotlegs.mvcs.Mediator;

public class BallMediator extends Mediator { [Inject] public var scoreModel:ScoreModel;

override public function onRegister() : void { } }}

Monday, January 31, 2011

Page 6: Robotlegs Introduction

But how to inject? Typically, during startup of your app, you define injector rules. You can do that in 4 ways:

injector.mapValue(MyClass, myClassInstance);

injector.mapClass(MyClass, MyClass);

injector.mapSingleton(MyClass);

injector.mapSingletonOf(IMyClass, MyClass);

Monday, January 31, 2011

Page 7: Robotlegs Introduction

injector.mapValue (MyClass, myClassInstance);

When asked for a specific class, use this specific instance of the class for injection.

Monday, January 31, 2011

Page 8: Robotlegs Introduction

injector.mapClass (MyClass, MyClass);

When asked for a specific class, create and inject a new instance of that class.

Monday, January 31, 2011

Page 9: Robotlegs Introduction

injector.mapSingleton(MyClass);

When asked for a specific class, always provide the same instance of that class.

No more writing Singleton logic :-)This is a managed single instance, enforced by the framework, and not a Singleton enforced within the class itself.

Monday, January 31, 2011

Page 10: Robotlegs Introduction

injector.mapSingletonOf (IMyClass, MyClass);

When asked for a specific class, always provide the same instance of the implementation that class.

No more writing Singleton logic :-)This is a managed single instance, enforced by the framework, and not a Singleton enforced within the class itself.

Monday, January 31, 2011

Page 11: Robotlegs Introduction

Robotlegs Architecture

Built up in 4 tiers:•Model•View•Controller•Services

Services are models, but for communication with the outside world. For instance loading an image from Flickr.

Monday, January 31, 2011

Page 12: Robotlegs Introduction

Model

Contains / maintains your application’s data / state

Extends ‘Actor’ class so it can dispatch events

Dumb objects: receive value changes and then dispatch events. That’s it.

Monday, January 31, 2011

Page 13: Robotlegs Introduction

public class ScoreModel extends Actor { private var _score:Number; public function ScoreModel() { }

public function get score() : Number { return _score; }

public function set score(score : Number) : void { _score = score; dispatch(new ScoreEvent(ScoreEvent.UPDATE)); } }

Monday, January 31, 2011

Page 14: Robotlegs Introduction

Model Instantiation

Typically, you inject Model instances.

So during system startup, define injector rules for injection of Models:

injector.mapSingleton(ScoreModel);

This way your ScoreModel class is behaving as a Singleton.

Monday, January 31, 2011

Page 15: Robotlegs Introduction

View

The visual elements of your app

To interact with the framework they have a seperate Mediator class

Mediators listen to • events travelling through the framework• events sent by their view component

Monday, January 31, 2011

Page 16: Robotlegs Introduction

View instantiation

Again, during system startup you typically tell the framework which views and mediators work together.

mediatorMap.mapView( viewClass, mediatorClass, injectViewAs, autoCreate, autoRemove );

By default, mediators are auto-created when a view is ADDED_TO_STAGE!

It’s fully automated! Yeah.....i know.....it rocks :-)

Monday, January 31, 2011

Page 17: Robotlegs Introduction

public class Ball extends Sprite { public function Ball() { redraw(); }

public function redraw() : void { graphics.clear(); graphics.beginFill(0xffffff *

Math.random()); graphics.drawCircle(0, 0, 25); } }

Monday, January 31, 2011

Page 18: Robotlegs Introduction

public class BallMediator extends Mediator { [Inject] public var ballView : Ball; [Inject] public var stats:StatsModel;

override public function onRegister() : void { addViewListener(MouseEvent.CLICK, handleViewClick); addContextListener(HelloRobotLegsEvent.BALL_CLICKED, handleBallClicked); }

private function handleViewClick(e : MouseEvent) : void { stats.recordBallClick(); dispatch(new HelloRobotLegsEvent(HelloRobotLegsEvent.BALL_CLICKED)); }

private function handleBallClicked(e : HelloRobotLegsEvent) : void { ballView.redraw(); } }

Monday, January 31, 2011

Page 19: Robotlegs Introduction

CommandsAre similar to pureMVC commands.

Run an execute() method

At system startup, map your Commands to framework Events like this:

commandMap.mapEvent(MyAppDataEvent.DATA_WAS_RECEIVED, MyCoolCommand, MyAppDataEvent);

Robotlegs natively does not have a MacroCommand like pureMVC.

Monday, January 31, 2011

Page 20: Robotlegs Introduction

public class CreateBallCommand extends Command { [Inject] public var event:HelloRobotLegsEvent; override public function execute() : void { var ball : Ball = new Ball(event.ballName); ball.x = Math.random() * 500; ball.y = Math.random() * 400; contextView.addChildAt(ball, 0); } }

Monday, January 31, 2011

Page 21: Robotlegs Introduction

Quickstart HelpDownload ZIP file here:

www.rumblingskies.com/files/robotlegs-workshop/pong.zip

1) Subclass Context class and overwrite the startup() method

2) Configure the injector

3) fill mediatorMap

4) fill commandMap

5) add children to contextView

6) start writing logic in Model, Mediator, View and Command classes.

Monday, January 31, 2011