Home > Flash

Flash Archive

extends Progression 拡張機能コンテストで Progression 開発者賞受賞

半年ほどブログ放置してすいません・・・

extends Progression 拡張機能コンテスト
http://extends.progression.jp/

Progression 開発者賞というものをいただいてしまいました!
感謝感激です。
しかも、予定にはなかった Progression 開発者賞という賞を新設していただくという暖かい配慮に心より感謝感謝です。
extends Progression 拡張機能コンテスト関係者の皆様本当にありがとうございました!

今回応募したものは LiquidLayout というライブラリです。
フルフラッシュサイトを作るときに、AS3になってからもっとやっかいになってしまった表示オブジェクト等の配置をカンタンにしちゃえというライブラリです。
ExDocument をルートシーンに使用していれば、LiquidLayout も利用可能という代物になっており、Progression に限らず利用できてしまうので、このあたりが Progression 開発者賞を新設していただけるという関係者の皆様を困惑させてしまう結果になってしまったようです。taka:niumさんすいません!

提出したプレゼン資料
(Slideライブラリ使用。左右キーで移動します)

サンプルデモ
(設定を変えたり、画面をぐりぐりリサイズしてご確認ください)

ソース一式
(サンプルデモで使用したクラスファイルも同梱しています)

Tweener を同じような構造をとっており、addLayout メソッドでオブジェクトとパラメータを追加して使用します。
数値で指定した画面位置からの距離、数値を文字列で渡すことによりパーセンテージでの指定が可能です。

Tweener ライブラリと大きく異なる部分は、Tweener は静的メソッドでアクセスするのに対し、LiquidLayout はインスタンスを生成して使用します。

var lauout:LiquidLayout = new LiquidLayout( document );
layout.addLayout( mc, { center: 0, middle: 0 } );

この部分は最後まで悩んだというか今現在でも悩んでいるのですが、オブジェクトの最大幅・最小幅・最大高さ・最小高さなどを、インスタンス本体が持っていることにあります。
もし、あるコンテンツだけ異なる設定をしたいとなった場合に、静的では対応が難しかったためインスタンス生成する形をとりました。

Flasherの方々はなにかしらのライブラリを使用されていると思いますが、もし LiquidLayout 気に入った!となれば使っていただけると幸いです。
また、こうしたほうがいいんじゃない?などご意見いただけるともっと幸いです。

Continue reading

基本クラスの変更で警告

_level0.KAYACさんのフォント埋め込み時のパブリッシュの高速化の方法を使ってフォントの埋め込みを行うんですが、あるシンボルを「コンパイルされたクリップに変換」をしていると、どうやらその後どのムービークリップシンボルの基本クラスが変更できない模様。

「コンパイルされたクリップに変換」されたシンボルがある状態で、その後作成したシンボルにflash.display.MovieClipの拡張クラスを基本クラスに指定すると、

警告

「指定されたクラスは定義済みで自身のサブクラスを拡張しているので、基本クラスは使用されません。基本クラスを使用する場合は、自動生成される [クラス] フィールドでクラス名を指定するか、デフォルトの基本クラス ‘flash.display.MovieClip’ を [基本クラス] フィールドに入力してください」

と長々と警告。

書き出しにはなんら問題ないらしく、_level0.KAYACさんのフォント埋め込みはパブリッシュが早く非常によいので、シンボルの基本クラスを変更するときだけコンパイルクリップをライブラリから削除して、シンボルの基本クラスを設定した後、もう一度作成するか退避させていたコンパイルクリップを戻してくるという方法で回避することにします。

CastMovieClipを多用しすぎるのも危険?

こんな生意気なことを言えばtaka:nium様に怒られるかもしれないが、ちょっと先日困ったことが発生したのでアップ。

非常に便利なのでなにかとシンボルを作るときもCastMovieClipを継承したMovieClipを作成しているわけなんですが、先日DataGridのCellRendererのスキンをいじくりたいことがあって、それらもCastMovieClip継承のクラスを作って入れ込んでみた。

そしたら、どうにもこうにも動きがもっさりしている・・・
僕のソースがきっと悪いんだと思って、あれやこれやをコメントアウトしてみるがどうにも改善しない。
それで単純にリンケージの基本クラスだけを変更してみたものでテスト。

この3種類を作ってテスト。
Google Chromeのタスクマネージャで確認してみる

そうすると、CastMovieClip・ExMovieClipを継承したほうでは、DataGrid内でマウスを動かしたりスクロールさせたりすると、メモリが増える増える!

普通にMovieClip継承でも増えるんやけど、増え方が尋常じゃない・・・
カラム数が増えると当たり前だけど増え幅も増大する。。
そして一度上がったものは減ってくれない・・・・

もうちょい単純なソースで検証してみる。
ただただENTER_FRAMEで追加削除を繰り返すのみのクラスを作って検証。
生成するものをCastMovieClipかMovieClipかを切り替えて書き出してみる。

package
{
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.events.Event;
	import jp.progression.casts.CastDocument;
	import jp.progression.casts.CastMovieClip;
	import jp.progression.Progression;

	public class AddCastIndex extends CastDocument
	{
		public var prog:Progression;

		public function AddCastIndex()
		{
		}

		protected override function _onInit():void
		{
			prog = new Progression( "index", stage );

			prog.root.onInit = function():void
			{
				var cast:CastMovieClip;
				var ny:Number = 0;
				var container:Sprite = new Sprite();
				var enterFrame:Function = function( e:Event ):void
				{
					if ( cast ) { container.removeChild( cast ); }
					cast = new CastMovieClip();
					cast.graphics.beginFill( 0 );
					cast.graphics.drawRect( 0, 0, stageWidth, 20 );
					ny = ( ny + 20 ) % stageHeight;
					cast.y = ny;
					container.addChild( cast );
				}
				prog.container.addChild( container );
				container.addEventListener( Event.ENTER_FRAME, enterFrame );
			}
			prog.goto( prog.firstSceneId );
		}
	}
}<

ENTER_FRAME時に一個しか生成しないので、微妙な差だけど、やっぱりCastMovieClipのほうが増加率は高い。

中をまさぐって検証するには敷居が高すぎるのでやめておこう・・・
でもCastMovieClipを使わないなんてもうできない体になっちゃって、そんな世界僕の中にはもうないけど、こういう使い捨てで済むMovieClipやSpriteはCast(Ex)系を継承せずに単純にMovieClipやSpriteを継承するほうがよさそう。

ってゆうのであってるのかな??

Continue reading

共有オブジェクトのリンケージクラスを生成するときの対策

共有オブジェクトとして書き出したリンケージクラスを、読み込み側SWFでインスタンス生成するときにはまったのでメモ。

起こったこと。

  1. MovieClipクラスを継承したSheardMovieClipクラスを作成します
  2. Flash上でムービークリップを作成し、いくつかのムービークリップを配置します。
    そしてそれらにインスタンス名をつけます。(ここではmc1,mc2とします。)

    SheardMovieClip (クラス名:SheardMovieClip、ランタイム共有用に書き出し)
    ├mc1 (インスタンス名:mc1)
    └mc2 (インスタンス名:mc2)
  3. 共有ライブラリSWFを書き出し
  4. このSheardMovieClipを読み込み側Flashにコピーして、プロパティでランタイム共有用に読み込みとなるよう設定します。
  5. そして読み込み側でインスタンス生成します。
    new SheardMovieClip();
    

として読み込み側SWFを書き出すとReferenceErrorが発生!

ReferenceError: Error #1056: SheardMovieClip のプロパティ mc1 を作成できません。

共有ライブラリSWFを書き出すときには何もなかったのに、共有ライブラリとして読み込むと、参照できないというか中のムービークリップの名前(プロパティ)を作成できないと言われる。
SheardMovieClipクラスに参照プロパティを作ってみる。

public var mc1:MovieClip;
public var mc2:MovieClip;

そして読み込み側SWFを再度書き出し。

お、何も言われない。

と思って、今度は共有ライブラリSWFを書き出してみると

1151: 定義 mc1 (名前空間 internal) にコンフリクトが存在します。

を怒られる。。
まぁそりゃそうだわな~と思いながら10分ほど悩む。

共有ライブラリFlashのパブリッシュ設定で「ActionScript設定」→「ステージのインスタンスを自動宣言」のチェックをはずすことで解決しました。

もしくはSheardMovieClip クラスをdynamicクラスにして、インスタンスを取得するときはgetChildByNameで参照する方法もあり。

ホーム > Flash

Search
Feeds
Meta

Return to page top