Progression4をControllerとして使う練習2

先日のに下階層を加えてみた。とりあえず動くけど、Progression4のいいところがぜんぜん活用できてないような。

▼Wonderfl

▼ActionScript AS3(FP10)
[sourcecode language=”as3″]
/*
Progression4の練習。4

シーンとかページとかとはちょっと違う構成、
例えば3D空間を移動するなどの時に
Progression4をControllerとして使うとすると、
どうしたらいいんだろう。

試行錯誤中

うーん、はやくもコードがぐちゃぐちゃ。
要整理。

Progression4のいいところがぜんぜん活用できてないような。

*/
package {
import flash.display.*;
import flash.events.MouseEvent;
import flash.geom.PerspectiveProjection;
import flash.geom.Point;
import flash.text.TextField;
import flash.text.TextFormat;

import jp.progression.*;
import jp.progression.config.*;
import jp.progression.debug.*;
import jp.progression.events.*;
import jp.progression.executors.ExecutorObjectState;

[SWF(width = 465, height = 465, backgroundColor = 0x000000, frameRate = 30)]
public class Main extends Sprite {
public var manager:Progression;
private var _view:View;
private var _tf:TextField;
private var _data:Data = new Data();
public function Main() {

stage.transform.perspectiveProjection = new PerspectiveProjection();
stage.transform.perspectiveProjection.projectionCenter = new Point(465/2,465/2);

Progression.initialize( new BasicAppConfig() );
manager = new Progression( "index", stage, IndexScene );
_data.s1 = 0;
//Debugger.addTarget( manager );
addView();
manager.goto( manager.root.sceneId );
manager.addEventListener(ProcessEvent.PROCESS_START, onProcessStart);
}
private function addView():void{
_view = new View();
_view.x = 465/2;
_view.y = 465/2;
this.addChild(_view);
stage.addEventListener(MouseEvent.CLICK, clickHandler);
_tf = new TextField();
_tf.defaultTextFormat = new TextFormat("_sans", 18, 0xFFFFFF);
_tf.text = "index";
_tf.autoSize = "left";
this.addChild(_tf);
}

private function clickHandler(e:MouseEvent):void {
if (manager.state > ExecutorObjectState.IDLING) {
manager.stop();
}
var arr:Array = String(e.target.name).split("/");
if (arr.length > 0) {
_data.setScene(arr);
if(arr.length == 1){
manager.goto(manager.root.scenes[int(arr[0])].sceneId);
}else if(arr.length == 2){
manager.goto(manager.root.scenes[int(arr[0])].scenes[int(arr[1])].sceneId);
}else if(arr.length == 3){
manager.goto(manager.root.scenes[int(arr[0])].scenes[int(arr[1])].scenes[int(arr[2])].sceneId);
}
}
}

private function onProcessStart(event:ProcessEvent):void {
_tf.text = String(manager.destinedSceneId);
_view.pitchStep(_data);
}
}
}

class Data {
private var _s1:int = -1;
private var _s2:int = -1;
private var _s3:int = -1;
private var _prevS1:int = -1;
private var _prevS2:int = -1;
private var _prevS3:int = -1;
public function Data() { };
public function setScene(array:Array):void {
_prevS1 = _s1;
_prevS2 = _s2;
_prevS3 = _s3;
_s1 = int(array[0]);
_s2 = (array.length >= 2)?int(array[1]): -1;
_s3 = (array.length >= 3)?int(array[2]): -1;
}
public function getScene():Array {
return [_s1, _s2, _s3];
}
public function get s1():int { return _s1 };
public function set s1(value:int):void {
_prevS1 = _s1;
_s1 = value;
}
public function get prevS1():int { return _prevS1 };
public function get s2():int { return _s2 };
public function set s2(value:int):void {
_prevS2 = _s2;
_s2 = value;
}
public function get prevS2():int { return _prevS2 };
public function get s3():int { return _s3 };
public function set s3(value:int):void {
_prevS3 = _s3;
_s3 = value;
}
public function get prevS3():int { return _prevS3 };
}

import jp.progression.casts.*;
import jp.progression.commands.*;
import jp.progression.commands.display.*;
import jp.progression.commands.lists.*;
import jp.progression.commands.managers.Goto;
import jp.progression.commands.net.*;
import jp.progression.commands.tweens.*;
import jp.progression.data.*;
import jp.progression.events.*;
import jp.progression.executors.ExecutorObjectState;
import jp.progression.scenes.*;

class IndexScene extends SceneObject {
public function IndexScene() {
var sp:CastSprite = new CastSprite();
sp.id = "sqIndex";
}

protected override function atSceneLoad():void {
addCommand(
new AddChild( container, "sqIndex" ),
function():void {
for (var i:int = 0; i < 6; i++) {
var SO:SceneObject = new SceneObject("s" + String(i));
addScene(SO);
for (var j:int = 0; j < 3; j++) {
var SO3rd:SceneObject = new SceneObject("t" + String(j));
SO.addScene(SO3rd);
for (var k:int = 0; k < 6; k++) {
SO3rd.addScene(new SceneObject("u" + String(k)));
}
}
}
}
);
}
protected override function atSceneInit():void {
addCommand();
}
protected override function atSceneGoto():void {
addCommand();
}
}

import flash.display.*;
import org.libspark.betweenas3.BetweenAS3;
import org.libspark.betweenas3.easing.*;
import org.libspark.betweenas3.tweens.ITween;

import flash.display.Sprite;
class View extends Sprite{
private var _canvas:ViewSprite1st;
private var _t:ITween;
public function View():void{
_canvas = new ViewSprite1st();
this.addChild(_canvas);
}
public function pitchStep(_data:Data):void {
var step:int = _data.s1;
var sNum:int = _data.s2;
if (_data.prevS1 == _data.s1) {
_canvas.select(_data);
}else{

var degree:Number = (_data.s1/6)*360;
if(((_data.prevS1/6)*360-degree)<-180){
degree = -360+degree;
}else if (((_data.prevS1 / 6) * 360 – degree) > 180) {
degree = 360+degree;
}
if (_t != null) {
_t.stop();
if(_canvas.rotationY-degree > 180){
degree = 360+degree;
}
}
_t = BetweenAS3.serial(
BetweenAS3.tween(_canvas, { depth:1}, null, 0.3, Expo.easeIn),
BetweenAS3.tween(_canvas, { rotationY:degree}, null, 0.4),
BetweenAS3.tween(_canvas, { depth:0}, null, 0.3, Expo.easeIn)
);
_t.onComplete = function():void {
_canvas.rotationY = (degree + 360) % 360;
_canvas.select(_data);
};
_t.play();
}
}
}

import flash.geom.PerspectiveProjection;
import flash.geom.Point;
import flash.geom.Vector3D;
import flash.geom.Matrix;
import flash.events.Event;
class ViewSprite1st extends Sprite{
private var _sprites:Array;
private var _rotationY:Number = 0;
private var _depth:Number = 0;
public function ViewSprite1st():void{
this.addEventListener(Event.ADDED_TO_STAGE,onStage);
}
private function onStage(event:Event):void{
this.removeEventListener(Event.ADDED_TO_STAGE,onStage);
this.z = 0;
_sprites = [];
var colors:Array = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0x00FFFF, 0xFF00FF];
for (var i:int = 0; i < 6; i++) {
_sprites[i] = new ViewSprite2nd(i);
this.addChild(_sprites[i]);
}
rotationY = 0;

}
public function select(_data:Data):void {
if( _data.prevS1 != _data.s1){
_sprites[_data.prevS1].select(_data);
}
_sprites[_data.s1].select(_data);
}
public function get depth():Number{
return _depth;
}
public function set depth(value:Number):void{
_depth = value;
rotationY = _rotationY;
}
override public function get rotationY():Number{
return _rotationY;
}
override public function set rotationY(value:Number):void{
_rotationY = (value+360)%360;
var n:int = _sprites.length;
for (var i:int = 0; i < n; i++) {
_sprites[i].x = Math.cos(Math.PI*(i/3+(90-_rotationY)/180))*350*(1+(1-_depth)/3.2);
_sprites[i].z = Math.sin(Math.PI*(i/3+(90-_rotationY)/180))*350*_depth;
_sprites[i].rotationY = ((((360-360*i/6+_rotationY))%180+90)%180-90)*_depth;
}
zSort(this);
}
private function zSort(target:DisplayObjectContainer):void {
if(!target.root){return};
var n:int = target.numChildren;
var array:Array = [];
var reference:Array = [];
for (var i:int = 0; i < n; i++) {
if (target.getChildAt(i).transform.matrix3D) {
var poz:Vector3D = target.getChildAt(i).transform.getRelativeMatrix3D(this.root.stage).position;
var point:Point = stage.transform.perspectiveProjection.projectionCenter;
array[i] = poz.subtract(new Vector3D(point.x, point.y, -stage.transform.perspectiveProjection.focalLength)).length;
reference[i] = target.getChildAt(i);
}
}
var temp:Array = array.sort(Array.NUMERIC | Array.RETURNINDEXEDARRAY);
for (i = 0; i < n; i++) {
if (target.getChildAt(i).transform.matrix3D) {
target.setChildIndex(reference[temp[i]],0);
if(reference[temp[i]].numChildren > 1){
zSort(reference[temp[i]]);
}
}
}
var s:int = Math.round(_rotationY / 60) % 6;
for (i = 0; i < n; i++) {
if(_sprites[i].z == 0){
_sprites[i].visible = (Math.abs(s-i)<=1 || Math.abs(s-i) == 5);
}else{
_sprites[i].visible = (_sprites[i].z > 0);
}
}
}
}

class ViewSprite2nd extends Sprite {
private var _colors:Array =  [0xFF0000,  0xFFFF00,  0x00FF00,  0x00FFFF,  0x0000FF,  0xFF00FF];
private var _btns:Array = [];
private var _contents:Array = [];
public function ViewSprite2nd(num:int):void {
this.graphics.lineStyle(3,0xFFFFFF);
this.graphics.beginGradientFill("linear", [_colors[num], 0x000000], [1, 1], [0x00, 0xFF], new Matrix(0.7, 0, -1, 0.7));
this.graphics.drawRect(-190,-190,380,380);
this.graphics.endFill();
this.name = String(num);
addContents(num);
}
private function addContents(s1num:int):void {
for (var i:int = 0; i < 3; i++) {
_btns[i] = new Sprite();
_btns[i].graphics.lineStyle(3,0×666666);
_btns[i].graphics.beginGradientFill("linear", [_colors[i], 0xFFFFFF], [1, 1], [0x00, 0xFF], new Matrix(0.7, 0, -1, 0.7));
_btns[i].graphics.drawRect(0,0,100,20);
_btns[i].graphics.endFill();
_btns[i].name = String(s1num) + "/" + i;
_btns[i].x = i * 110 – 110 – 55;
_btns[i].y = -170;
this.addChild(_btns[i]);

_contents[i] = new ViewSprite3rd(s1num, i);
this.addChild(_contents[i]);
}
}
public function select(_data:Data):void {
if(_data.s1 == int(this.name) && _data.s2 > -1){
_contents[_data.s2].visible = true;
_contents[_data.s2].select(_data);
}
if (_data.prevS1 == int(this.name)) {
if((_data.prevS1 != _data.s1 || _data.prevS2 != _data.s2) && _data.prevS2 > -1) {
_contents[_data.prevS2].visible = false;
_contents[_data.prevS2].select(_data);
}
}
}
}

class ViewSprite3rd extends Sprite {
private var _colors:Array =  [0xFF0000,  0xFFFF00,  0x00FF00,  0x00FFFF,  0x0000FF,  0xFF00FF];
private var _btns:Array = [];
private var _contents:Array = [];
public function ViewSprite3rd(s1num:int,s2num:int):void {
this.graphics.lineStyle(3,0xFFFFFF);
this.graphics.beginGradientFill("linear", [_colors[s2num], 0xFFFFFF], [1, 1], [0x00, 0xFF], new Matrix(0.7, 0, -1, 0.7));
this.graphics.drawRect(0,0,100,320);
this.graphics.endFill();
this.x = s2num * 110 – 110 – 55;
this.y = -170 + 25;
this.visible = false;
this.name = String(s1num) + "/" + s2num;
addContents(s1num,s2num);
}
private function addContents(s1num:int,s2num:int):void {
for (var i:int = 0; i < 6; i++) {
_btns[i] = new Sprite();
_btns[i].graphics.lineStyle(3, 0x666666);
_btns[i].graphics.beginGradientFill("linear", [_colors[i], 0xFFFFFF], [1, 1], [0x00, 0xFF], new Matrix(0.7, 0, -1, 0.7));
_btns[i].graphics.drawRect(0, 0, 30, 45);
_btns[i].graphics.endFill();
_btns[i].name = String(s1num) + "/" + String(s2num) + "/" + i;
_btns[i].x = 5;
_btns[i].y = 5 + i * 53;
this.addChild(_btns[i]);

_contents[i] = new Sprite();
_contents[i].graphics.lineStyle(3, 0xFFFFFF);
_contents[i].graphics.beginGradientFill("linear", [_colors[i], 0xFFFFFF], [1, 1], [0x00, 0xFF], new Matrix(0.7, 0, -1, 0.7));
_contents[i].graphics.drawRect(0, 0, 55, 45);
_contents[i].graphics.endFill();
_contents[i].name = String(s1num) + "/" + String(s2num) + "/" + i;
_contents[i].x = 40;
_contents[i].y = 5 + i * 53;
_contents[i].visible = false;
this.addChild(_contents[i]);
}
}
public function select(_data:Data):void {
if (_data.s3 != _data.prevS3) {
if (_data.s3 > -1) {
_contents[_data.s3].visible = true;
}
if (_data.prevS3 > -1) {
_contents[_data.prevS3].visible = false;
}
}
}
}
[/sourcecode]