DEJA-VUE.NET RIA Architect. Flash Platform Consultant and Trainer

15May/064

Open Source Flash Pizza for everyone !

Abrir este blog es un buen pretexto para revisar y ordenar mis viejas cajas ^^.
Hace algunos meses, lejos de imaginar la llegada del Free Flex SDK, encontrar una alternativa al framework as2 mx era realmente una apuesta vital. Es en relación a esto que me interesé en ActionStep.

¿Que puedo decir de ello?

Francamente, no es que le falte robustez, pero a día de hoy, tan sólo podemos preguntarnos sobre su lugar y su futuro.
El Roadmap ha reventado completamente y el anuncio hace algunos meses del Flex framework ha puesto la cuestión

Desde la salida de la versión alfa, había comenzado a experimentar un poco.
Flash Remotero de toda la vida, buscaba además una versión alternativa al paquete remoting de Adobe.
Mis fructíferos intercambios con Ray Chuan me han pertimido usar muy pronto el ASRemoting para la producción dado que la librería está disponible de manera independiente cargable ala DLL.

Estando apoyados la mayoría de mis proyectos en ARP, un primer test obvio era llevar Pizzaservice a ActionStep.

pizzaService.zip (183)

No entraré en el detalle del API, no es mi intención.

Hablaré sin embargo de una especificidad fundamental en el funcionamiento interno de ActionStep que me condujo a emplear un hack (totalmente legítimo) para hacerlo compatible con ARP.
El término "hack legítimo" no es casual:

- "Hack" porque ActionStep es ya, por sí mismo, un framework estructural.
- "Legítimo", ya que sus autores han pensando en dejar las puertas abiertas.

Integrar ActionStep y ARP es pues una idea más bien descabellada cuya realización parece bastante comprometida. En particular, por las razones siguientes:

- ActionStep nos protege de la manipulación directa de los MovieClips, encapsulando esta gestión en una jeraquía de tipo view.
- Los views dependen de una view principal (instanciada por NSWindow) cuya referencia MovieClip de base ha sido "hardcoded" y no es otra que _root.
- Como ya he dicho antes, Actionstep es tambíen un framework de tipo aplicativo y a priori concebido para inicializarse en la raíz del proyecto (NSapplication).

public function init()
{
    var app:NSApplication = NSApplication.sharedApplication();

    var window:NSWindow = (new NSWindow()).initWithContentRect(
    new NSRect(0,0,500,400));
    var view1:NSView = (new NSView()).initWithFrame(
    new NSRect(50,50,400,300));

    window.setContentView(view1);

    // Some UI instantiation later...
    view1.addSubview(ASLabel);
    view1.addSubview(NSStepper);

    // Start the mug...
    app.run();
}

¿Cómo hacer, pues? Es más simple de lo que parece.

La clase NSWindow contempla la posibilidad de cargar diferentes tipos de view principal. Simplificando, la view principal es:

- o bien de origen externo (cargando un SWF)
- o bien la view por defecto, de tipo ASRootWindowView.

¿"de tipo" ? ;) . Pues sí^^. Como ya habráis comprendido, la solución consiste en dar a NSWindow una view customizada donde el MovieClip en el cual se inicia la aplicación será de nuestra elección.

class org.actionstep.window.ASClipWindowView
    extends org.actionstep.window.ASRootWindowView
{
    public function ASClipWindowView() {
        super();
    }

    public function changeRoot(target:MovieClip) {
        WINDOW_CLIP = target
    }
}

// org.osflash.pizza.view.NavigationForm

import org.actionstep.window.ASClipWindowView;
import org.actionstep.*;

// ...

public function initialize()
{
    var app:NSApplication = NSApplication.sharedApplication();

    var window:NSWindow = (new NSWindow()).initWithContentRectViewClass(
    new NSRect(0,0,165,25), ASClipWindowView );

    ASClipWindowView(window.rootView()).changeRoot(this);

    var view:NSView = NSView((new NSView()).initWithFrame(
    new NSRect(0, 0, 165, 25)));

    window.setContentView(view);

    // ...

    // Start the mug...
    app.run()
}

Podemos ver esto como una "composición" donde cada ArpForm va a instanciar una NSApplication desde el metodo initialize().

Aparte del "gradient header" y de las "transiciones", todo es obra de ActionStep.

Tendría mucho que decir aún, sobre todo concerniente a su librería Remoting.
Será el tema de un próximo artículo donde cuento con presentar diferentes maneras de cargar en DLL, desmenuzar el ASResponse (equivalente del ResultEvent) y el ASRecordSet, y subrayar la diferencia de implementación en el ServiceLocator y las subclases CommandTemplate.

Hablemos ahora de lo que no es ActionStep.

Reconstruir pizzaService sin soporte de un fichero FLA era para mí una condición y no suponía ningún desafío mayor. Importar fuentes no presentaba tampoco más dificultad.
La problemática surgió sin embargo a la hora de optar por cargar dinámicamente las fuentes. Ahí me encontré confrontado de nuevo al suplicio de las librerías compartidas.

La solución vino de una sugerencia que me hizo Chris Bare en la mailing-list de SWFMILL.
Una solución que pasa por lo que el mismo no duda en llamar un "analisis educativo". Big thank to him for this invaluable tip.

He aquí, pues, la navegación de nuestro open source pizzaService con NSButtons de estilo determinado dinámicamente.

Para los efectos "Tween", he preferido el paquete transitions de Pixlib.
Si no conocáis aún este fantástico framework polivalente, id enseguida a descubrirlo. Es una verdadera navaja suiza. Simplemente, ya no puedo pasarme sin ella ^^.

Pequeño paréntesis sobre Pixlib.
Le dedicaré varios tópicos, incluso puede que el siguiente.
Personalmente, cuando ARP me parece a veces sobrecargado para ciertos tipos de aplicaciones, generalmente prefiero en su lugar el paquete MVC de Pixlib.

Volvamos a las "transiciones"...
El cambio es realmente muy simple:

import mx.transitions.*
var t:Tween = new Tween(
    target, "prop", pennerEasing, begin, finish, duration, useSeconds);

avec Pixlib

import com.bourre.transitions.*;
var t:BasicTweenFPS = (new BasicTweenFPS(
    target, "prop", finish, duration, begin, pennerEasing)).execute();
or
var t:BasicTweenMS = (new BasicTweenMS(
    target, "prop", finish, duration, begin, pennerEasing)).execute();

No olvidáis descargar y poner en su classPath las ecuaciones de Penner si no las tenéis ya.

EventDispatching

Finalmente, tan sólo falta una cosa a nuestro servicio de pizza para merecer su sello OSFlash: liberarse del EventDispatcher.
La clase EventBroadcaster de Pixlib viene pues a reemplazarlo (de manera totalmente polimorfica). Cuando os digo que Pixlib cubre todas las necesidades...

Voy a dejarlo aquí. Aprenderéis más por vosotros mismos examinando las fuentes.
Notad que podéis también empezar por explorar la aplicación aquí con Xray (la pizza se entrega con su conector ^^)

Una vez más, tan sólo era un experimento de laboratorio. Además la revisión que usé es relativamente antigua (mes de Febrero, creo). No os sorprendáis, pues, si vuestra compilación falla con la ultima revisión.

El proyecto ha sido desarollado con FlashDevelop. Aprovecho para saludar al equipo de FD y felicitar su formidable labor!

Gracias por haber leído este primer post de verdad :) .

Comentarios (4) Trackbacks (0)
  1. nice work everyone…

  2. Very good! Thanks for sharing ;)

  3. Great work! I like pizza ;)

    I’m particulary interested in how you successfully used ActionStep and ARP. But I’m not really sure how you did it. Or did you just use Pixlib instead of ARP?

    I also noticed that some of your examples store references to NSApplication but don’t use it. That’s not really required. You can just do in one line at the end of all your code:

    [AS]
    // initing stuff…
    NSApplication.sharedApplication().run();
    [/AS]

    Once again, good job!

  4. Thanks Ray !

    did you just use Pixlib instead of ARP?

    Well, Open Source Pizza service is an ARP application. No doubt about that.

    Specificity and major difference are the following:

    - Each form instantiates its own NSApplication.
    - Pixlib comes into play as replacement for EventDispatcher.

    As I said, it’s not very polished. For example, ActionStep’s notification center
    would have been a better choice as event system (see Scott’s suggestion).

    Thanks for stopping by :)


Deja un comentario


Sin trackbacks por el momento.

Bad Behavior has blocked 177 access attempts in the last 7 days.