Progression 02 シーン遷移

単純なシーン遷移のサンプル


ソース

package 
{
	import jp.progression.*;
	import jp.progression.casts.*;
	import jp.progression.config.*;
	import jp.progression.debug.*;
	/**
	 * ...
	 * @author matsu4512
	 */
	public class Main extends CastDocument  
	{		
		public function Main() 
		{
			super( "index", IndexScene, new WebConfig() );
		}
		
		/**
		 * SWF ファイルの読み込みが完了し、stage 及び loaderInfo にアクセス可能になった場合に送出されます。
		 */
		protected override function atReady():void 
		{
			// 開発者用に Progression の動作状況を出力します。
			Debugger.addTarget( manager );
			// 最初のシーンに移動します。
			manager.goto( manager.syncedSceneId );
		}		
	}
}

import caurina.transitions.properties.*;
import flash.display.*;
import flash.text.*;
import jp.progression.casts.*;
import jp.progression.casts.buttons.*;
import jp.progression.commands.*;
import jp.progression.commands.display.*;
import jp.progression.commands.lists.*;
import jp.progression.commands.net.*;
import jp.progression.commands.tweens.*;
import jp.progression.data.*;
import jp.progression.events.*;
import jp.progression.scenes.*;
class IndexScene extends SceneObject {
	private var page1:Scene, page2:Scene, page3:Scene;
	private var btn1:NewCastButton, btn2:NewCastButton, btn3:NewCastButton;
	
	public function IndexScene() {
         // シーンを作成
        page1 = new Scene("page1", 0xFF);
		page2 = new Scene("page2", 0xFF00);
		page3 = new Scene("page3", 0xFF0000);
		//シーンを追加
		addScene(page1);
		addScene(page2);
		addScene(page3);
		//ボタンの生成
		btn1 = new NewCastButton("/index/page1", "page1", { x:50, y:50 } );
		btn2 = new NewCastButton("/index/page2", "page2", { x:50, y:150 } );
		btn3 = new NewCastButton("/index/page3", "page3", { x:50, y:250 } );
	}
	
	//このシーンに移動してきたときに実行
	override protected function atSceneInit():void 
	{
		//ボタンを表示
		addCommand(
			new AddChild(container, btn1),
			new AddChild(container, btn2),
			new AddChild(container, btn3)
		);
	}
		
	//別のシーンへの移動時に実行
	override protected function atSceneGoto():void 
	{
		//ボタンを削除
		addCommand(
			new RemoveChild(container, btn1),
			new RemoveChild(container, btn2),
			new RemoveChild(container, btn3)
		);
	}
}

class Scene extends SceneObject {
	private var sp:Sprite;
	private var btn:NewCastButton;
	public function Scene(name:String, color:uint) {
		super(name);
		sp = new Sprite();
		sp.graphics.beginFill(color);
		sp.graphics.drawRect(0, 0, 500, 500);
		sp.graphics.endFill();
		
		var txt:TextField = new TextField();
		txt.defaultTextFormat = new TextFormat(null, 100);
		txt.autoSize = TextFieldAutoSize.LEFT;
		txt.text = name;
		txt.x = 250 - txt.width / 2;
		txt.y = 250 - txt.height / 2;
		sp.addChild(txt);
		
		btn = new NewCastButton("/index/", "Index", { x:50, y:50 } );
	}
			
	//このシーンに移動してきたときに実行
	override protected function atSceneInit():void 
	{
		addCommand(
			new AddChild(container, sp),
			new AddChild(container, btn)
		);
	}
		
	//別のシーンへの移動時に実行
	override protected function atSceneGoto():void 
	{
		addCommand(
			new RemoveChild(container, btn),
			new RemoveChild(container, sp)
		);
	}
}

class NewCastButton extends CastButton 
{
	public function NewCastButton(link:String, label:String, initObject:Object = null) 
	{
		super( initObject );
		
		var txt:TextField = new TextField();
		txt.text = label;
		addChild(txt);
		
		// 移動先となるシーン識別子を設定します。
		sceneId = new SceneId( link );			
	}
}

Progression 01 導入

Progressionをしっかり勉強していくので、やったことを細かくメモしていこうと思います。


開発環境はFlashDevelopでやっていきます。
まずはFlashDevelopのダウンロードと環境設定などはここに分かりやすくまとめてありました。すごく助かります。
http://flashdevelop.jp/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8


あと、Progression用テンプレートをインストール
これも上のFlashDevelop.jpにまとめてあります。


環境はこれで整ったと思うので次回からはコードを載せていきます。

QuickBox2D addGroup

addGroup関数を使うと生成した複数の物体を一つの物体としてまとめることが出来る。


サンプル


ソース

package
{
	import com.actionsnippet.qbox.QuickBox2D;
	import com.actionsnippet.qbox.QuickObject;
	
	import flash.display.MovieClip;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	
	[SWF(width=500, height=500)]
	public class QB_sample08 extends MovieClip
	{
		private const SCALE:int = 30;
		
		public function QB_sample08()
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			
			var sim:QuickBox2D = new QuickBox2D(this);
			
			sim.createStageWalls();
			
			var circle1:QuickObject = sim.addCircle({x:0, y:0, radius:50/SCALE});
			var circle2:QuickObject = sim.addCircle({x:50/SCALE, y:0, width:20/SCALE, height:20/SCALE});
			var circle3:QuickObject = sim.addCircle({x:-50/SCALE, y:0, width:20/SCALE, height:20/SCALE});
			//3つの物体をくっつけて一つの物体にする
			sim.addGroup({objects:[circle1, circle2, circle3], x:250/SCALE, y:250/SCALE});
			
			sim.start();
			sim.mouseDrag();
		}
	}
}

Simple Slide Show

ちょっと思いつきでスライドショー作ってみました。


画像を分割してそれらを初めはscaleX, scaleYを共に0にしておいて、おとは左上から右下のブロックを順番に大きくしています。
この順番の求め方はこのようになっています。

order = new Vector.<Point>;
for(var l:int = 2; l <= row+col; l++){
	for(i = 1; i < l; i++){
		var j:int =l-i;
		if(i<=row && j<=col) order.push(new Point(i-1, j-1));
	}
}

rowとcolっていうのは画像の行列それぞれの分割数です。
これでorderの先頭に入っている座標のブロックから順番に操作してあげればOK。

wonderflで開催されているJAMに参加


今月のテーマは「MediaRSSをフィードとするフォトビューアをつくってください」
私は選んだ写真でブロック崩しが遊べるというものを作ってみました。



仕様
Timeが0でGemeOver
Stageが進むごとにTimeの減少が激しくなる
Lvが上がるごとに貫通弾が出しやすくなるが弾の速さが上昇
ボールを落とすとTimeが半分、さらにTimeの減少値が増加

QuickBox2D 衝突のグループ分け


QuickBox2Dの各オブジェクトにはmaskBits, categoryBitsというパラメータがあり、maskBitsとcategoryBitsの論理積をとって0以外になれば衝突、0なら衝突判定はなしになる。


サンプル


ソース

package
{
	import com.actionsnippet.qbox.QuickBox2D;
	
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	
	[SWF(width=500, height=500)]
	public class QB_sample03 extends MovieClip
	{
		public function QB_sample03()
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			
			var sim:QuickBox2D = new QuickBox2D(this);
			
			//maskBitsとcategoryBitsの論理積をとって0以外になれば衝突する。0なら衝突はなし。
			
			/*

				categoryBits 1      0000 0000 0000 0001
				maskBits     0xffff 1111 1111 1111 1111
			*/
			sim.createStageWalls();
			
			/* 

				categoryBits 2 0010
				maskBits     3 0011
			*/
			for(var i:int = 0; i < 3; ++i)
				sim.addCircle( { x:1+5*i, y:2, radius:1, fillColor:0xFF0000, lineAlpha:0, fillAlpha:0.5, categoryBits:2, maskBits:3 } );
			
			/*
				三角
				categoryBits 4 0100
				maskBits     5 0101
			*/
			for(i = 0; i < 3; ++i)
				sim.addPoly( { x:3+5*i, y:2, verts:[[0, 0, 2, 2, 0, 2]], fillColor:0x00CC00, lineAlpha:0, fillAlpha:0.5, categoryBits:4, maskBits:5 } );
			
			/*
				四角
				categoryBits 8 1000
				maskBits     9 1001
			*/
			for(i = 0; i < 3; ++i)
				sim.addBox( { x:5+5*i, y:2, width:2, height:2, fillColor:0x0000FF, lineAlpha:0, fillAlpha:0.5, categoryBits:8, maskBits:9 } );
			
			sim.start();
			sim.mouseDrag();
		}
	}
}


参考サイト
http://blog.alumican.net/2009/07/05_024440