Category : Actionscript3.0

Draw circle by Quadratic Bezier curve

二次ベジェ曲線で円を描画して、ゆらゆら

Progression4 × gaforflash

progression4でGoogle Analytics for Flashを使ってみる

ちょっと使う機会があったのでメモ。
一応、ちゃんと取得出来ているので良しとしておこう。。。

// IndexScene.as

package
{
	import com.flashdynamix.utils.SWFProfiler;
	import com.google.analytics.GATracker;

	public class IndexScene extends SceneObject
	{
		private var _tracker:GATracker;
		private var _swfPath:String;

		public function IndexScene( name:String = null, initObject:Object = null )
		{
			// google analytics
			_tracker = new GATracker( container, "UA-xxxxxxxx-x", "AS3", false );
			manager.addEventListener( ProcessEvent.PROCESS_COMPLETE, onProcessComplete );

			// localhost じゃない場合は swf のパスを取得
			if ( _tracker.config.domainName != "localhost" )
			{
				var _array:Array = manager.stage.loaderInfo.url.split( "/" );
				_swfPath = ( ( _array.length > 4 ) ? "/" : "" ) +  _array.slice( 3, _array.length - 1 ).join( "/" ) + "/";
			}
		}

		// PROCESS_COMPLETE
		private function onProcessComplete( e:ProcessEvent ):void
		{
			if ( _swfPath )
			{
				// google analytics
				var _pathArray:Array = e.targetScene.sceneId.path.split( "/" );
				_tracker.trackPageview( _swfPath + _pathArray.slice( 2, _pathArray.length ).join( "/" ) );
			}
		}
	}
}

■コンストラクタで GATracker を生成して、 イベントリスナーを登録する。(16、17行目)
GATracker の第1引数に DisplayObject を指定し、第2引数に Google Analytics のIDを指定。
第3引数に mode を指定(今回は “AS3″)、第4引数はデバッグの ON/OFF。
第5引数以降はまたの機会に。。。
シーンの遷移後にトラッキングを実行したいのでイベントタイプは ProcessEvent.PROCESS_COMPLETE。

■シーン遷移時にトラッキングを実行(34行目)
_tracker.trackPageview(“/hogehoge”); でトラッキングを実行。

■参考サイト
Google Analytics Tracking for Adobe Flash 関連ドキュメントの日本語訳

それにしても、やっぱり便利すぎるProgression

for-each-in / for-in

for-each-inとfor-inの違い

意外と知らなかった・・・。

package
{
	import flash.display.Sprite;

	public class ForTest extends Sprite
	{
		private var _obj:Object;

		public function ForTest()
		{
			_obj = {};
			_obj.city = "Tokyo";
			_obj.country = "Japan";

			for each ( var o:* in _obj )
			{
				trace( o );
			}
			/*
			*	出力結果:値を出力
			*	Tokyo
			*	Japan
			*/

			for ( var p:* in _obj )
			{
				trace( p );
			}
			/*
			*	出力結果:変数名を出力
			*	city
			*	country
			*/

			for ( var q:* in _obj )
			{
				trace( _obj[q] );
			}
			/*
			*	出力結果:値を出力
			*	Tokyo
			*	Japan
			*/
		}
	}
}

try / catch

例外のバブリング

例外がthorwされた場合のバブリングについて。

■tryブロック内でthrowされた場合

try
{
	throw new Error( "error" );
}
catch( e:Error )
{
	// 問題の処理
}

throwされた値のデータ型(上記の場合はError型)に一致するパラメータのデータ型を持つcatchブロックを探す。

■catchブロックが見つからない、もしくは、tryブロック外でthrowされた場合

// ProblemClass.as

package
{
	public class ProblemClass
	{
		public function ProblemClass()
		{
		}

		public function doSomething():void
		{
			throw new Error( "エラー" );
		}
	}
}
// NormalClass.as

package
{
	public class NormalClass
	{
		public function NormalClass()
		{
			var _problem:ProblemClass = new ProblemClass();

			_problem.doSomething();
		}
	}
}
// ErrorTest.as

package
{
	import flash.display.Sprite;

	public class ErrorTest extends Sprite
	{
		public function ErrorTest()
		{
			try
			{
				var _normal:NormalClass = new NormalClass();
			}
			catch( e:Error )
			{
				trace( "例外はErrorTest内でキャッチされました" );
				// 問題の処理
			}
		}
	}
}

Actionscriptは一致するcatchブロックを持ったtryブロックを、コールスタック全体の下から上に検索する。
上記の例は例外をthrowするメソッドを呼び出したメソッドの呼び出し元がtryブロックに囲まれているので、例外をthrowするメソッドがコールスタックの2階層上でキャッチされる。

■適したcatchブロックがない場合

例外に適したcatchブロックがコールスタックのどこにも見つからない場合、Actionscriptはその時点でコールスタックに残っている全てのコードの実行をやめる。
デバッグ版の場合は、エラーが出力される。

sharedEvents

異なるドメイン間でのイベントの共有

異なるドメイン間の2つの.swfファイルで、allowDomain()を使用せずにイベントを共有する方法。

LoaderInfoクラスのインスタンス変数のsharedEventsを使用する。
ある特定のイベントに関して、sharedEventsを通して、イベントを転送する。

■index.swf(読み込む側)

package
{
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLRequest;

	public class index extends Sprite
	{
		private var _loader:Loader;

		public function index()
		{
			// .swfのロード
			_loader = new Loader();
			_loader.load( new URLRequest( "http://hoge.com/child.swf" ) );
			addChild( _loader );

			// Event.MOUSE_LEAVEイベントに関する登録
			stage.addEventListener( Event.MOUSE_LEAVE, onMouseLeave );
		}

		// イベントリスナー
		private function onMouseLeave( e:Event ):void
		{
			// child.swfに転送
			_loader.contentLoaderInfo.sharedEvents.dispatchEvent( e );
		}
	}
}

■child.swf(読み込まれる側)

package
{
	import flash.display.Sprite;
	import flash.events.Event;

	public class child extends Sprite
	{
		public function child()
		{
			// Event.MOUSE_LEAVEイベントに関する登録
			loaderInfo.sharedEvents.addEventListener( Event.MOUSE_LEAVE, onMouseLeave );
		}

		// sharedEventsをターゲットにした、イベントリスナー
		private function onMouseLeave( e:Event ):void
		{
			trace( "child.onMouseLeave()が呼び出されました。" );
		}
	}
}