2010/04/05 | 13:51 pm

SNS のリンク作成

今やってるプロジェクトで実装したときのメモ。

[ Twitter ]
クリックで自分のツイートにサイトのリンクと名前(任意)を入力済みにする

private function twitterButtonClick( e:MouseEvent ):void {
	var twitter_url:String = "http://twitter.com/home?status=";
	var site_name:String = escapeMultiByte("GRAM | グラム");
	var site_url:String = "http://www.brooklyn.jp/";
	var req:URLRequest = new URLRequest( twitter_url + site_name + " -- " + site_url );
	navigateToURL( req, "_blank" );
}

[ Facebook ]
Facebook の「プロフィール -> 掲示板」のとこにシェアで掲載できる。

private function facebookButtonClick( e:MouseEvent ):void {
	var facebook_url:String = "http://www.facebook.com/sharer.php?u=";
	var site_name:String = escapeMultiByte("GRAM | グラム");
	var site_url:String = "http://www.brooklyn.jp/";
	var req:URLRequest = new URLRequest( facebook_url + site_url + "&t=" + site_name );
	navigateToURL( req, "_blank" );
}

日本語を入力する場合は UTF-8 で URL エンコードが必要なので escapeMultiByte() を使って変換の必要アリ。

あと、Facebook の場合、こっちが指定した文字列とは関係なく、対象のサイトの title と description を取得してる。
しかも、サムネイルに使う画像も対象のサイトの img タグを引っこ抜いているんじゃないか疑惑、だとしたら相当高機能ですね、このシェアリンク。

COMMENT

CATEGORY

POSTED

jam

2010/02/24 | 12:02 pm

Progression と Firefox 3.6

Progression 3.1.82 を使っていて、Firefox の今のところ一番新しい Firefox 3.6 で確認したら、謎のスクロールバーが出現。。。

スクロールする範囲もないので、困ったもんですなっと。

とりあえず、progression.css に下記を追加で回避。

#flashcontent {
	position    :absolute;
	left        :50%;
	top         :50%;
	width       :740px;
	height      :300px;
	line-height	:0;
	margin-left :-370px;
	margin-top  :-150px;
	overflow	:hidden;	
	}

flash の全画面表示でも今のところ問題無しなので、多分大丈夫かと。

COMMENT

CATEGORY

POSTED

jam

2009/12/08 | 23:06 pm

iTunesへのリンク作る

アプリへのリンクは Generator があるので、それを使う
itmsLinkMaker

それか、もっと簡単なのは
———————————————————–
アーティスト:http://itunes.com/ARTIST_NAME
アプリ:http://itunes.com/app/APP_NAME
映画:http://itunes.com/movie/MOVIE_NAME
———————————————————–
といった感じで設置するとあとは勝手にリダイレクトしてくれる。

注)日本語の場合は2バイト文字を英語にするかデコードする必要アリ
ダメ → http://itunes.com/アーティスト
OK → http://itunes.com/artist
OK → http://itunes.com/%83A%81%5b%83e%83B%83X%83g

デコードする場合はこれ

COMMENT

CATEGORY

POSTED

jam

2009/12/02 | 0:47 am

Progression でクロスフェード

久々に Progression 使ってサイト構築したときの Tips

Progression でのシーンの移動の際、通常は _onGoto() と _onInit() 内にある addCommand() の2つの処理を待つのですが、
どーしてもクロスフェードが必要になった場合の処理。
SerialList を static な変数として生成しておいて、都度アクセスするのが一番効率良いやり方らしいス。
(自分確認ではなく開発者本人がおっしゃってたので、大丈夫かと。)

やり方はいたって簡単。
IndexScene と ChildScene の _onInit と _onGoto の addCommand() での処理で静的な変数として生成した SerialList を呼ぶ。
(注:そのままだと addCommand は SerialList のためクロスフェードしないので、ParallelList にしておく必要アリ)

-IndexScene.as


public static var customCommands:SerialList = new SerialList();	// ← これ!

public var page:IndexPage;

/**
* コンストラクタ
*/
public function IndexScene() {
	addScene( new ChildScene( "child" ) );

	page = new IndexPage();
	page.alpha = 0;
}

/**
* シーンオブジェクトが目的地だった場合に、到達した瞬間に送出されます。
* このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
*/
protected override function _onInit():void {
	// 実行したいコマンドを登録します。
	addCommand(
		new ParallelList( null,
			IndexScene.customCommands,	// ← ここで実行。初回は中身が空なので何も起きませぬ。
			new SerialList( null,
				new AddChild( progression.container, page ),
				new DoTweener( page, { alpha:1, time:2 } )
			)
		),
		function():void {
			IndexScene.customCommands.clearCommand( true );		// ← クロスフェード後に中身をクリアしとく
		}
	);
}

/**
* シーンオブジェクトが出発地だった場合に、移動を開始した瞬間に送出されます。
* このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
*/
protected override function _onGoto():void {
	IndexScene.customCommands.addCommand(	// ← ここでは RemoveChild しないで、customCommands に登録だけしておく
		new DoTweener( page, { alpha:0, time:2 } ),
		new RemoveChild( progression.container, page )
	);

	// 実行したいコマンドを登録します。
	addCommand(
	);
}

下階層のシーンでも基本的に処理は一緒。

-ChildScene.as

/**
* シーンオブジェクトが目的地だった場合に、到達した瞬間に送出されます。
* このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
*/
protected override function _onInit():void {
	// 実行したいコマンドを登録します。
	addCommand(
		new ParallelList( null,
			IndexScene.customCommands,	// ← ここで実行。IndexScene の _onGoto() で設定したコマンドが同時に実行されます。
			new SerialList( null,
				new AddChild( progression.container, page ),
				new DoTweener( page, { alpha:1, time:2 } )
			)
		),
		function():void {
			IndexScene.customCommands.clearCommand( true );		// ← クロスフェード後に中身をちゃんとクリアしとく
		}
	);
}

/**
* シーンオブジェクトが出発地だった場合に、移動を開始した瞬間に送出されます。
* このイベント処理の実行中には、addCommand() メソッド、及び insertCommand() メソッドによるコマンドの同期処理が行えます。
*/
protected override function _onGoto():void {
	IndexScene.customCommands.addCommand(	// ← このページの処理を登録
		new DoTweener( page, { alpha:0, time:2 } ),
		new RemoveChild( progression.container, page )
	);

	// 実行したいコマンドを登録します。
	addCommand(
	);
}

シーンの _onGoto() では、コマンドの登録だけして、
実際の処理は、遷移先のシーンの _onInit(() で実行させるって行程です。
この処理を全部のシーンで実行させるようにしておけば、全部のページ遷移でクロスフェードになります。

COMMENT

POSTED

jam

2009/08/14 | 5:07 am

BulkLoader の中身

はどーなってんのか??

最初に細々したパーツを読み込むときに BulkLoader を使ってたのですが、
外部 SWF のライブラリに置いてあるファイルを使う場合は、LoaderContext Class に applicationDomain 設定しないと使えないのだけれど、BulkLoader で読み込んだ SWF ってこー言った場合どーなるんでしょうか??

ざらっとソースを見た感じ、見当たらなんだなぁ。。。
br.com.stimuli.loading.loadingtypes.URLItem っぽいけど、URLLoader が基本クラスみたいで、そんな記述は一切無しな感じで。
やっぱ素材置き場みたいなSWFを作る場合は、自分で書くしかなさそうな予感。

むむー

しかし、XMLの解析とデータ格納が毎回非常に疲れる。。。
でもサイト毎に微妙に違うから、毎度毎度、どーっと疲れさせられる。
これも何とかしたい。

どーでもいいお話、我が家の前は、緑があるので蝉がとってもうるさいのであります。
いつも寝るタイミングを逃すとこーなるのですね。
すいません、夏は早めに寝るようにします。

COMMENT

POSTED

jam

2009/07/27 | 11:11 am

Flex SDK on Leopard

Mac OS X Leopard で Flex SDK 使う方法。
Font ファイルを埋め込んだ AS ファイルをコンパイルする必要があったので、色々調べて試してみました。


参考させて頂いたサイト:
t100:Flex SDK を Mac OS X10.5 へインストール(前編)
Flex SDKをMacに導入 – Yasu Log

以下、簡単な手順です:
1.
Adobe Open Source で Flex SDK をダウンロード。
自分がダウンロードしたのは、「Latest Milestone Release Builds」ってとこの Build 3.3.0.4852 の Adobe Flex SDK。

2.
任意の場所にダウンロードしたファイルをインストール (ただ移動するだけですが。。。)
Xcode がインストールされていると、Macintosh HD 上に「Developer」というディレクトリがある (はず)。
今回は無かったので、自分で作りました。
っで、その中に Xcode インストール時と同じ階層をつくって、ダウンロードしたファイルを移動する。
「Macintosh HD/Developer/SDKs/flex_sdk_3/」という状況にしました。
ちなみに、上記の「Developer/SDKs/」は自分でこしらえた部分です。

3.
ターミナルでコンパイルするために flex_sdk_3 へのパスを設定しなきゃいけないっとのこと。
mi を使うと、不可視のファイルが編集できるので、mi の「不可視ファイルを開く」を選択して
「Macintosh HD/User/USER_NAME/」にある .bash_profile を開きます。
これもない場合は自分で作ってしまってOKです。
.bash_profile ファイルに flex_sdk_3/bin/ へのパスを記述します。

PATH=$PATH:/Developer/SDKs/flex_sdk_3/bin

上記を記述して保存したらインストールは完了です。

4.
あとは AS ファイルをターミナルから指定してコンパイルで SWF ファイル完成です。

package {

	import flash.display.Sprite;

	public class CLASS_NAME extends Sprite {

		[Embed(source='FONT_PATH', fontName='FONT_NAME', mimeType='application/x-font', unicodeRange='FONT_CODE')]
		public static var FONT_CLASS_NAME:Class;

	};

};

っといった AS ファイルをつくって、FONT_PATH で指定しているところに フォントデータを配置。
次にターミナルを起動して、

COMPUTER_NAME:~ jun$ cd ~/Desktop/PROJECT_NAME/FILE_DIRECTORY/
COMPUTER_NAME:FILE_DIRECTORY jun$ mxmlc CLASS_NAME.as

っと入力すると、あとは勝手にコンパイルしてくれます。

こーゆーのを試すと、アプリとかOS開発してる人はすごいなーっと再認識させられます。
普段は Flash IDE で作ってるのですが、あんなに簡単に出来るのも、こういった裏の作業(←っていうのか??)をさせないアプリを開発してくれたおかげです。
様様です。

COMMENT

CATEGORY

POSTED

jam

2009/06/24 | 13:27 pm

プリンターを起動する

flash.printing パッケージに PrintJob ってクラスがあるので、それを使えば簡単でした。

import flash.display.Sprite;
import flash.evetns.MouseEvent;
import flash.printing.PrintJob;
import flash.printing.PrintJobOptions;

public class PrintJobTest extends Sprite {

	private var pJob:PrintJob;
	private var pOption:PrintJobOptions;
	private var container:Sprite;

	public function PrintJobTest() {
		container = new Sprite();
		pJob = new PrintJob();
		pOption = new PrintJobOptions;
		pOption.printAsBitmap = true;	// デフォルトは false で、そのままだとベクター出力してくれる

		init();
	};

	private function init():void {
		container.graphics.beginFill( 0x000000 );
		container.graphics.drawRect( 0, 0, 120, 30 );
		container.endFill();

		stage.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler );
	};

	private function mouseDownHandler( e:MouseEvent ):void {
		pJob.start();

		try {
			pJob.addPage( container, null, options );
		} catch( e:Error ) {
			trace("プリンターに追加できませんでした。: " + e);
		}

		try {
			pJob.send();
		} catch( e:Error ) {
			trace ("プリント出来ませんでした。: " + e);
		}
	};

};

これで、120px x 30px の黒の四角がプリントアウトされます。

縦と横の向きを設定するときは、flash.printing.PrintJobOrientation; を使う。
あとは、プロパティの値とかを色々いじれば大丈夫(って信じてる)。

COMMENT

CATEGORY

POSTED

jam

2009/06/24 | 1:59 am

ZipされたJPEGを扱う(複数)

別件で忘れてましたが、とりあえず、暫定的な処理になりますが、
こんな感じで解凍を確認したので。。。

まず、ZipLoader はやめて、nochump.util.zip.*; を使用しました。
Unknown Quality の ll_koba_ll さんが、分かりやすく書かれていたのでそれを参考に。


ref Unknown Quality – ActionScript 3.0 でZIPの圧縮と解凍

↓ ZIP圧縮した「uploads」フォルダに画像が何枚か入ってる想定です。

package
{
	import flash.display.*;
	import flash.events.*;
	import flash.net.*;
	import flash.utils.ByteArray;

	import nochump.util.zip.*;

	public class MultiZipLoader extends Sprite
	{

		private var byteArray:ByteArray;
		private var loader:Loader;

		private var idx:int = 0;
		private var lg:Number = 0;
		private var bmpArray:Array = [];

		public function ZipLoaderMulti()
		{
			var uLoader:URLLoader = new URLLoader();
			uLoader.dataFormat = URLLoaderDataFormat.BINARY;
			uLoader.addEventListener( Event.COMPLETE, zipLoadComplete );
			uLoader.load( new URLRequest("uploads.zip") );
		}

		private function zipLoadComplete(e:Event):void
		{
			trace("zipファイルのロード完了");
			byteArray = e.target.data;
			var zip:ZipFile = new ZipFile( byteArray );

			for( var i:int = 0; i < zip.size; i++ ) {
				var entry:ZipEntry = zip.entries[i];
				var zipData:ByteArray = zip.getInput( entry );

				// 余計なものが入らないようにする
				if( zipData.length != 0 && zipData.bytesAvailable > 0) {
					lg++;

					loader = new Loader();
					loader.contentLoaderInfo.addEventListener( Event.COMPLETE, getBitmapData );
					loader.loadBytes( zipData );
				}
			}
		};

		private function getBitmapData( e:Event ):void
		{
			trace("BitmapData のロード完了");
			bmpArray[idx] = Bitmap( e.target.content );
			idx++;
			if( idx == lg ) display();
		};

		private function display():void
		{
			trace("表示します");
			for( var i:int = 0; i < bmpArray.length; i++ ) {
				var bmp:Bitmap = bmpArray[i] as Bitmap;
				bmp.y = i * 300;	// 300は適当です。

				addChild( bmp );
			}
		};

	};

};

MACユーザーの方は、右クリックで圧縮するとリソースフォークとかのアーカイブが含まれてしまうので、zip.size を trace() すると不可思議な数が出力されます。。。
なので、Clean Archiver とか使えば大丈夫です。

COMMENT

CATEGORY

POSTED

jam

2009/06/22 | 17:06 pm

ZipされたJPEGを扱う

Spark Project にコミットされてる tarotarorg さんの ZipLoader 使って zip ファイルをロードして、そのなかにある JPEG ファイルを表示するサンプル

↓ とりあえず、コミットされてるサンプルをそのまま改造したヤツです。
同階層に sample_image.jpg って画像を格納した uploads という zip されたフォルダがあるのが想定です。

/*
 *  Copyright 2008 tarotarorg
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	import flash.display.Sprite;
	import flash.events.IOErrorEvent;
	import flash.net.URLLoaderDataFormat;
	import flash.net.URLRequest;
	import flash.utils.ByteArray;
	import flash.events.Event;

	import org.tarotaro.flash.pv3d.ZipLoader;

	[SWF(width="640", height="480", backgroundColor="#ffffff")]
	/**
	 * ZipLoaderの使用例
	 * @see org.tarotro.flash.pv3d.ZipLoader
	 * @author 太郎
	 */
	public class ZipLoaderSample extends Sprite
	{

		private var byteArray:ByteArray;
		private var loader:Loader;
		private var bmpd:BitmapData;

		public function ZipLoaderSample()
		{
			var zipLoader:ZipLoader = new ZipLoader();
			zipLoader.addEventListener(Event.COMPLETE, zipLoadComplete);
			zipLoader.addEventListener(IOErrorEvent.IO_ERROR, function(e:IOErrorEvent):void {
				trace("IOエラー:", e);
			});
			zipLoader.dataFormat = URLLoaderDataFormat.BINARY;
			zipLoader.load(new URLRequest("uploads.zip://uploads/sample_image.jpg"));
		}

		private function zipLoadComplete(e:Event):void
		{
			trace("zipファイルのロード完了");
			byteArray = e.target.data;

			loader = new Loader();
			loader.contentLoaderInfo.addEventListener( Event.COMPLETE, getBitmapData );
			// ここで取得した ByteArray を loadBytes() にぶち込む
			loader.loadBytes( byteArray );
		};

		private function getBitmapData( e:Event ):void
		{
			trace("ByteArrayファイルのロード完了");
			bmpd = Bitmap( e.target.content ).bitmapData;
			addChild( new Bitmap( bmpd ) );
		}

	}

}

あぁ、なんてステキライブラリ!
でも、このままだと、画像の名前とかを自分で指定しないといけないので、要改造ですね。
papervision3d で使われてる nochump.utils.zip.*; とかを見てみたら分かりそうな気がしますです。

COMMENT

CATEGORY

POSTED

jam

2009/06/18 | 17:35 pm

bit shiftしたカラーをGraphicsで使う

ちょいメモ。

var sp:Sprite = new Sprite();
var color:uint = COLOR << 16 | COLOR << 8 | COLOR;

sp.graphics.beginFill( Number("0x" + color.toString(16)), 1 );
sp.graphics.drawRect( 0, 0, 10, 10 );
sp.graphics.endFill();

addChild( sp );

っと最初に uint 型で作成した変数 color を
"0x" と一緒に16進法に変換した color をストリングして結合して
最終的に Number 型でキャストする。

そうすると、とりあえずは大丈夫。
けど、無駄にややこい事してる気がしなくもない。。。

COMMENT

CATEGORY

POSTED

jam

2009/06/17 | 17:51 pm

xml and namespace

RSS 1.0 を読もうとしたらエラー出たス。

RSS 2.0 の仕様だと、<xml>で始まるのだけれども、
RSS 1.0 の仕様でいくと<rdf>で始まるのでちょいと勝手が違うようです。

なので、default xml namespace して rdf を認識(??)させてあげないとダメみたい。
注) ↓ は、BulkLoader 使って読み込んだあとです。

var feedData:XML = bulkLoader.getXML( "feed_data" );
var feedList:XMLList;
// RSS 1.0 のときと RSS 2.0 のときで分ける
if(feedData.name() == "http://www.w3.org/1999/02/22-rdf-syntax-ns#::RDF") {
	var ns:Namespace = new Namespace("http://purl.org/rss/1.0/");
	default xml namespace = ns;
	feedList = feedData.item;
} else {
	feedList = feedData.channel.item;
}

っで、これでも Runtime Error #1025 喰らったのでさらに調べると
どーやら、ローカル変数で default xml namespace させるとダメのようです。

private var ns:Namespace = new Namespace("http://purl.org/rss/1.0/");
private function onLoaded( e:Event ):void {
	var feedData:XML = bulkLoader.getXML( "feed_data" );
	var feedList:XMLList;
	// RSS 1.0 のときと RSS 2.0 のときで分ける
	if(feedData.name() == "http://www.w3.org/1999/02/22-rdf-syntax-ns#::RDF") {
		default xml namespace = ns;
		feedList = feedData.item;
	} else {
		feedList = feedData.channel.item;
	}
}

もしくは変数宣言しないでそのまま記述しても大丈夫

private function onLoaded( e:Event ):void {
	var feedData:XML = bulkLoader.getXML( "feed_data" );
	var feedList:XMLList;
	// RSS 1.0 のときと RSS 2.0 のときで分ける
	if(feedData.name() == "http://www.w3.org/1999/02/22-rdf-syntax-ns#::RDF") {
		default xml namespace = new Namespace("http://purl.org/rss/1.0/");
		feedList = feedData.item;
	} else {
		feedList = feedData.channel.item;
	}
}

COMMENT

CATEGORY

POSTED

jam

2009/05/26 | 14:35 pm

MovieMaterial of PV3D

今まで知らなかったことです。

MovieClip を Material にして、その MovieClip のタイムラインを動かすって動作。
とりあえず、PV3D にはデフォルトで MovieMaterial ってのがあるので、それを使うとすぐ出来ましたデス。

private function MovieMaterialExperiment():void {
	// flaファイルのライブラリからリンケージ名指定して頂く方法
	var linkageID:String = "LIBRARY_ITEM";
	var className:Class = getDefinitionByName( linkageID ) as Class;
	var mc:MovieClip = new className();

	// 第一引数に MovieClip を指定。
	// 第二引数を true にしないと MovieClip の透過部分が真っ黒になる。。。
	// 第三引数は true にしておかないとタイムラインのアニメーションが効かなくなる。
	var mm:MovieMaterial = new MovieMaterial( mc, true, true );
	mm.interactive = true;

	var plane:Plane = new Plane( mm );
	plane.addEventListener( InteractiveScene3DEvent.OBJECT_OVER, onObjectOver );
	plane.addEventListener( InteractiveScene3DEvent.OBJECT_OUT, onObjectOut );
	scene.addChild( plane );
};

private function onObjectOver( e:InteractiveScene3DEvent ):void {
	e.target.material.movie.gotoAndStop(2);
	// e.target で Plane にアクセス
	// e.target.material で MovieMaterial にアクセス
	// なもんで、e.target.material.movie で MovieClip にアクセスとなります。
};

private function onObjectOut( e:InteractiveScene3DEvent ):void {
	e.target.material.movie.gotoAndStop(1);
};

あと、最初に Viewport3D の
interactive = true;
containerSprite.buttonMode = true;
しないとマウスが pointer になりませぬ。

COMMENT

CATEGORY

POSTED

jam

2009/05/18 | 16:49 pm

Papervision3D の実験 02

こないだの円形配置を使ってやってみたかったヤツです。
あとはこれをより複雑に絡み合わせられたらなぁとか、文言の数に応じて半径変えられるようにしたいなぁとか思ってます。

個人的には、大きい方の円をちょっと隠しつつ斜めにするのがお好みであります。
ちなみに、MOUSE_DOWNで動きだして、MOUSE_UPで止まります。

Papervision3D の DisplayObject3D には、rotation ってプロパティがないので、最初どーしよーかと思ったけど、Public Methods に roll() なるものがあり、そいつに角度を入れたら実装できました。
scale = 0; にしたあとに roll() すると何も表示されなくなるのが謎でした。
scale のあとだと、roll() するもの無くなるのだろうか。。。

前回同様 ↓ ソースです。
誰かもっと気持ちいいのしてください。。。


TypoMotionCircle.zip

COMMENT

CATEGORY

POSTED

jam

2009/05/15 | 14:28 pm

円形配置したい

と思いついて書いてみたクラス。

最近、割と落ち着いて仕事出来ていて、こーゆー時間が取れてます。
広告業界もあぶないってニュースが飛び交ってるので、恐ろしやーですが。。。
明日は我が身にならないように頑張ろう、うん。

ソースを見て頂ければ分かるかと思うのですが、
for文でオブジェクトの総数とインデックス値に大しての 360 度の値を渡すと、Object型で x座標、y座標、角度を返してくれます。

package {

	import flash.display.Sprite;

	public class CircularPosition extends Sprite {

		private const OBJECT_NUM:Number = 36;
		private var container:Sprite;

		private var radius:Number = 200;

		public function CircularPosition() {
			container = new Sprite();

			for( var i:int=0; i<OBJECT_NUM; i++ ) {
				var sp:Sprite = new Sprite();
				sp.graphics.beginFill( 0xFFFFFF * Math.random() );
				sp.graphics.drawRect( 0, 0, 10, 10 );
				sp.graphics.endFill();

				var obj:Object = getCircularPosition( (i + 1) * 360 / OBJECT_NUM );
				sp.x = obj.x;
				sp.y = obj.y;
				sp.rotation = obj.rot;

				container.addChild( sp );
			}

			container.x = stage.stageWidth / 2;
			container.y = stage.stageHeight / 2;
			addChild( container );
		};

		private function getCircularPosition( rot:Number ):Object {
			var obj:Object = {};
			var rad:Number = rot * Math.PI / 180;

			obj.x = Math.sin(rad) * radius;
			obj.y = Math.cos(rad) * radius;
			obj.rot = -rot;

			return obj;
		};

	};

};

これで、もう一個妄想してたのが実装できそうス。

COMMENT

CATEGORY

POSTED

jam

2009/05/12 | 21:07 pm

Papervision3D の実験

クライアント確認中の待ち時間にこしらえたブツ。
なんかこーゆーのが作ってみたいって思ってたので、せこせこ作ってみました。

ちなみに、背景は画像です。
↓ ソースです。
コンパイルにCS3が必要になりますので、あしからずデス。


TypoMotion.zip

COMMENT

CATEGORY

POSTED

jam

2009/04/28 | 7:14 am

IE6 での FLV 再生

普通の HTML サイトを構築中に「再生と一時停止」くらいの機能だけを持ったビデオプレイヤーを作成してとき、IE6でのみ再生されませんっとの謎仕様に遭遇しました。

っで、swfObjcet.js の宣言時に so.addParams(”allowScriptAccess”, “sameDomain”); を追加したら問題なく再生されました。
その他のモダンブラウザっと言われてるので問題なかったのですが、困ったちゃんです。
よくわからんのですが、IE6だけ外部ファイルのアクセスへのアプローチ(って言うのか??)的なのが違うのかな??

あと、ちょこちょこ Flash で作ったパーツを使う場合、swfObject.js の so.addParams(”wmode”, “transparent”); を追加しないと CSS の z-index が無視される。(←多分Windows環境下で)

今更感がありますが、フルフラッシュサイトばかり作ってたのでは気付かない事色々知りました。
どーもです。

COMMENT

CATEGORY

POSTED

jam

2009/04/08 | 18:24 pm

お初Papervision3D

昨日、一昨日ってホントに今更ながら Papervision3D をさわり始めたのでちょっとサンプルを作成しました。(Away 3D はちょいと前にいじった事があるのですが。。。)

よくありそうな感じでPlaneを2枚重ねて、
パタパタするってだけのヤツです。

ちなみに両面に BitmapAssetMaterial を使ってるので、
ライブラリに画像を2枚、同じサイズで入れて下さい。
じゃないと、動かないス。

今日思いついて、設計10分&制作2時間の簡易的なお手製クラスなので、
条件分岐とかはかなり軟弱な作りになっていますので、悪しからず。。。。
あと、click時の連打に対応出来てませんです。

- DocumentClass -

package {

	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.display.StageAlign;
	import flash.display.StageQuality;
	import flash.display.StageScaleMode;

	public class PlaneRotationDocument extends Sprite {

		private var pr3d:PlaneRotation3D;

		public function PlaneRotationDocument() {
			stage.quality	= StageQuality.MEDIUM;
			stage.scaleMode	= StageScaleMode.NO_SCALE;
			stage.align		= StageAlign.TOP_LEFT;

			init();
		};

		private function init():void {
			pr3d = new PlaneRotation3D( "FrontImage", "BackImage", stage.stageWidth, stage.stageHeight );

			pr3d.initialize();
			addChild( pr3d );
		};

	};

};

して、このクラスを同階層に置いておけば動きますヨ。

pr3d = new PlaneRotation3D( “FrontImage”, “BackImage”, stage.stageWidth, stage.stageHeight );
の第3引数と、第4引数は画像の幅のにしたほうがいいっぽいです。
この場合は、「FrontImage」ってリンケージ指定した画像データと、同じサイズの「BackImage」というリンケージ指定している画像データがライブラリにある感じです。

さわり初めて分かったのですが、こーいったライブラリ作ってる人は、すげーでありますね。
クラス構造見てるだけで、勉強になります。
あざすー


PlaneRotation3D.as


追記:09.04.09 – 14:27

time 使用時にバグ発見したので修正しますたです。
click 使用時にマウスを指カーソルに変更したい場合の追加をしましたです。

/**
 * control mouse visual
 * useHandlCursor
 *
 * @param	flg		Boolean
 */
public var handCursor:Boolean = false;
public function set setHandCursor( flg:Boolean ):void {
	handCursor = flg;

	viewport.interactive = handCursor;
	viewport.containerSprite.buttonMode = handCursor;
};

ってのが追記されてますので、使う時は、

pr3d.initialize();
pr3d.setHandCursor( true );
addChild( pr3d );

とかって感じでおねがいしますです。


PlaneRotation3D.as version 02

CATEGORY

POSTED

jam

2009/03/29 | 6:32 am

ライブラリから複数のリンケージを参照する

さわやかな晴れの日曜日なので、走り書きメモ。

ライブラリにMovieClipとかで、
MC_Image01、MC_Image02、MC_Image03、MC_Image04
とかって名前付けて、クラスで参照すること多いと思います。

そーゆーときに今まではindex値で連番作んないで、イメージの内容に応じたユニークネームで switch文使って参照してましたが、さすがに何十枚っともなると500鼻毛くらい痛々しいので、連番参照に切り替えました。

(assume there are much images in your library named “MC_image*”)


import flash.utils.getDefinitionByName;	// これしないと動きません

public function RefTest():void {
	init();
};

private function init():void {
	var container:Sprite = new Sprite();
	for(var i:int=0; i<IMAGE_NUM; i++) {
		var linkageName:String = "MC_image"+i;
		var className:Class = getDefinistionByName( linkageName ) as Class;
		var image:MovieClip = new className();

		image.x = i * image.width;
		container.addChild( image );
	}
	addChild( container );
};

っと、ストリング型でリンケージの名前の指定して、クラス型で参照を格納。
それを、MovieClipで頂くと使えます。

さぁ、天気も良いし、疲れたから自転車の洗車でもしようかーねー

COMMENT

CATEGORY

POSTED

jam

2009/03/24 | 18:53 pm

フォントがどっかにふっとんだ。

TextField.embedFonts = true;
にするとテキストが吹っ飛ぶ。

なにーも表示されません。

TextFormat.font = FONT_DATA.fontName; を指定しても、
TextFormat.font = “フォントお名前” を指定しても全然ダメ。

完全に嫌われてますな。どーしましょー
前の案件とほぼ同じやり方にもかかわらず、今回は全く検討つきませぬ。。。
なして?

とりあえず、あらゆるくだらない事も試してみようと思います。


追記:09.03.24 – 21:51
何しても出来ないので、ファイル自体がおかしいんじゃないかと思って、FLAファイルのライブラリ調べてたら、更におかしな挙動に。。。
複数で制作してるから、クラス名が被ってんじゃないかと思って、複製したFLAファイルのライブラリのインスタンスを少しずつ削除してったら急に表示されやがったのであります。

意味が分からず、目が点です。
ちなみに、外部SWFに埋め込んだフォントを読み込まずに、ライブラリに置いとけば、いつでもどこでもちゃんと読み込みます。

うがー

COMMENT

CATEGORY

POSTED

jam

2009/02/12 | 16:59 pm

Error 2044&1069 with flv

AS3 にて flv ビデオのメタデータ取るときに出たエラー。

Error #2044: ハンドルされていない AsyncErrorEvent : text=Error #2095: flash.net.NetStream はコールバック onXMPData を呼び出すことができませんでした。 error=ReferenceError: Error #1069: .CustomClient にプロパティ onXMPData が見つからず、デフォルト値もありません。

初めて見た名前ばかり。
どーも、よろしくおねがいしますっ的なですね。

イベント作成して、そっから metaData の info を引数で渡す方法を取っていたのですが、
どーも Object() を渡す EventDispatcher の時にダメ出しされてるみたいです。

なので、そこに onXMPData(info:Object) って function 入れると何も言わなくなります。

private function playVideo():void {
	ns = new NetStream( nc );
	ns.bufferTime = 2;
	clientObj = new CustomClient();
	ns.client = clientObj;
	clientObj.addEventListener( NetStreamEvent.METADATA_RECEIVED, onMetaDataReceived );
	video.attachNetStream( ns );
	video.smoothing = true;
	ns.play( MOVIE_PATH );
};

private function onMetaDataReceived( e:NetStreamEvent ):void {
	// グローバル変数に代入
	metaData = e.info;
	// ビデオの時間計ったりして進行状況を見張る関数
	addEventListener( Event.ENTER_FRAME, countDuration );
};

// クラスを閉じた後
import flash.events.EventDispatcher;
import event.NetStreamEvent;

class CustomClient extends EventDispatcher {

	public function onMetaData( info:Object ):void{
		dispatchEvent( new NetStreamEvent( NetStreamEvent.METADATA_RECEIVED, info ) );
	}
	// これ入れるとエラーが消える。中身は無くてもOK
	public function onXMPData(info:Object):void {};

}

ちなみに、NetStreamEvent クラスはこんなんです。

package event {

	import flash.events.Event;

	public class NetStreamEvent extends Event {

		// カスタムイベント名
		public static const METADATA_RECEIVED:String = "metadata_received";

		public var info:Object;

		public function NetStreamEvent( type:String, info:Object ):void {
			super( type );
			this.info = info;
		};

		// イベントの複製
		public override function clone():Event {
			return new NetStreamEvent( type, info );
		};

		// イベント形式
		public override function toString():String {
			return formatToString( "MyEvent", "type", "bubbles", "cancelable", "eventPhase", "info" );
		};

	};

};

onXMPData() は、Flash Player 10 および、Adobe AIR 1.5 以降じゃないといじくれないらしいス。


AS3 キューポイントとメタデータの使用


追記 : 09.02.12 – 20:13

前に使った flv ファイルを使ったら、大丈夫だったので、多分 CS4 の FLV ENCODER 使うと出るっぽい。
(↑ 未確認。。。)

COMMENT

CATEGORY

POSTED

jam

2009/02/05 | 19:03 pm

開かないっぽい。

んーっと。
何かおかしい。
as3 から javascript 経由で window.open() すると safari でだけ出来ないっぽい??

んな訳ないよね。。。(って信じてる)
俺がどこかで凡ミスしてるだけ。。。(って信じてる)

くまった。
こんなんで2時間くらいハマってる。

うがー


追記 : 09.02.05 – 20:33

色々見てたら、Safari の環境設定のせいっぽい。
でも、初期設定で「ポップアップウィンドウを開かない」にチェックが入ってるって、どーなのでっしょー。

それでも懲りずに色んなサイト見てたら、チェック入ったままでもポップアップするサイトをいくつか発見。
再度、暗礁に乗り上げた気がした、午後八時半。
フツーに腹減ったね、うん。


追記 : 09.02.05 – 21:17

っで、さっきこんなリンクにたどり着いた訳なのです。

-
Opening External Links in new window from AS3
-

こちらの人は、AS 内でブラウザ判別してその結果によって、ExternalInterface() するか、もしくは、普通にnavigateToURL() するか決めるそうな。

ナールーホードー。
とりあえず、これを試してみます。

POSTED

jam

2009/02/05 | 0:02 am

wonderfl りました

遅ばせながら、wonderfl に投稿しました。
って言っても、Fork してみただけなんですが。。。

-
KaleidoscopeLogic
-

とりあえず、万華鏡的なのが作りたくて、やってみました。
基本的なロジックは BeInteractive の方が書いてらしたこの投稿を見ると、もー完全に理解できると思います。

ちなみに上記のやり方だと、Matrix() を rotate() で4カ所に配置しているのですが、今回は、あくまで万華鏡っぽいのがコンセプトなので、角度ではどーも見た目がおかしいぞ!ってので、その部分を scale() でネガティブの値を入れて反転させる方法にしました。

まだ、かなり改良の余地ありまくりの粗悪品です。
とりあえず、最初はこんな感じで。

後々、反射の角度とか数とかどーにかしていきたいデスネー。


追記 : 09.02.05 – 23:42

おわっ!
今、見てみたら、上から2番目になってる!?
まずいぞ、早く下がっておくれ〜!

皆さんが見て下さるのはとてもありがたい事ですが、完全に恥ずかしいぞー!!


追記 : 09.02.06 – 0:02

あ、また確認したら、サクッと消えてた。
ちょっと安心。
ふー

COMMENT

CATEGORY

POSTED

jam

2009/02/03 | 17:50 pm

FL 2.0

携帯用のサンプル作るんで Flash Lite 2.0 を使用。
で、久々に AS3 以外を書きました。
んでんで、全然忘れてて笑った。

普段、全然たいした事してないくせに、一丁前に忘れてる自分に一杯おごってやりたい。
「まぁ、頑張れや、お前は大事な事たまに忘れるからよっ」って。

とりあえず、
x軸とy軸は _(アンダースコア)要らない。
alpha値とかは、0〜1でなので、0〜100とか規格外になりました。

っとさ。

COMMENT

CATEGORY

POSTED

jam

2009/01/29 | 12:46 pm

FontLoader クラス

最近、フォントデータ読み込んでごにょごにょする事が多いなって感じてきたので、フォントデータを含む外部ファイルをロードしてそっからフォントのデータを頂戴するってのこしらえました。

使ってみて下さいまし。

FontLoader.as

使い方は
import した後に


public var fontData:Font;

public function FontLoaderSample() {
	init();
}

private function init():void {
	var fl:FontLoader = new FontLoader();
	fl.addEventListener( Event.COMPLETE, loadedFontData );
	fl.loadFont( "font.swf", "linkageName" );
};

private function loadedFontData( e:Event ):void {
	e.target.removeEventListener( Event.COMPLETE, loadedFontData );
	fontData = e.target.data;
};

loadFont() の引数には、「外部ファイルのパス」と「リンケージ指定したクラスの名前」を指定して下さい。
Event.COMPLETE が呼ばれた後に、target.data でフォントデータが取得できます。

時間のあるときに、複数のフォントデータを一括で読み込めるのも作ってみようかと思います。

COMMENT

CATEGORY

POSTED

jam

2009/01/21 | 0:16 am

MouseEvent の異変

TextField() を子オブジェクトとして持っている Sprite() に MouseEvent を設定すると色々おかしな現象が現れたので、メモ。

TextField() に埋め込みのフォントをして、それをボタン代わりに使う予定だったのですが、意図したように動きませんでした。
まず、マウスが指カーソルになってくれない。
これは、子オブジェクトである TextField() の mouseEnabled = false; にすると変化する。
なんでか不明。。。
しかも、TextField() の selectable を true だとカーソルが選択モードになっちゃいます。

あと、この状態で Sprite() に MouseEvent を登録すると、event.target で TextField() 取得します。
これはイベントの伝播のお話になるので、ActionScript 本読む方が僕のつたない説明より良いと思うので割愛します。。。
なので、イベント自体を切るか、event.currentTarget で取得します。

// Font データを読み込んだ後の処理
private function afterLoadedFont():void {
	var sp:Sprite = new Sprite();
	addChild( sp );

	var format:TextFormat = new TextFormat( font.fontName, 16, 0x000000 );
	var field:TextField = new TextField();
	field.defaultTextFormat = format;
	field.embedFonts = true;
	field.autoSize = "left";
	field.selectable = false;	// ← 選択モードにしない。
	field.mouseEnabled = false;	// ← これが重要ス。

	sp.addChild( field );
	sp.buttonMode = true;
	sp.addEventListener( MouseEvent.CLICK, onClickHandler );
};

private function onClickHandler( e:MouseEvent ):void {
	trace("target : " + e.target + " | current : " + e.currentTarget);
};

きっと、まだまだ自分の浅知恵では全く知らなんだー、な裏技みたいなのがわんさかあるのでしょう。
精進、精進。

COMMENT

CATEGORY

POSTED

jam

2009/01/10 | 13:49 pm

DisplacementMapFilterMode

DisplacementMapFilter() を使用した時のゆらゆらしたときの余白の処理をどーするかっというもの。

定数で設定されているモードは4つ
01. CLAMP – 元のエッジを固定するので、縁の部分からゆらゆらしてる部分までを引き延ばして表示する
02. COLOR – DisplacementMapFilter に設定してある color の値で塗る (alpha を 0 にしておくとゆらゆらしてる部分だけ表示される。下記参照)
03. IGNORE – ゆらゆらの下に元の画像が表示されたまま
04. WRAP – 余白を繰り返し処理でうめる。 Photoshop の Pattern Overlay みたいな感じかと

COLOR MODE を使うとき
(↓ は何処に何を指定するかの一例なので、そのままじゃ何も表示されませぬ。)

var bmd:BitmapData = new BitmapData( SAMPLE.width, SAMPLE.height)
var mappoint:Point = new Point( 0, 0 );
var cx:Number = 0;
var cy:Number = 0;
var sx:Number = 0;
var sy:Number = 0;
var filterMode:String = DisplacementMapFilterMode.COLOR;
var _col:Number = 0x000000;
var _alp:Number = 0.0;

bmd.perlinNoise();	// perlinNoise() を適用させる
var dpmFilter:DisplacementMapFilter = new DisplacementMapFilter( bmd,  mappoint, cx, cy, sx, sy, filterMode, _col, _alp );
TARGET.filters = [dpmFilter];

ちゃんと落ち着いたら、サンプル作ろうと思いますので、今は殴り書きでスイマセン。

-
AS3.0 コンポーネントリファレンスガイド
-

COMMENT

CATEGORY

POSTED

jam

2009/01/07 | 7:09 am

Flashvars

AS3 での Flashvars の簡単な使い方。

<HTML>

<script type="text/javascript">
	//<![CDATA[
	var so = new SWFObject("sample.swf", "sample", "550", "400", "9.0.45.0", "#FFFFFF");
	so.addParam("quality", "high");
	so.addParam("loop", "false");
	so.addParam("menu", "false");
	so.addParam("scale", "noscale");
	so.addVariable("variable", "7:09");	// 受け渡したいデータ
	so.write("FlashContent");
	//]]>
</script>

<ActionScript>

public class FlashVarsSample extends Sprite {

	private var minute:Number;
	private var hour:Number;
	private var vars:String;

	public function FlashVarsSample():void {

		var flashvars:Object = root.loaderInfo.parameters;
		vars = flashvars['variable'];	// so.addVariable("variable", "7:09"); の第一引数と同じ名前
		var values:Array = vars.split(":");
		hour = Number(values[0]);
		minute = Number(values[1]);

		var tf:TextField = new TextField();
		addChild( tf );
		tf.text = "CURRENT TIME | " + hour + " : " + minute;

	};
};

var flashvars:Object = DOCUMENT_CLASS.root.loaderInfo.parameters;
で取得できるということらしいですよっ!

いっぱいある場合も
so.addVariable(”variable1″, “7:05″);
so.addVariable(”variable2″, “うがー”);
so.addVariable(”variable3″, “ごにょごにょ”);

vars1 = flashvars:Object['variable1'];
vars2 = flashvars:Object['variable2'];
vars3 = flashvars:Object['variable3'];
とかで増やしていけば大丈夫

CATEGORY

POSTED

jam

2009/01/06 | 11:42 am

Font の埋め込み AS3

自分の環境は Flash CS3 で全部やっているので、
Flex などで使われる mxml に記述するとか、[Embed()] するとか出来ない(っぽい)のであります。

なので、Kayac さんで紹介されてるこちらがバッチリでした!

一応、今回試したソース ↓

// Document Class of main.fla
package {

	import flash.display.Loader;
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.net.URLRequest;
	import flash.system.LoaderContext;
	import flash.system.ApplicationDomain;
	import flash.text.Font;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
	import flash.utils.getDefinitionByName;

	public class EmbedTest extends Sprite {

		/*======================================================================*//**
		 * Properties
		 */
		public static var _tf:TextField;	// ほかのクラスで使う場合があるので static にしてます

		private var path:String = "xml/data.xml";

		/*======================================================================*//**
		 * Constructor
		 */
		public function EmbedTest():void {

			init();

		};

		/*======================================================================*//**
		 * Functions
		 */
		public function init():void {

			var req:URLRequest = new URLRequest( "font.swf" );
			var loader:Loader = new Loader();
			var context:LoaderContext = new LoaderContext();

			context.applicationDomain = ApplicationDomain.currentDomain;
			loader.contentLoaderInfo.addEventListener( Event.COMPLETE, onLoadComplete );
			loader.load( req, context );

		};

		public function onLoadComplete( e:Event ):void {

			// 埋め込みフォントの設定
			var EMBFont:Class = ApplicationDomain.currentDomain.getDefinition( "EMBFont" ) as Class;
			Font.registerFont( EMBFont );	// この時点でライブラリに置いてあるの同じ状態になる
			var ft:Font = new EMBFont();

			// TextField の設定
			_tf = addChild( new TextField () as DisplayObject ) as TextField;
			_tf.defaultTextFormat = new TextFormat( ft.fontName, 32 );

			_tf.embedFonts = true;
			_tf.multiline = false;
			_tf.textColor = 0x121212;
			_tf.wordWrap = false;
			_tf.autoSize = "left";

			// 表示用の処理
			_tf.text = "Embed Font Test " + "だぴょん";

		};

	};

};

Kayac さんのところでも紹介されていますが、

var EMBFont:Class = ApplicationDomain.currentDomain.getDefinition( "EMBFont" ) as Class;

この( “EMBFont” )は

var req:URLRequest = new URLRequest( "font.swf" );

の font.swf 内の新規 Font で登録してある名前と同じにしないとダメ。
じゃなくて、リンケージした Class の名前と一緒ね。間違えマスター。

_tf.text = "Embed Font Test " + "だぴょん";

これは、英語しか含まれていない Font を埋め込むと、後ろの悪ふざけは表示されません。

COMMENT

CATEGORY

POSTED

jam

2008/12/30 | 21:08 pm

Flasher Magezine 01

The Flash Blog の Lee Brimelow氏が手掛けた映像の第一弾。
最初のイントロがヤバい。www

-
Flasher Magazine
-

COMMENT

CATEGORY

POSTED

jam

2008/12/21 | 9:23 am

フォントの埋め込みと名前

テキストフィールドを生成してフォントを外部から読み込んで埋め込むだけの事で、5時間くらいハマりました。

どこの Developer さんのブログ見て、どんな手使ってもダメ。

なんでやねんっと。

原因は予想してないトコでした。
いつ、どこで間違えたのか、家のパソコンに Helvetica がいっぱい入っていて、
最初は “Helvetica 75 Bold” で指定していたのですが、
それを “75 Helvetica Bold” に変更したら表示されました。

そんなことーーーー!!?

500ml のコーラを一気飲みして
鼻から出したい気分になりました。

あー、いい天気ー
すがすがしーわー

COMMENT

CATEGORY

POSTED

jam

2008/12/16 | 1:56 am

引数を配列にする

今まで知らなかった超絶便利機能。
コンストラクタの引数を配列にしてくれるやり方。

配列にしたい引数の名前の前に “…” 付けて配列にしたい名前入力するだけ。
悪ふざけ?っかと思うくらい簡単ッス。

例えばこんな感じ
(MovieClip を5個引数であると仮定)

public function exampleConstructor( ...mcs:Array ):void {
	var list:Array = mcs;
	// 配列 list に MovieClip が5個入ります。
};

試しに trace() すると
[object MovieClip],[object MovieClip],[object MovieClip],[object MovieClip],[object MovieClip]
って連呼します。

COMMENT

CATEGORY

POSTED

jam

2008/12/10 | 10:53 am

25-Line AS Contest

11月と12月に応募していた Finalists が発表されていますねー。

何なんですか、この天才(変態)たちは!?
どれも凄すぎだって。

自分は「Entry 025」の花火と、「Entry 43」のアスキーアートの人が好き。

-
from The 25-Line ActionScript Contest November/December Finalists
-

COMMENT

POSTED

jam

2008/12/03 | 20:15 pm

深度の一番上にする

ちょいメモ。
本日2個目。

すでに addChild() されているものを、
再度 addChild() すると深度が一番上になるらしい。

trace("number of children : " + numChildren);

とかで、確認してみたらずっと数が変わらないので、
大丈夫のようです。

setChildIndex( TARGET, (numChildren - 1) );

↑ これとやってることは一緒。。。

COMMENT

CATEGORY

POSTED

jam

2008/12/03 | 18:01 pm

偶数・奇数の振り分け

ちょいメモ。

配列とか for文の中とかで、偶数と奇数で処理を分けたいときに使用すると良いやつです。
とりあえず、下の例は奇数の場合に true を返すメソッド。

public static function checkNumberStatement( val:int ):Boolean {
	if( (val % 2) == 1 ) {
		return true;   // 奇数でした
	} else {
		return false;   // 偶数ですねー
	}
};

引数の val に配列や for分の i を入れれば大丈夫。

COMMENT

CATEGORY

POSTED

jam

2008/11/27 | 19:40 pm

loadChild() で外部swf をロード

するときの場合です。

基本的には AS3 の Loader() の処理と一緒っぽいです。
多分です。

例えば、子シーンで外部swf をロードする場合 : SceneObject を extends したモノ

private var sp:Sprite;
private var com:LoadChild;
private var isLoading:Boolean = false;
private var childMovieClip:MovieClip;

public function ChildScene( name:String = null, initObject:Object = null ) {
 	super( name, initObject );

	// シーン名 | タイトルの設定
	name = "childscene";
	title = "HERE IS CHILD SCENE";
}

protected override function _onLoad():void {
	// 実行したいコマンドを登録します。
	sp = new Sprite();

	var req:URLRequest = new URLRequest( "contents/swf/child.swf" );
	com = new LoadChild( sp, req );

	com.loader.onCastLoadStart = function():void {
		isLoading = true;
		this.addCommand(
			// ローディングの開始アニメーションとか
		)
	};
	com.loader.onCastLoadComplete = function():void {
		isLoading = false;
		childMovieClip = this.content;	// これで、子swf にアクセスさせて、その function を読んだり出来るようにしておきます。
		this.addCommand(
			new AddChild( progression.container, sp ),
			// ローディングの終了アニメーションとか
		);
	};
	com.addEventListener( ProgressEvent.PROGRESS, onProgress );
	// com.loader.contentLoaderInfo.addEventListener でも一緒です。
	com.execute();
}

private function onProgress( e:ProgressEvent ):void {
	var loaded:Number = com.loader.contentLoaderInfo.bytesLoaded;
	var total:Number = com.loader.contentLoaderInfo.bytesTotal;
	var percent:Number = (loaded / total);
	trace( "loading = " + percent );	// ローディング状況を trace() する
};

あとは、 childMovieClip に命令するとか、child.swf のタイムラインにアニメーション作っておくとかで
大丈夫ではないでしょうか。
もっといい方法がある気がしてならない。

そして、殴り書きのメモみたいに簡単でスイマセン。
落ち着いたら、ちゃんと。。。出来たらいいな。。。

COMMENT

POSTED

jam

2008/11/26 | 18:31 pm

初 progression サイト

が昨日公開されました。

トンでもスケジュールな案件だったので、
一球入魂するには progression しかないと思い、
思い切って使用させて頂きました。

遷移の複雑な部分を任せられる上に、各ページやその他の部分を作り込む時間がないなーっと思ってましたが、意外とあったりして、ホントに作業が楽になりました。
progression のホームページのキャッチコピーそのままです。

遥か昔の偉い人が、「神は死んだ」って言ってますが、ここに居ました。
ありがとうございました。

お惣菜屋さんのウェブサイトで、どれもこれも美味しそうなのばかりで、夜中の作業が泣きそうでした。

-
RF1 – X’mas Special Site

Client : Rock Field Co., Ltd.
Agency : amana inc.
Design : Rock Field Co., Ltd.
Flash Develop : Akari, Inc.
-

CATEGORY

POSTED

jam

2008/11/25 | 14:17 pm

cuddle or next

Grant Skinner 氏のブログで多分一生まとまらない話題が取り上げれられています。

-
Curly Braces: To Cuddle or Not?
-

プログラムを書く時に改行してインデントするか、同じ行に書くかって話。
コメント欄で、みなさんかなり熱く語ってらっしゃいますね。

自分は Cuddle派なのですが、これって完全に個人の趣味に依存するので、まとまらんと思います。
っていうか、本人も「my golden rule of programming is “there are no right answers, but there a lot of wrong answers”.」って言ってるし。

あとは、一番最初に見た、サンプルや書籍次第じゃないかなーっと。

ちなみに、「{} (brace)」の事を日本語で「波括弧」って言うのを初めて知りました。
by wikipedia

COMMENT

CATEGORY

POSTED

jam

2008/11/21 | 15:01 pm

progression で作るページ

こちらで公開されている taka:niumさんのサンプルを見てて気づいたので、ちょいメモ。

jp.progression.casts.animation.InOutMovie.as を extends するとタイムラインに作ったアニメーションを CastEvent.CAST_ADDED のタイミングで再生してくれる。
ラベル処理で再生するので、タイムラインベースみたいに作れるみたいデス。

クラス自体に
private var _inStateFrames:Array = [ "in", "stop" ];
private var _outStateFrames:Array = [ "stop", "out" ];
とあり、その下の _castAdded() での処理をみると
配列の frames[0] に移動して、 frames[i] に向かって New DoTweener() をしてるから

表示するときは、
ラベル「in」から再生、そして「stop」に来ると停止
消すときは、
ラベル「stop」から再生、そして「out」で停止

なるほど、これはラクだ!!
自分で gotoAndPlay() とか書かないで、ラベルの位置で制御できるなんて、ステキ過ぎる。


追記 : 08.11.21 – 18:05

ダウンロードできるサンプルだと書かれていないのだけれども、
InOutMovie は CastMovieClip を拡張したものなので、
protected override function _onCastAdded() と、
protected override function _onCastRemoved() が使用できます。
これの addCommand() でガシガシ処理しちゃえるのね。

POSTED

jam

2008/11/17 | 20:59 pm

compiler errors で url エラーが…

完全に自分の凡ミスなのですが、
xml にサムネイルの画像パスを記述してて、
それを子シーンにて、こんな感じで読み込みます。

var xml:XMLList = new XMLList(this.sceneInfo.data);
var obj:Object = XMLUtil.xmlToObject( xml );
path = obj.imageurl;

その後、それを使って URLRequest しようとしたときでした。

var req:URLRequest = new URLRequest( path );

んが、何も表示されないであります。
深度の問題かなっと思ったけれども、レイアウトに必要なものは
ほとんど new AddChildAt() で指定しているので、それはないなっと。

っで、色々 trace() を加えていたら、発見。
実ディレクトリでは「contents/images/thumbnail/***.jpg」となっているのですが、
xml には手違い(← 言い訳)で「contents/image/thumbnail/***.jpg」と記述してました・・・。

普通なら、
「Error #2044: ハンドルされていない ioError : text=Error #2035: URL が見つかりません。」
が Output で表示されるので、全然気づきませんでした。

お恥ずかしい限りです。。。

COMMENT

POSTED

jam

2008/11/12 | 20:37 pm

ルートシーンの Property を参照する

ときは、「IndexScene(root).PROPERTY_NAME」の様に書けば良いそうです。

なので、こんな感じになるっということですかね。

// example code : assume TEMP as root property
var slist:SerialList = new SerialList()
slist.addCommand(
	new Trace("TEMP : " + IndexScene(root).TEMP)
)
// output - TEMP : [CLASS_NAME id="TEMP" name="instance**" group="null"]

今のとこの謎:
1. 下階層の extends CastSprite したモノから progression が参照できない。
extends SceneObject だと出来る。なんで??

解消しました。コードは ↓

2. _onLoad() と _onInit() の違いをいまいち把握してない。
これは後に大問題になりそうな予感。。。
3. 子シーンから親シーンに戻って来たときはどーなるの?
サンプルだと行きっぱなしですね、これどーにかしないと。
4. そもそも僕のやり方は合ってるのだろうか??
きっと人それぞれ最終的なカタチも仕様も違うから何とも言えないけど、何かもっと有り難いやり方がある気がしてならない今日この頃。

しかし、急な案件のおかげ様でじっくりやる時間が無いデス。
むー、困っーたー


追記 : 08.11.13 – 2:43 am

謎その1の解消コード
注:かなりの力技です。もっと良い方法がありそうなので、あんまり参考にしない方がよいかも…

まずは、IndexScene.as の CastSprite を宣言する時に引数を追加する


var temp:CastSprite = new CastSprite({prog:progression});

そして、CastSprite.as に参照させるスクリプトを記述


private var indexObject:Object;

/*======================================================================*//**
 * コンストラクタ
 */
public function CastSprite( initObject:Object = null ) {
	super( initObject );
	// indexObject に initObject の参照をコピー
	indexObject = initObject;
	trace("args : " + indexObject.prog)
}

// output - args : [Progression id="Index" group="null" sync="true"]

これで、CastSprite 内でも「indexObject.prog」は「progression」と同様に機能します。
また何かいい方法を発見したら、追記します。

COMMENT

POSTED

jam

2008/11/11 | 20:57 pm

子シーンでの処理を追加

-
http://www.brooklyn.jp/progression/
-

が今や、只の検証用ページになりつつある。。。
一応、子シーンでの処理を追加しました。
といっても、画像が読み込まれるだけのなーんにもオモロくない感じです。

子シーンとして使っている ChildSceneObject.as がこんな風になりました。


public var bgContainer:CastSprite;

private var imgLoader:CastImageLoader;
private var scene:String;

public function ChildSceneObject( name:String = null, initObject:Object = null ) {
	super( name, initObject );
}

protected override function _onLoad():void {

	// 実行したいコマンドを登録します。
	var xml:XMLList = new XMLList(this.sceneInfo.data);
	// 現在いるシーンの名前を取得して登録
	scene = String(xml).toLowerCase();

	// 今は、背景の画像を読み込んだ後に CastSprite に AddChild しているので、それを参照
	bgContainer = new CastSprite();
	bgContainer = progression.container.getInstanceById("bgContainer") as CastSprite;

	imgLoader = new CastImageLoader();
	imgLoader.alpha = 0;
	imgLoader.addEventListener(CastEvent.CAST_LOAD_COMPLETE, loadComplete);

	// シーンの名前に該当する画像を読み込む
	addCommand(
		function():void { imgLoader.load(new URLRequest("contents/images/"+scene+".jpg")) }
	);
}

public function loadComplete( e:CastEvent ):void {

	imgLoader.removeEventListener(CastEvent.CAST_LOAD_COMPLETE, loadComplete);

	var slist:SerialList = new SerialList();
	slist.addCommand(
		new AddChild( bgContainer, imgLoader ),
		new DoTweener( imgLoader, {alpha:1, time:3, transition:"easeOutQuart"} )
	);
	slist.execute();

};

// 移動時に画像を消す
protected override function _onUnload():void {
	// 実行したいコマンドを登録します。
	addCommand (
		new DoTweener( imgLoader, {alpha:0, time:2, transition:"easeOutQuart"} ),
		new RemoveChild( bgContainer, imgLoader )
	);
}

画像を消すのは、現状は _onUnload() で処理しているけれど、 _onGoto() とどっちの方がいいのやら。
でも、これは子シーンで下階層に何も無い場合は、確実に _onUnload() の対象になるはずなので、
とりあえずは、これでいいかな。

そう言えば、前回の投稿で作ったボタンのままなのだけれど、なぜか遷移中に機能が kill されていない。。。。
おかしい、 progression のサンプルを初めて触ったときは自動で出来てたのに。
autoLock を false にした記憶はないので、どっかで間違ってる可能性大ですね。

POSTED

jam

2008/11/10 | 0:38 am

StageUtil の example がおかしい?

progression の ASDOC をざらーっと見ていたら気付いたこと。

ユーティリティクラスの StageUtils の中にある Public Method の getDocument() の使用例で下記のようになっているけど、これだと動かない気がする。

var documentRoot:Sprite = getDocument( stage );
trace( documentRoot.root == documentRoot ); // true

そもそも、ユーティリティ系のクラスは import による宣言のみで、コンストラクタを呼び出さない仕様になっているので、new 宣言が出来ないはず。
なので、使用するときは、その都度 StageUtil を頭に付けないといけないんじゃないかなーっと。

だから、多分こーすれば使えると思われまっす。

var documentRoot:Sprite = StageUtil.getDocument( stage );
trace( documentRoot.root == documentRoot ); // true

COMMENT

POSTED

jam

2008/11/07 | 22:05 pm

xml からシーンとボタンを作る その2

xml の 内に cls を指定すると、
その SceneObject が適用されるみたいです。

試しに、ChildSceneObject.as と言うのを作って、
「src/classes/project/layout/ChildSceneObject.as」
ってな感じで配置しておいて、前回の xml を下記に変更。

<?xml version="1.0" encoding="UTF-8" ?>

<prml version="2.0.0" type="text/prml">

	<scene name="about" cls="project.layout.ChildSceneObject">
		<caption>about</caption>
	</scene>

	<scene name="contact" cls="project.layout.ChildSceneObject">
		<caption>contact</caption>
	</scene>

</prml>

それから、
addSceneFromXML( new XML( this.latestData) );
を命令しているクラス(僕の場合は IndexScene.as )に
public var childScene:ChildSceneObject;
っと、こんな感じで宣言しておくと勝手に適用されてる!!
(childScene の部分は何でも良いみたいです。)

半端ねーであります。
触れば触るほど、凄さが分かります。
今まで自分の考えていたやり方が、いかに幼稚か思い知らされます。。。

COMMENT

POSTED

jam

2008/11/07 | 18:38 pm

xml からシーンとボタンを作る

「Is It So Easy」の northprint さんのこのエントリーを参考に作ってみます。

各ボタンは、xml を読み込んだ時にシーンと一緒に作成。
そして、その各ボタンは navi と言う名前の CastSprite に addChild します。
っで、navi を Event.RESIZE のイベントハンドラーで位置を操作する感じ。

private function setSiteNavigation():void {

	navi = new SiteNavigation();	// これは事前に public var などで定義しておく
	navi.id = "navi";

	var slist:SerialList = new SerialList();
	slist.addCommand(
		new AddChild( progression.container, navi ),
		function():void { setSiteMenu() }
	);
	slist.execute();

}

public function setSiteMenu():void {

	var slist:SerialList = new SerialList();
	slist.addCommand(
		new LoadURL( new URLRequest( "contents/xml/data.xml" ) ),
		function():void {
			addSceneFromXML( new XML( this.latestData ) );
			// xml から取得して生成されたシーンの内容を確認
			trace( toXMLString() );

			var plist:ParallelList = new ParallelList();

			for(var i:int=0; i<numScenes; i++) {
				var xlist:XMLList = new XMLList( scenes[i].sceneInfo.data );
				var obj:Object = XMLUtil.xmlToObject( xlist );
				var btn:MenuButton = new MenuButton();
				btn.setMenuName = obj.caption;
				btn.setSceneId = scenes[i].sceneId;
				btn.displayMenu();

				btn.x = (i + 1) * 50;
				btn.y = 10;

				// navi の中に addChild する
				plist.addCommand(
					new AddChild( navi, btn )
				)
			}

			// ParallelList を実行する
			this.parent.insertCommand(
				plist
			)
		}
	)
	slist.execute();

};

addSceneFromXML( new XML( this.latestData ) ); ってので、 this.latestData って書くと、
直前のデータを勝手に読み込んでくれるみたいです。
ステキ過ぎます、天才です。
numScenes も xml からシーンを読み込んだ段階で、生成されてるみたい。
addSceneFromXML() の直後に trace() とかで確認すると、xml で記述されてる の数と、あらピッタリ!

ちなみに、読み込んでいる data.xml の中身はこんな感じ

<?xml version="1.0" encoding="UTF-8" ?>

<prml version="2.0.0" type="text/prml">

	<scene name="about">
		<caption>about</caption>
	</scene>

	<scene name="contact">
		<caption>contact</caption>
	</scene>

</prml>

そして、各ボタンのクラスが ↓

public class MenuButton extends CastSprite {
	//public var _id:SceneId;
	public var _name:String;

	public var txt:TextField;

	/*======================================================================*//**
	 * コンストラクタ
	 */
	public function MenuButton( initObject:Object = null ) {
		super( initObject );

		txt = new TextField();
	}

	public function set setSceneId(id:SceneId):void { sceneId = id; }

	public function set setMenuName(name:String):void { _name = name; };

	public function displayMenu():void {

		txt.mouseEnabled = false;
		txt.text = _name;
		txt.setTextFormat( new TextFormat( null, 10 ) );
		addChild( txt );

	};

};

各メニュー用のボタンにアクションを追加するときは ↑ の
_onCastAdded() 内に記述するわけですね。


追記 : 08.11.07 – 20:21 pm

アホな事してた。
MenuButton.as の public var _id:SceneId; は全然要らない。。。。
ちゃんとボタンのシーンに登録するには、 sceneId に登録しなくちゃ意味無しなので、
public function set setSceneId(id:SceneId):void { _id = id; }; を
public function set setSceneId(id:SceneId):void { sceneId = id; }; に変更
アフォー過ぎて、鼻血でるかと思った。


追記 : 08.11.07 – 20:26 pm

あれ、何で MenuButton.as の元が CastSprite なんでしょー??
これって、もしかして CastButton なんじゃないのかな〜〜〜〜〜〜〜。
ちょっと書き換えたほうが良さげ。

COMMENT

POSTED

jam

2008/11/07 | 14:56 pm

progressionに自分のクラスを読み込む

ってトコまでやっとこさ来れました。

-
http://www.brooklyn.jp/progression/
-

画像出て来て、ロゴ出てくるだけですが。。。
ちなみに、画像は、夏に海行った時に「あ、トリだ!」って
一瞬でパッて撮ったヤツなので、何の意味もないです。

ちなみに、画像の読み込み処理を Index.as の _onInit() 内で処理していたら、
サーバに上げて、htmlで見た時にロゴの表示まで行かなかった。
ってことで、処理を丸ごと IndexScene.as 内の _onLoad() に移したらサクッと行けた。
むむー、なんぞや。。。

今のトコの IndexScene.as はこんな感じデス。


public var bgLoader:CastImageLoader;
public var logo:CastSpriteLogo;

public function IndexScene() {
}

protected override function _onLoad():void {
	// 実行したいコマンドを登録します。

	bgLoader = new CastImageLoader();
	bgLoader.id = "bgLoader";
	bgLoader.alpha = 0;
	bgLoader.ratio = true;

	bgLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, monitorLoading);
	bgLoader.addEventListener(CastEvent.CAST_LOAD_COMPLETE, function():void {
		progression.container.addChild(bgLoader);
		onCompleteLoad();
		bgLoader.removeEventListener(CastEvent.CAST_LOAD_COMPLETE, arguments.callee);
	});

	addCommand(
		function():void {
			bgLoader.load(new URLRequest("contents/images/sky.jpg"))
		}
	);
}

private function onCompleteLoad():void {
	bgLoader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, monitorLoading);

	logo = new CastSpriteLogo();
	logo.id = "logo";

	progression.container.stage.addEventListener( Event.RESIZE, onResizeHandler );
	resizeStageLayout();

	var slist:SerialList = new SerialList();
	slist.addCommand(
		new DoTweener( bgLoader, {alpha:1, time:3, transition:"easeOutQuart"} ),
		new AddChild( progression.container, logo )
	);
	slist.execute();
}

private function monitorLoading(e:ProgressEvent):void {

	trace("LOADING : " + Math.floor(e.bytesLoaded / e.bytesTotal * 100));

};

private function onResizeHandler(e:Event):void {

	resizeStageLayout();

};

private function resizeStageLayout():void {
	var sWidth:Number = progression.container.stage.stageWidth;
	var sHeight:Number = progression.container.stage.stageHeight;
	var ratio:Number = progression.container.width / progression.container.height;

	// 背景の設定
	bgLoader.width = sWidth;
	bgLoader.height = sWidth / ratio;

	if(bgLoader.height < sHeight) {
		bgLoader.height = sHeight;
		bgLoader.width = sHeight * ratio;
	}

	// ロゴの設定
	logo.x = 40;
	logo.y = (sHeight / 3);
};

っで、題名の自分のクラスを読み込んで処理している
CastSpriteLogo.as が ↓


import project.effect.DisplacementEffect;

// 大元は template にある MyCastSprite クラスです
public class CastSpriteLogo extends CastSprite {

	public var logo:SiteLogo;	// Library でこのクラス名にリンケージ指定してあるヤツ
	public var effect:DisplacementEffect;

	public function CastSpriteLogo( initObject:Object = null ) {
		super( initObject );

		logo = new SiteLogo();
		logo.alpha = 0;
		addChild( logo );

		effect = new DisplacementEffect( logo );
	}

	protected override function _onCastAdded():void {
		// 実行したいコマンドを登録します。
		effect.start();
		effect.addEventListener(DisplacementEffect.EFFECT, onReturnHandler);

		addCommand(
			// 任意のコマンドを記述してください。
		);
	}

	private function onReturnHandler(e:Event):void {

		effect.removeEventListener(DisplacementEffect.EFFECT, onReturnHandler);
		trace("====  onReturnHandler() called  ====");

	};

	protected override function _onCastRemoved():void {
		// 実行したいコマンドを登録します。
		addCommand(
			// 任意のコマンドを記述してください。
		);
	};

};

それから、グラグラしたエフェクト処理してるクラスが ↓

package project.effect {

	import flash.display.Sprite;
	import flash.display.MovieClip;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.filters.DisplacementMapFilter;
	import flash.events.Event;
	import flash.geom.Point;

	public class DisplacementEffect extends Sprite {

		public static const EFFECT:String = "";

		private var w:Number;
		private var h:Number;
		private var octaves:Number;
		private var offset:Array;
		private var speed:Array;
		private var rseed:Number;

		private var image:MovieClip;
		private var bmd:BitmapData;
		private var mappoint:Point;

		private var scalex:Number;
		private var scaley:Number;

		public function DisplacementEffect(target:MovieClip):void {

			initProperty(target);

		};

		private function initProperty(target:MovieClip):void {

			w = 800;
			h = 100;
			octaves = 1;
			offset = [];
			speed = [];
			rseed = Math.floor(Math.random() * 10000);

			image = target;
			bmd = new BitmapData(w, h, false, 0xFF000000);
			mappoint = new Point((image.width - w)/2, (image.height - h)/2);

			scalex = 80;
			scaley = 0;

			this.setNoiseAmount();

		};

		private function setNoiseAmount():void {

			for(var i:int=0; i= 1) scalex *= 0.965;

			bmd.perlinNoise(w/10, h/10, octaves, rseed, false, true, 1, true, offset);
			var dmf:DisplacementMapFilter = new DisplacementMapFilter(bmd, mappoint, 1, 1, scalex, scaley);
			image.filters = [dmf];

			if(image.alpha < 1) {
				image.alpha += 0.0095;
			} else {
				removeEventListener(Event.ENTER_FRAME, applyEffect);
				bmd.dispose();
				dispatchEvent(new Event(EFFECT));
			}

		};
	};
};

これは、ロゴのエフェクト専用にササッ作って使い回し出来るヤツじゃないので、
他で使う場合は、 property や処理の部分を色々いじって下さい。

---
追記 : 08.11.07 - 17:01

bgLoader.addEventListener(CastEvent.CAST_LOAD_COMPLETE, function():void {}) 内に
removeEventListener 処理を書いてなかったので、それを追記。
あぶなし、あぶなし。。。

POSTED

jam

2008/11/06 | 20:41 pm

progression 3

最近、色んなトコで話題な「Progression 3」を始めました。
(っというか、始めないといけない状況になったわけです)

ものすっごい著名なDeveloperさんのブログで色んなTipsが公開されているので、
とても参考になります。

とりあえず、
こちらの「+39」さんと、
こちらの「northprint」さん、
それから、こちらの「あつのすけ」さんは神様みたいな方です。

あとは、気になる単語をASDOCで調べれば、何とかなるかもしれないかもしれない。

ってことで、諸々を参考にしながら、手始めに背景画像を読込んで表示させるってヤツを
こしらえてみました。

protected override function _onInit():void {
	// stage の初期設定を行います。
	align = StageAlign.TOP_LEFT;
	quality = StageQuality.HIGH;
	scaleMode = StageScaleMode.NO_SCALE;

	// 開発者用の出力を有効化します。
	//Verbose.enabled = true;
	//Verbose.filteringCommand();

	// Progression インスタンスを作成します。
	prog = new Progression( "index", stage, IndexScene );

	// ブラウザ再生時に URL 同期を有効化します。
	prog.sync = false;

	var bgLoader:CastImageLoader = new CastImageLoader();
	bgLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, monitorLoading);
	bgLoader.addEventListener(CastEvent.CAST_LOAD_COMPLETE, function():void {
		prog.container.addChild(bgLoader);
		bgLoader.id = "bgLoader";
		bgLoader.alpha = 0;
		bgLoader.addCommand(
			new Trace("読込み完了です"),
			new DoTweener( bgLoader, {alpha:1, time:2} ),
			new Goto(prog.firstSceneId)
		)}
	)

	var slist:SerialList = new SerialList();
	slist.addCommand(
		function():void {
			bgLoader.load(new URLRequest("contents/images/background.jpg"))
		},
		new Trace("Load 開始します")
	);
	slist.execute();
}	

private function monitorLoading(e:ProgressEvent):void {
	trace("LOADING : " + Math.floor(e.bytesLoaded / e.bytesTotal * 100));
};

Index.as の _onInit 内では、「addCommand()」が使えないらしいので、
使用可能な「SerialList()」経由で命令すると良いらしいです。
bgLoader.id = “bgLoader”;ってしてるのは、IndexScene.asで参照するため。
ソースは ↓

protected override function _onLoad():void {
	// 実行したいコマンドを登録します。
	addCommand(

	);

	trace("container : " + progression.container);
	trace("loader : " + progression.container.getInstanceById("bgLoader"));
}

これで、背景を参照できるので、後でごにょごにょするときも大丈夫。
まだ未検証ですが、Index.as で読込みを完了しておいて、
IndexScene.as 内で他と一緒に表示とかも可能なのかな??

↑ 大丈夫でした。
まず、Index.as の new DoTweener( bgLoader, {alpha:1, time:2} ) の部分をコメントアウト。

それで IndexScene.as を下記に変更

protected override function _onLoad():void {
	// 実行したいコマンドを登録します。
	var bg:CastImageLoader = progression.container.getInstanceById("bgLoader") as CastImageLoader;
	addCommand(
		new DoTweener( bg, {alpha:1, time:2} )
	);
}


追記:08.11.07 – 21:40 pm

IndexScene.as 内の function を _onLoad() に変更。
_onInit() だと、下階層に行って戻って来たときも呼ばれてしまうので、
最初だけのときは _onLoad() を使った方がよい。

POSTED

jam

2008/10/24 | 16:56 pm

クラス間のカスタムイベント

クラス間でのイベントのやり取りをするとき、
AS2.0だと BroadcasterMX を使ってましたけど、
ざらっと見た感じ、AS3.0だとそれ、無さそう。。。

そもそも名前が ****MX だもんね、
そりゃーないよね。。。

っで、AS3.0だと dispatchEvent が一番わかりやすそうで、
しっくり来そうな感じデス。

あと、Document Class を Singleton で作るってのも暇があれば試してみたい。

-
ドキュメントクラスをSingletonとして扱う : blog.nium.jp
ステージの参照とシングルトン : SCRATCHBRAIN.BLOG
-

とりあえず dispatchEvent の簡単な使い方を。
(以下は今回のTOP変更で使ったものの抜粋です)

Index.as

package {
	import DisplacementEffect;

	public class Index {

		private var main:MovieClip;
		private var effect:DisplacementEffect;

		public function Index(main:MovieClip):void {
			this.main = main;
			effect = new DisplacementEffect();

			init();
		};

		private function init():void {
			effect.start();
			effect.addEventListener(DisplacementEffect.EFFECT, onReturnHandler);
		};

		private function onReturnHandler(e:Event):void {
			trace("Effect しゅーりょー");
		};

	};
};

DisplacementEffect.as

package {
	public class DisplacementEffect extends Sprite {

		public static const EFFECT:String = "****"; // ****は何でもOK

		public function DisplacementEffect():void {
			init();
		};

		private function init():void {
			// ここで Effect の初期化
		};

		public function start():void {
			// ここで Effect の動き
		};

		// 動きが終わったら呼ばれる function
		private function stop():void {
			dispatchEvent( new Event( EFFECT ) );
		};

	};
};

とすると、DisplacementEffect.as の stop() が呼ばれたすぐあとに、
trace(”Effect しゅーりょー”); が呼ばれます。

注意事項は、クラス間で EFFECT と名前付けたイベント名は全部共通にすること。
それと、このイベント名は任意だけど、頭文字は大文字じゃないとダメ。

ちゃんとコードまとめたら公開しよう。。。。

COMMENT

CATEGORY

POSTED

jam

2008/10/16 | 20:40 pm

MovieClipをキレイに並べる

時に使うヤツ。
これもよく忘れるからメモ。

まず下ごしらえ。

var sWidth:Number = stage.stageWidth;
var sHeight:Numer = stage.stageHeight;
var w:Number = MovieClip.width;	// ターゲットの幅
var h:Number = MovieClip.height;	// ターゲットの高さ
var index:Number;

var xlimit:Number = Math.ceil(sWidth / w);
var ylimit:Number = Math.ceil(sHeight / h);
var limit:Number = xlimit * ylimit;

左上から横に並べる場合:

for(var i:int=0; i<limit; i++) {
	var xPos:Number = w * (i % xlimit);
	var yPos:Number = h * int(i / xlimit);

	var mc:MovieClip = new MovieClip();
	mc.x = xPos;
	mc.y = yPos;
	addChild(mc);
}

左上から縦に並べる場合:

for(var i:int=0; i<limit; i++) {
	var xPos:Number = w * int(i / ylimit);
	var yPos:Number = h * (i % ylimit);

	var mc:MovieClip = new MovieClip();
	mc.x = xPos;
	mc.y = yPos;
	addChild(mc);
}

右上から縦に並べる場合:

for(var i:int=0; i<limit; i++) {
	var xPos:Number = (sWidth - w) - (w * int(i / ylimit));
	var yPos:Number = h * (i % ylimit);

	var mc:MovieClip = new MovieClip();
	mc.x = xPos;
	mc.y = yPos;
	addChild(mc);
}

右上から横に並べる場合は、上のコード入れ替えれば出来るはず。

サムネイル配置する時とかに一個一個にちょこっとmarginが欲しい場合は、
var w:Numberとvar h:Numberにそのちょこっとを足せばOK。(←未確認)

ちなみに、これ↑はステージ幅いっぱい使う場合です。
指定範囲がある場合は、
var sWidth:Numberとvar sHeight:Numberを変更すれば大丈夫。

COMMENT

CATEGORY

POSTED

jam

2008/10/11 | 19:33 pm

IE6でpre loaderがおかしい

AS3でタイムライン上でプリローダー作ると、
一番最初は動くのに、リロードとかすると止まる件。

どーやら、IE6(もしくはIE7も)だけおかしいらしい。
SafariとFirefoxは何度やってもちゃーんと動作をしてらっしゃいます。。。

FLASHサイトでブラウザ別の挙動が違うのは滅多に無く、3時間くらい悶々したのでメモ。

っで最終的に行き着いたのが外部ASファイルでどーにかするってコレ↓

package {

	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.ProgressEvent;
	import flash.text.TextField;

	public class PreLoader extends MovieClip {

		public function PreLoader() {

				// ローディングバーの長さを0にしておく
				loadBar.scaleX = 0;
				addEventListener(Event.ENTER_FRAME, LoadProgress);

		};

		private function LoadProgress(e:Event):void {

				var loaded:Number = stage.loaderInfo.bytesLoaded;
				var total:Number = stage.loaderInfo.bytesTotal;
				var percent:Number = Math.floor(loaded / total * 100);

				this.updateLoadingText(percent);

				if(loaded >= total) {
					removeEventListener(Event.ENTER_FRAME, onProgress);
					// コンテンツが開始されるフレームを指定
					MovieClip(stage.getChildAt(0)).gotoAndStop(2);
				}

		};

		private function updateLoadingText(percent:Number):void {

				// ローディングバーの進み具合
				loadBar.scaleX = percent / 100;
				// ローディングのテキストボックスにStringにキャストしたパーセントを表示
				loadTxt.text = String(percent);

		};

	};

};

ローディングバーとテキストボックスを内包するMovieClipのリンケージの
クラスに指定して、1フレームに置いておけば使えますよ。

ソースはこちら
PreLoader.as

COMMENT

CATEGORY

POSTED

jam

2008/10/09 | 21:18 pm

重複しないindex値を取得する

先月公開した「bluestone」のときに、指定範囲の数字の中から重複しないようにランダムで、しかも自動でindex値を取得し続けんのはどーすんの??

ってので考えたスクリプト。
超文系脳みそで作られた粗品。
晒しますので、だれか改良して下さい。
ちなみにこれはAS2.0ですが、スクリプト見た感じAS3.0でも使える。

はず。

/**
 * 指定範囲内(0〜length)から重複しないランダムのindex値を取得する
 *
 * @param	index		Number		現在のindex
 * @param	range		Number		指定範囲のlength
 * @return	val		Number		ランダムで取得したindex
 */
public static function getRandomIndex(index:Number, range:Number):Number {

	var arr:Array = [];
	for(var i:Number=0; i<range; i++) {
		var n:Number = i;
		arr.push(n);
	}
	arr.splice(index, 1);

	var num:Number = Math.floor(Math.random() * arr.length);
	var val:Number = arr[num];

	return val;

};

使い方はこんな感じ

import jp.brooklyn.util.MathUtils;

var index:Number;
var photoList:Array = [];	// 写真のURLを格納する
var prevMovieClip:MovieClip;
var nextMovieClip:MovieClip;

function init():Void {

	index = 0;
	this.loadPhotoImage();

}

function loadPhotoImage():Void {

	var limit:Number = photoList.length
	index = MathUtils.getRandomIndex(index, limit);
	var path:String = photoList[index];

	// 中略 : それからロードの処理を書く

}

で「bluestone」の背景処理してます。

ソースはこちら
MathUtils.as
使うときは、適当にクラスパスとかの名前変えちゃって下さい。

COMMENT

CATEGORY

POSTED

jam

2008/10/09 | 15:23 pm

AS3で参照が・・・

まじめにAS3に取り組み始めました。
っで、案の定つまずきまくりです。

参照とかが、AS2の時のとちょっと違うみたい。

var container:Sprite = new Sprite();
var imgLoader:Loader = new Loader();

imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteLoad);
imgLoader.load(new URLRequest("imgs/img01.jpg"));

function onCompleteLoad(event:Event):void {
	var loadedImage:Bitmap = Bitmap(imgLoader.content);
	var bmp:BitmapData = new BitmapData(loadedImage.width, loadedImage.height, false, 0xFFFFFFFF);
	bmp.draw(loadedImage, new Matrix());

	var image:Bitmap = new Bitmap(bmp);

	container.addChild(image);

	this.checkChildStatement(image);
}

ここまでは見た感じ普通。
っで、その後に

function checkChildStatement(image:Bitmap):void {
	trace("image = " + image);	// trace : image = [object Bitmap]
	trace("image = " + image.name);	// trace : image = instance5
}

なに、instance5って!?
AS2だと、一個目のtraceは「_level0.container.****」っとかになるはず。
どゆこと??

どーやら、var image:Bitmapの時に名前を付ける事が必要らしい。

var image:Bitmap = new Bitmap(bmp);
image.name = "image_bmp";

そーすると

function checkChildStatement(image:Bitmap):void {
	trace("image = " + image);	// trace : image = [object Bitmap]
	trace("image = " + image.name);	// trace : image = image_bmp
	var temp:DisplayObject = container.getChildByName("image_bmp");
	// もしくは var temp:DisplayObject = container.getChildAt(0)でも大丈夫
	trace("image = " + temp.name);	// trace : image = image_bmp
}

あとは、tempに対して何らかの処理をすれば良いとな。

これは、絶対忘れそうなので慣れるまでメモ。

ちなみに、tempの型指定が今回は”DisplayObject”なんだけど、
ObjectやSprite、もしくはBitmapだとCompiler Errorsでダメ出しされた。
なんで??
誰かおせーて、エロイ人。

CATEGORY

POSTED

jam

2008/10/08 | 3:46 am

trace()の色んな使い方

とりあえず、よく忘れるtrace()の使い方をメモ。
(注:AS2.0です)

MovieClipの中に何が含まれてるか調べる:

for(var prop in MOVIECLIP){
	trace(prop + " : " + MOVIECLIP[prop]);
}

Objectの中に何が含まれてるか調べる:

import mx.data.binding.ObjectDumper;

trace(ObjectDumper.toString(OBJECT, true, true));

CATEGORY

POSTED

jam

JUN NAKAJIMA
Tokyo, Japan.
member of Onawatobi.
contact@brooklyn.jp