<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>blog.seyself.com</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/" />
    <link rel="self" type="application/atom+xml" href="http://blog.seyself.com/atom.xml" />
    <id>tag:blog.seyself.com,2008-03-07://7</id>
    <updated>2009-05-29T12:02:21Z</updated>
    <subtitle>[http://blog.seyself.com]</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Publishing Platform 4.01</generator>

<entry>
    <title>[as3] メソッドの存在は示したいけど、戻り値が何なのかは個別に設定したい</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2009/05/post_2009052920.html" />
    <id>tag:blog.seyself.com,2009://7.528</id>

    <published>2009-05-29T11:45:01Z</published>
    <updated>2009-05-29T12:02:21Z</updated>

    <summary>例えばイテレータみたいなのを定義するときに public interface I...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="as3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[例えばイテレータみたいなのを定義するときに<br />
<pre>
public interface Iterator 
{
    public function next():Object;
}
</pre>
ってすると、これを実装したクラスを作るときに、 next() が必要なことは明示できるけど
使うときに中身がなんなのかはっきりしなくて、何となく気に入らないので<br />
<pre>
public interface Iterator 
{
    public function get next():Function;
}
</pre>
ってやって、実装したクラスは
<pre>
public class SpriteIterator implements Iterator 
{
    public function get next():Function
    {
        return getNext;
    }
    
    private function getNext():Sprite
    {
        return spriteInstance;
    }
}
</pre>
ってやればいいんじゃないかと、つぶやいたら<br />
隣から「邪道」「余計にめんどくさい」と一蹴されてしまった。<br />
<br />
そもそも、こんなことしてもコード補完は効かないから、 型に * 指定するのと変わらなくなってしまった。<br />
<br />
っていうダメダメな話。<br />
<br />]]>
        
    </content>
</entry>

<entry>
    <title>[Flash] CS4 の fl パッケージの場所のメモ</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2009/05/post_2009052920.html" />
    <id>tag:blog.seyself.com,2009://7.527</id>

    <published>2009-05-29T11:34:47Z</published>
    <updated>2009-05-29T11:44:22Z</updated>

    <summary> CS4 の fl パッケージの場所 C:\Program Files\Adob...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="Flash" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[<br />
CS4 の fl パッケージの場所<br />
<pre>C:\Program Files\Adobe\Adobe Flash CS4\Common\Configuration\ActionScript 3.0\projects\Flash\src</pre>
<br />
mx パッケージ<br />
<pre>C:\Program Files\Adobe\Adobe Flash CS4\Common\First Run\Classes\</pre>
<br />
AS3 リファレンス<br />
<pre>file:///C:/Program%20Files/Common%20Files/Adobe/Help/ja_JP/AS3LCR/Flash_10.0/index.html</pre> <br />]]>
        
    </content>
</entry>

<entry>
    <title>[as3] メモ</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2009/05/post_2009051414.html" />
    <id>tag:blog.seyself.com,2009://7.526</id>

    <published>2009-05-14T05:31:04Z</published>
    <updated>2009-05-14T05:32:35Z</updated>

    <summary> var x:int = 9; var y:int = 3; trace(x +...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="as3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[<pre>
var x:int = 9;
var y:int = 3;
trace(x + y); // 12
trace(x - y); //  6
trace(x * y); // 27
trace(x / y); //  3
trace(x % y); //  0
trace(x & y); //  1
trace(x | y); // 11
trace(x ^ y); // 10
</pre>]]>
        
    </content>
</entry>

<entry>
    <title>[FlashDevelop] FlashDevelop の簡易計算機プラグイン</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2009/02/post_2009022017.html" />
    <id>tag:blog.seyself.com,2009://7.525</id>

    <published>2009-02-20T08:55:02Z</published>
    <updated>2009-02-20T08:56:48Z</updated>

    <summary>FlashDevelop から入力ダイアログを表示して、計算式を入力するとその結...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="FlashDevelop" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[FlashDevelop から入力ダイアログを表示して、計算式を入力するとその結果が現在のキャレット位置に挿入されるプラグインです。

<br />
<br />
対応しているバージョンは FlashDevelop3 RC1 以降となります。<br />
下位のバージョンでも動作するかもしれないですが、動作確認を取っておりません。<br />

<br />
<a href="http://blog.seyself.com/2009/02/20/FDCalculator_1.0.0.zip">FDCalculator.zip ダウンロード</a><br />
<br />
上記リンクからダウンロード、解凍後、中に入っている FDCalculator.dll を<br />
以下のフォルダにコピーします。<br />
<br />
<pre>C:\Program Files\FlashDevelop\Plugins</pre>
<br />
FlashDevelop を再起動すると、Insert メニュー内に以下の項目が追加されます。<br />
<ul>
<li>FDCalculator</li>
</ul>
<br />
■ <strong>FDCalculator</strong> (Ctrl + Shift + 4)<br />
使用方法はダイアログ内に計算式を入力して Enter キーを押すか、OKボタンを押すだけです。<br />
以下にいくつか入力例を挙げておきます。<br />
<strong>exp</strong> は入力した計算式、<br />
<strong>res</strong> はその結果です。<br />
<br />
<strong>四則演算</strong>
<pre>
exp : (5+6-7)*4/2
res : 8
</pre>
<br />
<strong>ビット演算</strong>
<pre>
exp : 1 &lt;&lt; 16
res : 65536
</pre>
<br />
AS3 に実装されている Math クラスのメソッドやプロパティを使用することも出来ます。<br />
使用する際に Math は必要ありません。<br />
<pre>
exp : cos(0.5) + sin(0.5)
res : 1.35700810049458
</pre>

<pre>
exp : sqrt(pow(4, 2) + pow(6, 2))
res : 7.21110255092798
</pre>

<pre>
exp : floor(PI*100)/100
res : 3.14
</pre>
<br />
16進数の入力も可能です。<br />
<pre>
exp : 0x7F7F7F &amp; 0xFF
res : 127
</pre>

<br />
<br />

<strong>特殊関数</strong><br />
独自に実装された関数もいくつか用意しています。<br />
<br />
<em>hex(value:uint):String</em><br />
数値を16進数の文字に変換します。
<pre>
exp : hex(10079487)
res : 0x99CCFF
</pre>
<br />
<em>deg(value:Number):Number</em><br />
ラジアン値を角度(180度)に変換します。
<pre>
exp : deg(PI*0.5)
res : 90
</pre>
<br />
<em>rad(value:Number):Number</em><br />
角度(180度)をラジアン値に変換します。
<pre>
exp : rad(60)
res : 1.0471975511966
</pre>
<br />
<em>color(ARGB:uint, s:Number, exp:String):uint</em><br />
色をARGBに分解してそれぞれの値を計算した結果を返します。<br />
exp に入る文字は次のいずれかになります。(+ - / * % &amp; |)<br />
<pre>
exp : hex(color(0xFFFFFF, 0.5, "*"))
res : 0x7F7F7F
</pre>
<em>color2(ARGB1:uint, ARGB2:uint, exp:String):uint</em><br />
2 つの色情報をもとに演算を行った結果を返します。<br />
exp に入る文字は次のいずれかになります。(+ - / * % &amp; |)<br />
<pre>
exp : hex(color2(0xFF9933, 0x404040, "|"))
res : 0xFFD973
</pre>
<br />
<br />]]>
        
    </content>
</entry>

<entry>
    <title>[FlashDevelop] FlashDevelop でお手軽テストプロジェクト作成プラグイン</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2009/02/post_2009021916.html" />
    <id>tag:blog.seyself.com,2009://7.524</id>

    <published>2009-02-19T07:47:27Z</published>
    <updated>2009-05-08T12:56:06Z</updated>

    <summary>追記 (2009.05.08) RC2 になって一部ディレクトリ構造が変わってし...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="FlashDevelop" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[<em>追記 (2009.05.08)</em><br />
RC2 になって一部ディレクトリ構造が変わってしまい、使えなくなっていたので修正しました。<br />
RC2、RC1 どちらでも使えます。<br />
一応前のバージョンのものも残しておきます。<br />
<a href="http://blog.seyself.com/2009/02/19/TemporaryProject_0.1.2.zip">TemporaryProject_0.1.2.zip ダウンロード</a><br />
<br />
--------------------------------------------------------------<br />
<br />
FlashDevelop + FlexSDK は非常に便利で、書き出しも早いので重宝しているのですが、
簡単なテスト用のスクリプトを書いて実行する場合でも、毎回プロジェクトを作成しなくてはならないのが煩わしいと思ってました。<br />
なのでプロジェクトをほとんど気にせずに、簡単にテスト環境を用意するプラグインを作ってみました。<br />
<br />
<a href="http://wonderfl.kayac.com/" target="_blank">wonderfl</a> のエディタとして利用している場合にも便利なんじゃないかと思います。<br />

<br />
<br />
対応しているバージョンは FlashDevelop3 RC1 以降となります。<br />
<br />
<strong>最新のバージョン</strong><br />
<a href="http://blog.seyself.com/2009/02/19/TemporaryProject_0.1.2.zip">TemporaryProject_0.1.2.zip ダウンロード</a><br />
<br />
<strong>過去のバージョン</strong><br />
<a href="http://blog.seyself.com/2009/02/19/TemporaryProject_0.1.1.zip">TemporaryProject_0.1.1.zip ダウンロード</a><br />
<br />
上記リンクからダウンロード、解凍後、中に入っている TemporaryProject.dll を<br />
以下のフォルダにコピーします。<br />
<br />
<pre>C:\Program Files\FlashDevelop\Plugins</pre>
<br />
FlashDevelop を再起動すると、Project メニュー内に以下の項目が追加されます。<br />
<ul>
<li>Temporary Project</li>
<li>Previous Project</li>
<li>Next Project</li>
</ul>
<br />
■ <strong>Temporary Project</strong> (Ctrl + Shift + 3)<br />
新たにプロジェクトを作成します。<br />
このプロジェクトは FlashDevelop を終了すると削除されます。<br />
削除されないようにするには Program Settings (F10) 内の <br />
TemporaryProject &gt; ClearTemporaryProjects を false にします。<br />
<br />
ここで作成されるプロジェクトは、<br />
<pre>
{FlashDevelop}\Data\TemporaryProject\template
</pre>
上記テンプレートから生成されるようになっています。<br />
このテンプレートを変更することで、自由にカスタマイズできます。<br />
MXML ベースのプロジェクトにも変更できます。<br />
<br />

<pre>
{FlashDevelop}\Data\TemporaryProject\tmp
</pre>
作成した一時プロジェクトは、この中に作成されています。<br />
<br />

■ <strong>Previous Project</strong> (Ctrl + Shift + ,)<br />
■ <strong>Next Project</strong> (Ctrl + Shift + .)<br />
このプラグインを使用していると簡単に新規プロジェクトを作成して試し書きができますが、<br />
メインで使用していたプロジェクトが閉じてしまいます。<br />
そのため、このプラグインではプロジェクトの履歴を最大20件まで記録しています。<br />
「Previous Project」「Next Project」を使用して過去に開いていたプロジェクトへ、簡単に行き来することができます。<br />
<br />
<br />]]>
        
    </content>
</entry>

<entry>
    <title>[FlashDevelop] JSCommands Plugin for FlashDevelop3</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2009/02/post_2009020214.html" />
    <id>tag:blog.seyself.com,2009://7.523</id>

    <published>2009-02-02T05:57:01Z</published>
    <updated>2009-02-02T08:24:56Z</updated>

    <summary> FlashDevelop 3 用のプラグインを作りました。 このプラグインは、...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="FlashDevelop" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[
FlashDevelop 3 用のプラグインを作りました。<br />
このプラグインは、FlashDevelop の編集中のドキュメントに対して JavaScript を実行して編集することができるようになります。<br />
コマンド用のスクリプトは .jsfd ファイルとしてプラグインディレクトリ内に保存されますので、自由に追加・編集・削除が可能です。<br />
これを使うことで、簡単なプラグインであれば、C# を使うことなく作成、編集することができるようになります。<br />
<br />
<br />
現在はまだ制作の途中段階ですので、今後仕様が変わる可能性はあります。<br />

<br />

<div>
<img src="http://blog.seyself.com/2009/02/02/fdcommand.png" width="453" height="400" />
</div>
<br />
<strong>ダウンロード</strong><br />
<del>fdcommands_0_1_2.zip</del><br />
<br />
<strong>追記</strong><br />
<a href="http://blog.seyself.com/2009/02/02/fdcommands_0_1_3.zip">fdcommands_0_1_3.zip</a><br />
prompt() と alert() が使えなかったので、実装しました。<br />
<br />
<strong>内容</strong><br />
<ul>
<li>FDCommands.dll</li>
<li>commandList.txt</li>
</ul>
<br />
<strong>導入方法</strong><br />
FlashDevelop の起動ディレクトリ内に <em>Plugins</em> というディレクトリがあるので、そこに <em>FDCommands.dll</em>をコピーしてください。<br />
例（XP の場合）：<br />
<pre>C:\Program Files\FlashDevelop\Plugins</pre>
FlashDevelop を再起動すれば「メニュー &gt; View」に FDCommands と追加されています。選択すると上記のパネルが表示されます。<br />
初回起動時に、FlashDevelop の <strong>Application Files</strong> に指定されているディレクトリの Data\FDCommands ディレクトリの中に <em>Commands</em> というディレクトリが作成されます。（以下 <em>Commands</em> はこれを指します。）この中にコマンドファイルが作成されます。<br />

<br />
<br />
<strong>使い方</strong><br />
<br />
<strong>コマンドリスト名</strong><br />
パネル上部のコンボボックスです。<br />
Commands 内に存在するディレクトリの中から1つ選択することが出来ます。<br />
初期状態では、ディレクトリは "default" のみです。<br />
<br />


<strong>メニューボタン</strong>
<dl>
<dt><strong>Run</strong></dt>
<dd>パネル下部のテキストボックスに表示されているコマンドを実行します。コマンドが選択されていない状態でも、エディタ部分にコードが書き込まれていた場合は、それを実行します。</dd>

<dt><strong>Refresh</strong></dt>
<dd>Commands ディレクトリを再読み込みします。</dd>

<dt><strong>Edit</strong></dt>
<dd>選択中のコマンドを FlashDevelop で開きます。</dd>

<dt><strong>Add</strong></dt>
<dd>新しくコマンドファイルを作成します。作成すると FlashDevelop に表示され、編集することができます。</dd>

<dt><strong>Delete</strong></dt>
<dd>選択中のコマンドを削除します。実行すると jsfd ファイルも削除されます。</dd>

<dt><strong>Add Directory</strong></dt>
<dd>コマンドファイルを入れておくディレクトリを新しく作成します。</dd>

</dl>
<br />
<strong>コマンド一覧</strong><br />
選択中のリスト内のファイルが一覧表示されます。<br />
リスト内のアイテムは、クリックすると選択状態となり、ダブルクリックで選択中のコマンドが実行されます。<br />
<br />
<strong>コマンド簡易エディタ</strong><br />
リストからコマンドを選択すると、コマンドのソースが表示されます。<br />
メニューの <em>Run</em> ボタンは、このソースを実行します。<br />
このエディタは、編集が可能ですが、編集した内容を保存することは出来ません。<br />
保存する場合は、新しくコマンドファイルを作成するか、既存のコマンドを編集して保存しなければなりません。<br />
<br />
<br />
<br />

<strong>コマンドの作成</strong><br />
zipファイル内に同梱されているテキストファイル内に、使用できるオブジェクトと関数を書いておきましたので、こちらを参考にしてください。<br />
内部で JScriptCodeProvider を使用しているので、基本的な JavaScript は普通に使えるかと思います。（実際には JScript なんですが。）<br />
また改めてドキュメントを作成する予定ですが、今はまだ仕様もはっきり決まっていないため、作っていません。<br />
<br />
<br />
<br />

<strong>今後実装したいと思っている機能について</strong><br />
<ul>
<li>キーボードショートカットの実装</li>
<li>AS3のクラスの参照</li>
<li>JSFDソースのコードヒント</li>
</ul>
<br />
<br />
クラスの参照については、対象のクラス内で定義された import や implements を参照して、クラス内で定義されているプロパティを簡単に取得できるようにしたいのですが、
swc の場合など、どうすればいいのか正直分からなくて困ってます。<br />
ProjectManager や Outline などのプラグインを参照して、そこから取得できればと思っているのですが、他のプラグインの参照の仕方が分からなかったり。<br />
<br />
あと、このプラグインのソースも誰か助言くれる人とかいるのなら、GoogleCode か Spark（いいのかな？）で公開したいとも思ってますが、まだ未定です。<br />
手探りで作ってるので、バグもたぶんあります。<br />
もし使用される方がいらっしゃれば、バグが見つかったときはコメントなりTwitter なりで報告していただけると助かります。<br />
<br /><br />
また、これを使ってみんなが便利なコマンドを作ってくれたらなあ。なんて浅はかな願望もあったり、なかったり、らじばんだり。<br />
<br />
<br />
<br />
ちょっと立て込んでいるので遅くなるかもしれないですが、またアップデートしたらご報告します。<br />
<br />

そもそもこんなプラグインに需要があるかのかどうか。<br />
<br />
<br />]]>
        
    </content>
</entry>

<entry>
    <title>[FlashDevelop] FlashDevelop のプラグインを作ってみる：試作</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2009/01/post_2009012716.html" />
    <id>tag:blog.seyself.com,2009://7.522</id>

    <published>2009-01-27T07:04:18Z</published>
    <updated>2009-01-31T14:50:00Z</updated>

    <summary>FlashDevelop のプラグインの作り方をメモ。其の二。 ■試しに一からこ...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="FlashDevelop" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[FlashDevelop のプラグインの作り方をメモ。其の二。<br />
<br />

<strong>■試しに一からこさえてみる。</strong><br />
<br />

<dl>

<dt><em># 準備</em></dt>
<dd>
<strong>FD3</strong> ディレクトリ内に <strong>CustomPlugin</strong> という空のディレクトリを作っておく。
</dd>

<br />

<dt><em># プロジェクトを作成する</em></dt>
<dd>Visual Studio を立ち上げて、<strong>ファイル &gt; 新しいプロジェクト(Ctrl + Shift + N)</strong>を選択。<br />
開いたテンプレートの中から「空のプロジェクト」を選択して「OK」。<br />
<br />
<strong>ファイル &gt; Project1.sln の保存(Ctrl + S)</strong>を選択。<br />
<ul>
<li>名前：TestPlugin</li>
<li>場所：先ほど作った CustomPlugin ディレクトリ</li>
<li>ソリューション名：「ソリューションのディレクトリを作成」のチェックをはずしておく</li>
</ul>
で、「上書き保存」。<br />
<br />
<strong>ソリューション エクスプローラ</strong>パネル内の「ソリューション `TestPlugin`(1 プロジェクト)」と表示されているアイコンを右クリック。<br />
「<strong>追加 &gt; 既存のプロジェクト</strong>」を選択して、
<pre>\FD3\FlashDevelop\FlashDevelop.csproj</pre>
を選択する。続けて、<br />
<pre>\FD3\PluginCore\PluginCore.csproj</pre>
も追加しておく。
</dd>

<br />

<dt><em># ソリューションの設定</em></dt>
<dd>
ソリューションのアイコンを選択した状態で、「右クリック &gt; プロジェクトの依存関係」を選択。<br />
「プロジェクト」に「TestPlugin」を選択。<br />
「依存先」に「<strong>PluginCore</strong>」のみチェックを入れておく。<br />
<br />
ソリューションパネルから、「FlashDevelop」プロジェクトを選択。<br />
「右クリック &gt; スタートアップ プロジェクトに設定」を選択しておく。（FlashDevelop プロジェクトが太字になる。）<br />
<br />
「メニュー &gt; ビルド &gt; <strong>構成マネージャ</strong>」を開く。<br />
パネル下の「プロジェクトのコンテキスト」というテーブルから、「TestPlugin」の行の「プラットフォーム」箇所を選択（デフォルトではAny CPU になってると思う。）、「<strong>新規作成</strong>」を選択する。<br />
ダイアログが開くと、以下の設定にして「OK」を押す。<br />
<ul>
<li>「新しいプラットフォーム」：x86</li>
<li>「設定のコピー元」：Any CPU</li>
<li>「新しいソリューション プラットフォームを作成する」のチェックをはずす。</li>
</ul>
<br />
テーブル内の TestPlugin のプラットフォームの項目が「<strong>x86</strong>」に変わるが、これを元の「<strong>Any CPU</strong>」に戻してから、閉じる。<br />
（なぜかこれをしないと出力先が設定しても正しく反映されない。）<br />
<br />
<br />

以降、"FlashDevelop"、"PluginCore" のプロジェクトは触らないので、ツリーは閉じた状態にしといた方が見やすい。<br />
</dd>

<br />

<dt><em># TestPlugin プロジェクトの設定</em></dt>
<dd>
ソリューションパネル内の「参照設定」を右クリック。「<strong>参照の追加</strong>」を選択。<br />
開いたパネル内のタブから「<strong>参照</strong>」を選択。<br />
ファイルの選択画面になるので、
<pre>\FD3\PluginCore\Bin\Debug\PluginCore.dll</pre>
を選択。<br />
<br />
続いて、再度「参照の追加」を開く。<br />
「<strong>.NET</strong>」タブを選択。"System.Drawing", "System.Window.Forms" を追加する。（Ctrl + クリックで複数選択可）<br />
<br />
ソリューションパネル内の「TestPlugin」プロジェクトアイコンを選択した状態で、「プロパティ」ボタンを押す。（もしくは、右クリックから「プロパティ」を選択。）<br />
「<strong>アプリケーション</strong>」タブパネルの「<strong>対象のフレームワーク</strong>」を「ソリューションパネル内の「TestPlugin」プロジェクトアイコンを選択して」に設定する。<br />
<br />
変更すると、一度パネルが閉じるので、再度プロパティパネルを開く。<br />
<br />
<strong>アプリケーション</strong>タブパネルの以下の設定を変更しておく。<br />
アセンブリ名：TestPlugin<br />
規定の名前空間：TestPlugin<br />
出力の種類：クラスライブラリ<br />
<br />
<strong>ビルド</strong>タブパネルの出力先のパスを以下に変更する。<br />
<pre>..\..\FlashDevelop\Bin\Debug\Plugins\</pre>

</dd>

<br />

<dt><em># メインクラスの作成</em></dt>
<dd>
ソリューションパネル内の「TestPlugin」プロジェクトアイコンを選択して、右クリック。<br />
「追加 &gt; クラス」を選択。<br />
ファイル名を「<strong>PluginMain.cs</strong>」として追加。<br />
<br />
以下のコードをソースの上部に追加。
<pre>using PluginCore;</pre>
AS3 でいう、import だと思う。（includeかな？）<br />
<br />
クラスの宣言を以下に変更。<br />
<pre><strong>public</strong> class PluginMain<strong> : IPlugin</strong></pre>
太字のところが追記した箇所。<br />
<br />
メインクラスは "<strong>PluginCore.IPlugin</strong>" インターフェースが定義されてないといけない。<br />
<br />
「メニュー &gt; 表示 &gt; クラスビュー」で、クラスビューパネルを開く。<br />
TestPlugin のツリーを開いていくと、「IPlugin」が出てくる。<br />
さらに下層に、「IEventHandler」というインターフェースも出てくる。<br />
これをクリックすると定義されたメソッド、プロパティが表示される。<br />
<br />
PluginMain クラスは、これらのインターフェースを定義しているので、AS3 同様、実装してやる必要がある。<br />
<br />
実装が必要なものは以下。<br />
<br />
<ul>
<li>void HandleEvent(object, PluginCore.NotifyEvent, PluginCore.HandlingPriority)</li>
<li>void Dispose()</li>
<li>void Initialize()</li>
<li>string Author { get; }</li>
<li>string Description { get; }</li>
<li>string Guid { get; }</li>
<li>string Help { get; }</li>
<li>string Name { get; }</li>
<li>object Settings { get; }</li>
</ul>
</dd>

必要最小限実装するとこんな感じ。<br />
<a href="http://blog.seyself.com/2009/01/27/PluginMain.txt" target="_blank">PluginMain.cs</a><br />
<br />


<br />

<dt><em># 実行</em></dt>
<dd>
「メニュー &gt; デバッグ &gt; <strong>デバッグ開始(F5)</strong>」を実行する。<br />
<br />
FlashDevelop が開くが、実際には何も実装していないので、何も起きない。<br />
FlashDevelop の 「Tools > <strong>Program Settings...(F10)</strong>」からSettings パネルを開く。<br />
<strong>Plugins</strong> の中に「TestPlugin」が追加されていれば、正しくコンパイルできたことになる。<br />

</dd>

</dl>
<br />
<br />


<strong>■コードメモ</strong><br />
<strong>追記</strong><br />
参照先が間違っていたので書き換えました。
<pre>
PathHelper.AppDir        // C:\Program Files\FlashDevelop
PathHelper.DocDir        // C:\Program Files\FlashDevelop\Docs
PathHelper.LibraryDir    // C:\Program Files\FlashDevelop\Library
PathHelper.BaseDir       // C:\Documents and Settings\<USER>\Local Settings\Application Data\FlashDevelop
PathHelper.DataDir       // C:\Documents and Settings\<USER>\Local Settings\Application Data\FlashDevelop\Data
PathHelper.SettingDir    // C:\Documents and Settings\<USER>\Local Settings\Application Data\FlashDevelop\Settings
PathHelper.SnippetDir    // C:\Documents and Settings\<USER>\Local Settings\Application Data\FlashDevelop\Snippets
PathHelper.TemplateDir   // C:\Documents and Settings\<USER>\Local Settings\Application Data\FlashDevelop\Templates
PathHelper.UserAppDir    // C:\Documents and Settings\<USER>\Local Settings\Application Data\FlashDevelop
PathHelper.UserPluginDir // C:\Documents and Settings\<USER>\Local Settings\Application Data\FlashDevelop\Plugins
</pre>
<br />
UserPluginDir の参照先は実際にはディレクトリが存在しなくて、プラグインのデータは Data ディレクトリ内に入ってるんだけども、これは仕様変更のなごりなんだろうか。
<br />
つづく<br />
<br />]]>
        
    </content>
</entry>

<entry>
    <title>[FlashDevelop] FlashDevelop のプラグインを作ってみる：準備～導入</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2009/01/post_2009012615.html" />
    <id>tag:blog.seyself.com,2009://7.521</id>

    <published>2009-01-26T06:52:47Z</published>
    <updated>2009-01-26T10:03:45Z</updated>

    <summary>FlashDevelop のプラグインの作り方をメモ。 ■参照 導入方法について...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="FlashDevelop" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[FlashDevelop のプラグインの作り方をメモ。<br />
<br />

<strong>■参照</strong><br />
<br />

<ul>
<li>導入方法についてこちらに簡単な説明が記されている。<br />
<a href="http://www.flashdevelop.org/wikidocs/index.php?title=Plugin_Development" target="_blank">Plugin Development - FlashDevelop</a><br />
<br />
</li>

<li>開発用のソースコードは Google Code から。<br />
<a href="http://code.google.com/p/flashdevelop/" target="_blank">flashdevelop - Google Code</a><br />
<br />
SVN : http://flashdevelop.googlecode.com/svn/trunk/<br />
<br />
</li>

<li>Visual C# 2008 Express Edition を以下からダウンロード・インストール<br />
<a href="http://www.microsoft.com/japan/msdn/vstudio/Express/" target="_blank">Microsoft Visual C# 2008 Express</a><br />
<br />
</li>
</ul>
<br />

<strong>■導入</strong><br />
<br />

まだ、僕自身知識が曖昧なので、間違ってる部分もあるかと思います。ご注意ください。<br />
<br />

FlashDevelop は Visual C# で出来ています。<br />
上のリンク先から Visual C# 2008 Express をインストールしておきます。<br />
また、同じく Google Code から FlashDevelop のソースコードも入手しておきます。<br />
<br />
使うのは FlashDevelop 3 なので、"FD3" ディレクトリ以下が、使用するソースコードになります。<br />
<br />

プラグインディレクトリ
<pre>\FlashDevelop\FD3\External\Plugins\SamplePlugin</pre>

.csproj が Visual C# のプロジェクトファイルなので、上記ディレクトリに入っている "SamplePlugin.csproj" を開く。<br />
<br />

プロジェクトを開くと「ソリューション エクスプローラ」というパネルが表示されています。<br />
（FlashDevelop に UI が非常に似ているのでエディタの使い方は FlashDevelop を使っていれば分かりやすいと思う。）<br />

この中に 3 つのプロジェクトが表示されています。
<ul>
<li><strong>FlashDevelop</strong> - デバッグの実行時に使用される FlashDevelop そのもの</li>
<li><strong>PluginCore</strong> - プラグインを作る上で必須となるコアライブラリ</li>
<li><strong>SamplePlugin</strong> - 作成中のプラグイン</li>
</ul>

基本的に "FlashDevelop" と "PluginCore" を変更することはないと思う。<br />
<br />

まずは試しにデバッグを実行してみる。<br />
メニューから「デバッグ &gt; デバッグ開始（F5）」で実行。<br />
実行すると、FlashDevelop が起動して、SamplePlugin パネルが表示される。<br />
表示されていない場合は、「View &gt; SamplePlugin（Ctrl + F1）」で表示される。<br />
<br />
このサンプルはアクティブな状態のドキュメントが切り替えられたときに、パネルにファイル名を表示するだけのものです。<br />
試しに Ctrl + N で新規ファイルを開いて、タブを切り替えると動作が分かるかと思います。<br />
<br />
デバッグの終了は、開いた FlashDevelop を閉じるか、 Shift + F5。<br />
<br />

<strong>SamplePlugin 構成</strong>
<pre>
SamplePlugin
    +- Properties/
    |    +- AssemblyInfo.cs
    +- 参照設定/
    +- Resources/
    |    +- en_US.resX
    |    +- LocaleHelper.cs
    |
    +- PluginMain.cs
    +- PluginUI.cs
    +- Settings.cs
</pre>
<br />

<strong>AssemblyInfo.cs</strong><br />
作成するプラグインに関する情報の定義<br />
書き出したファイル（.dll）のプロパティ開いたときに表示される内容。<br />
<br />

<strong>en_US.resX</strong><br />
メニューでの表示名、パネルのタイトル、設定での説明文が設定されたファイル。<br />
あんまり意味が理解できてない。<br />
多言語に対応できるようにするためにこうなってんのかな？<br />
画像を埋め込んだりするのも、このリソースファイルってのを使うらしい。<br />
<br />

<strong>LocaleHelper.cs</strong><br />
リソースファイル内の値を抜き出すためのクラスファイル<br />
en_US.resX で設定した "名前" を GetString() に渡すと値が取得できる。<br />
<br />

<strong>PluginMain.cs</strong><br />
SamplePlugin のメインクラス<br />
<br />

<strong>PluginUI.cs</strong><br />
SamplePlugin パネルの UI を定義。<br />
ツールボックスからコンポーネントをドラッグで追加とかできる。<br />
Flex Builder と近い？（Flex Builderを使ったことがない・・・）<br />
「表示 &gt; コード(F7)」でソース表示。<br />
<br />

<strong>Settings.cs</strong><br />
FlashDevelop の 「Tools &gt; Program Settings...(F10)」で設定できる項目を定義する。<br />
開くと "Plugins" のところに "SamplePlugin" が表示されている。その中の設定。<br />
<br />

<strong>■ちょろっとソースのメモ</strong><br />
PluginMain.cs
<pre>
//現在開いてるドキュメントのエディタへの参照
ScintillaNet.ScintillaControl sciControl = PluginBase.MainForm.CurrentDocument.SciControl;

//現在開いてるドキュメントのテキストを参照
String text = sciControl.Text;

//現在のキャレットの位置にある単語を取得
String word = sciControl.GetWordFromPosition(sciControl.SelectionStart);
</pre>
<br />
<br />

<strong>FlashDevelop に適用する</strong><br />
メニュー下の「ソリューション構成」（FlashDevelop で Debug と Release の切り替えを行うコンボボックスみたいなとこ）を "Debug" から "Release" に変更して、<strong>ビルド &gt; ソリューションのビルド(F6)</strong>を実行する。<br />
<br />
SamplePlugin ディレクトリ内に obj ディレクトリが作られて、その中の Release ディレクトリに SamplePlugin.dll が作成される。<br />
<br />
<pre>\Program Files\FlashDevelop\Plugins</pre>
FlashDevelop の "Plugins" ディレクトリ内に生成された.dll ファイルをコピーして、FlashDevelop を起動すると使えるようになります。<br />
<br />
<br />

FlashDevelop を使って AS3 をごりごり書いてる人は、C# のソース見れば大体何をやってるのかはわかると思う。<br />
ルールの違いが掴めれば、プラグインを作るぐらいのレベルであれば、 AS3 と大して変わらないと思う。<br />
<br />
僕自身 C# に触れたのはこれがはじめて。<br />
<br />
<br />
続く。<br />
<br />]]>
        
    </content>
</entry>

<entry>
    <title>[Progression][as3] SceneObject のイベントフロー周りを少し細かく実装してみました</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2008/11/post_200811171.html" />
    <id>tag:blog.seyself.com,2008://7.520</id>

    <published>2008-11-16T16:25:38Z</published>
    <updated>2008-11-17T02:14:29Z</updated>

    <summary>現在の Progression にはシーンオブジェクトにイベントフローが実装され...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="Progression" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="as3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[現在の Progression にはシーンオブジェクトにイベントフローが実装されていますが、
表示オブジェクトとは少し挙動が違っています。（Progression 3.0.7 現在）<br/>
<br/>
useCapture や eventPhase, bubbles あたりの値が有効化されていませんので、これを実装してみました。<br/>
<br/>

変更を加えたファイルを以下に置いておきます。<br/>
<a href="http://trac.progression.jp/svn/experiments/sayself/flowableSceneEvent/jp/progression/events/progression_event.as">jp/progression/events/progression_event</a><br/>
<a href="http://trac.progression.jp/svn/experiments/sayself/flowableSceneEvent/jp/progression/events/SceneEvent.as">jp/progression/events/SceneEvent</a><br/>
<a href="http://trac.progression.jp/svn/experiments/sayself/flowableSceneEvent/jp/progression/scenes/SceneObject.as">jp/progression/scenes/SceneObject</a><br/>
<br/>
<del>未だ as ファイルだと表示できなくて、拡張子を .txt に変えてますが。</del><br/>
リンク先を trac.progression.jp の方に変更しました。<br/>
<br/>
まとめてダウンロードされる場合はこちら。<br/>
<a href="http://blog.seyself.com/2008/11/16/eventflow.zip">eventflow.zip</a>
<br/>
<br/>
以下、解説を少し。<br/>
<pre>
var sceneA:SceneObject = createScene("sceneA");
var sceneB:SceneObject = createScene("sceneB");
var sceneC:SceneObject = createScene("sceneC");

sceneA.addScene(sceneB);
trace("----");
sceneB.addScene(sceneC);
trace("----");
sceneA.removeScene(sceneB);

function createScene(name:String):SceneObject
{
    var scene:SceneObject = new SceneObject(name);
    scene.addEventListener(SceneEvent.SCENE_ADDED, eventHandler, false);
    scene.addEventListener(SceneEvent.SCENE_REMOVED, eventHandler, false);
    scene.addEventListener(SceneEvent.SCENE_ADDED, eventHandler, true);
    scene.addEventListener(SceneEvent.SCENE_REMOVED, eventHandler, true);
    return scene;
}

function eventHandler(event:Event):void 
{
    trace(event.target.name, event.currentTarget.name, event.type, event.eventPhase);
}
</pre>
<br />
出力結果
<pre>
sceneB sceneA sceneAdded 1
sceneB sceneB sceneAdded 2
sceneB sceneA sceneAdded 3
----
sceneC sceneA sceneAdded 1
sceneC sceneB sceneAdded 1
sceneC sceneC sceneAdded 2
sceneC sceneB sceneAdded 3
sceneC sceneA sceneAdded 3
----
sceneB sceneA sceneRemoved 1
sceneB sceneB sceneRemoved 2
sceneB sceneA sceneRemoved 3
</pre>
<br />
<br />
変更したのは SceneEvent クラスと SceneObject クラスの 2 つ。<br />
<br />
まず SceneEvent クラスに以下を追記。
<pre>
override public function get target():Object 
{
    return super.target
        &amp;&amp; progression_event::$target 
        || super.target;
}

override public function get currentTarget():Object 
{
    return super.currentTarget 
        &amp;&amp; progression_event::$currentTarget
        || super.currentTarget;
}

override public function get eventPhase():uint 
{
    return progression_event::$eventPhase || super.eventPhase;
}

progression_event var $target:Object = null;
progression_event var $currentTarget:Object = null;
progression_event var $eventPhase:uint = 0;
</pre>
ここで SceneObject から値に手を加えられるようにするために、
progression_event という namespace ファイルを jp/progression/events/ 内に追加しています。<br />
<br />
<pre>
package jp.progression.events 
{
    public namespace progression_event 
        = "http://www.progression.jp/events/progression_event";
}
</pre>
<br />
<br />
dispatchEvent() にイベントオブジェクトを渡したときに target に値が設定されていると、
dispatchEvent 内で Event.clone() が呼び出されるので、 super.target が null のときは null を返すようにしています。<br />
もし $target が設定されていて super.target も設定されている場合は $target の値を、
$target が null でも super.target が設定されている場合は super.target の値を返します。<br />
これは、 dispatchEvent() の内部以外での clone() メソッドの呼び出しへの配慮でもあります。<br/>
<br />
次はちょっと長いですが、 SceneObject に追加した内容。
<pre>
/**
 * イベントフローのための内部参照
 */
private var $parent:SceneObject;

/**
 * キャプチャ段階のイベントに登録されたリスナーを保持しておくための EventIntegrator オブジェクト
 * 
 * コンストラクタ内に以下を追記
 * $captureEvent = new EventIntegrator(this);
 */
private var $captureEvent:EventIntegrator;

override public function dispatchEvent(event:Event):Boolean 
{
    if (event is SceneEvent)
    {
        return $dispatchEvent(event as SceneEvent);
    }
    return super.dispatchEvent(event);
}

private function $dispatchEvent(event:SceneEvent):Boolean
{
    var bool:Boolean = true;
    
    if (event.eventPhase == EventPhase.AT_TARGET)
        event.progression_event::$target = this;
    
    event.progression_event::$currentTarget = this;
    
    if (event.bubbles 
        &amp;&amp; $parent 
        &amp;&amp; event.eventPhase &lt;= EventPhase.AT_TARGET)
    {
        var phase1:SceneEvent = event.clone() as SceneEvent;
        phase1.progression_event::$eventPhase = EventPhase.CAPTURING_PHASE;
        phase1.progression_event::$target
            = event.progression_event::$target;
        bool = $parent.dispatchEvent(phase1);
    }
    
    if (event.eventPhase == EventPhase.CAPTURING_PHASE)
    {
        bool = $captureEvent.dispatchEvent(event);
    }
    else
    {
        bool = super.dispatchEvent(event);
    }
    
    if (event.bubbles 
        &amp;&amp; $parent 
        &amp;&amp; event.eventPhase &gt;= EventPhase.AT_TARGET)
    {
        var phase3:SceneEvent = event.clone() as SceneEvent;
        phase3.progression_event::$eventPhase = EventPhase.BUBBLING_PHASE;
        phase3.progression_event::$target = event.target;
        bool = $parent.dispatchEvent(phase3);
    }
    return bool;
}

override public function addEventListener(
    type:String, listener:Function, useCapture:Boolean = false,
    priority:int = 0, useWeakReference:Boolean = false):void 
{
    if (useCapture)
    {
        $captureEvent.addEventListener(
            type, listener, false, priority, useWeakReference);
    }
    else
    {
        super.addEventListener(
            type, listener, false, priority, useWeakReference);
    }
}

override public function removeEventListener(
    type:String, listener:Function, useCapture:Boolean = false):void 
{
    if (useCapture)
    {
        $captureEvent.removeEventListener(type, listener, false);
    }
    else
    {
        super.removeEventListener(type, listener, false);
    }
}

override public function hasEventListener(type:String):Boolean 
{
    return super.hasEventListener(type)
        || $captureEvent.hasEventListener(type);
}

override public function willTrigger(type:String):Boolean 
{
    var bool:Boolean = hasEventListener(type);
    if ($parent) bool = bool || $parent.hasEventListener(type);
    return bool;
}

override public function removeAllListeners(
    completely:Boolean = false):void 
{
    super.removeAllListeners(completely);
    $captureEvent.removeAllListeners(completely);
}

override public function restoreRemovedListeners():void 
{
    super.restoreRemovedListeners();
    $captureEvent.restoreRemovedListeners();
}
</pre>
ここでは EventDispatcher のメソッドをそれぞれオーバーライドして処理内容に手を加えています。<br />
具体的には、 addEventListener() と removeEventListener() で useCapture の値で
登録するオブジェクトを分けています。これはイベント呼び出し時にイベントフェーズによる振り分けができないためです。<br />
<br />
dispatchEvent() 内は、親シーンへ遡ってイベントを呼び出すように変更しています。<br />
<br />
更に、 _registerScene() と _unregisterScene() にも少し修正を加えます。<br />
<br />
_registerScene の変更箇所
<pre>
// イベントフロー時の参照先を登録する
scene.$parent = scene._parent;

// イベントリスナーを登録する
//scene.addExclusivelyEventListener( SceneEvent.SCENE_ADDED, 
    dispatchEvent, false, int.MAX_VALUE, true );
//scene.addExclusivelyEventListener( SceneEvent.SCENE_REMOVED, 
    dispatchEvent, false, int.MAX_VALUE, true );
//addExclusivelyEventListener( SceneEvent.SCENE_ADDED_TO_ROOT, 
    scene.dispatchEvent, false, int.MAX_VALUE, true );
//addExclusivelyEventListener( SceneEvent.SCENE_REMOVED_FROM_ROOT, 
    scene.dispatchEvent, false, int.MAX_VALUE, true );

// イベントを送出する
scene.dispatchEvent( new SceneEvent(
    SceneEvent.SCENE_ADDED, true, false, scene ) );

// ルートシーンが存在し、変更されていれば
if ( root && previousRoot != root ) {
    // イベントを送出する
    scene.dispatchEvent( new SceneEvent(
        SceneEvent.SCENE_ADDED_TO_ROOT, true, false, scene ) );
}
</pre>
<br />
_unregisterScene の変更箇所
<pre>
// イベントを送出する
scene.dispatchEvent( new SceneEvent( SceneEvent.SCENE_REMOVED, true, false, scene ) );

// ルートシーンが存在せず、変更されていれば
if ( !scene._root && previousRoot != scene._root ) {
    // イベントを送出する
    scene.dispatchEvent( new SceneEvent( SceneEvent.SCENE_REMOVED_FROM_ROOT, true, false, scene ) );
}

// イベントフローのための参照を削除
scene.$parent = null;

// イベントリスナーを解除する
//scene.completelyRemoveEventListener( 
    SceneEvent.SCENE_ADDED, dispatchEvent );
//scene.completelyRemoveEventListener( 
    SceneEvent.SCENE_REMOVED, dispatchEvent );
//completelyRemoveEventListener( 
    SceneEvent.SCENE_ADDED_TO_ROOT, scene.dispatchEvent );
//completelyRemoveEventListener( 
    SceneEvent.SCENE_REMOVED_FROM_ROOT, scene.dispatchEvent );
</pre>
追加・削除された子シーンにイベントリスナーの登録を行っていた処理をコメントアウトしています。<br />
また、イベントフローのための親シーンの参照を登録・解除しています。<br/>
<br/>
あとは、 dispatchEvent に渡されるイベントオブジェクトの bubbles の値を true に変更しました。<br/>
bubbles が false に設定された場合はイベントフローを発生させないようにしているためです。<br/>
<br/>
以上で、表示オブジェクトのようなイベントフローの実装ができます。<br/>
ただ、 EventIntegrator での実装を、あまり理解せずに手を加えているので、どこかに不都合はあるかもしれないです。<br/>
すこし使い倒してみる必要はあるかと思います。<br/>
<br/>]]>
        
    </content>
</entry>

<entry>
    <title>[as3] AS3 についていろいろメモ</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2008/11/post_2008110618.html" />
    <id>tag:blog.seyself.com,2008://7.519</id>

    <published>2008-11-06T09:42:46Z</published>
    <updated>2008-11-06T09:55:44Z</updated>

    <summary>役に立つかもしれない情報から、全く無意味としか思えない情報まで。 ひとつひとつエ...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="as3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[役に立つかもしれない情報から、全く無意味としか思えない情報まで。<br />
ひとつひとつエントリーするほどのものでもないので、以下にまとめて書く。<br />
<br />
<br />


<h3><strong>■設定されたステージサイズを取得する</strong></h3>
<pre>
stage.addEventListener(Event.ACTIVATE, activateHandler);

function activateHandler(event:Event):void
{
    event.target.removeEventListener(Event.ACTIVATE, activateHandler);	
    
    var defaultWidth:int = root.loaderInfo.width;
    var defaultHeight:int = root.loaderInfo.height;
}
</pre>
これらの値はステージサイズが変更されても変わらない。
ただし、コンテンツの読み込みが完了しないうちに loaderInfo.width 等を呼び出すとエラーが吐き出されるので、使用には注意。
<br />
<br />

<h3><strong>■レイヤーマスク</strong></h3>
タイムライン上で設定されたマスクには不審な点がいくつかある。<br />
<br />

<ul>
	<li>マスクオブジェクトはマスクを解除しても表示されなくなる。ただし getRect() や getBounds() 等の矩形情報は残ってる。表示だけがなくなる。</li>
	<li>マスクオブジェクトは深度 (index) が、対象オブジェクトより下に変更される。</li>
	<li>対象オブジェクトのmask, scrollRect プロパティとは無関係</li>
	<li>マスクを解除する場合は "mask = null" ではなく、マスクオブジェクトをremoveChild() でステージ上から削除するか、setChildIndex() 等を用いて深度を変更する。</li>
	<li>被マスクオブジェクトの mask プロパティにオブジェクトを指定すると、2重でマスクが掛けられる。</li>
	<li>AS から、別のオブジェクトを被マスクオブジェクトに隣接する深度に設定すると、そのオブジェクトもマスクの対象となる。<br />
		もし、現在の被マスクオブジェクトの深度が一番上になっている場合、同階層に addChild() で配置されたオブジェクトも、自動的にマスク対象となってしまう。</li>
	<li>マスクオブジェクトの深度を変更すると、マスクは一度解除されるが、マスクオブジェクトの1つ上の深度にオブジェクトを配置すると、マスク対象になる。</li>
	<li>マスクオブジェクトを他のオブジェクト内に移動させた場合、元のマスクは解除されるが、移動先でもマスク効果は有効であるため、移動後も上記のルールが適応される。例えば、<br />
		<pre>B.addChild( A.getChildByName("maskObject") );</pre>
		とした場合、A でのマスク効果は解除されるが、B 内では有効となる。</li>
</ul>
結局のところスクリプトからオブジェクトがレイヤーマスクか、または被マスクオブジェクトであるかを調べる方法は不明。<br />
ActionScript とは掛け離れた部分で制御されているのかもしれない。
<br />
<br />

<h3><strong>■scrollRect を指定したオブジェクトのサイズを調べる</strong></h3>
<pre>
function getDefaultRect(target:DisplayObject):Rectangle
{
    if(target.parent)
    {
        var path:DisplayObjectContainer = target.parent;
        var index:uint = path.getChildIndex(target);
        path.removeChild(target);
    }
    
    var bounds:Rectangle = target.transform.pixelBounds;
    bounds = new Rectangle(
            bounds.x * 0.2 - target.x, 
            bounds.y * 0.2 - target.y, 
            bounds.width * 0.2, 
            bounds.height * 0.2);
    
    if(path)
    {
        path.addChildAt(target, index);
    }
    
    return bounds;
}
</pre>
transform.pixelBounds を使うと元の大きさが取得できるが、<br />
そのままだと、親オブジェクトの変形の影響をもろに受けてしまうので、<br />
一度 removeChild() で引き剥がした方がいい場合もある。時と場合による。<br />
<br />
また、対象が stage 上に配置されていない場合、なぜか取得した値がすべて 5 倍になっているので、その場合は割ってやる必要がある。<br />
さらに、AS 側で [Embed] タグを用いて埋め込んだ場合も、ステージに配置したにもかかわらず、次のフレームに移るまでは、同じく値が 5 倍になっており、
これを判定するのは面倒なので、サイズを調べる場合は、とにかく一度 removeChild() するのが無難かもしれない。

<br />
<br />



<h3><strong>■クラスは Class クラスのインスタンスオブジェクト</strong></h3>
<pre>
trace(new Sprite() is Sprite); // true
trace(Sprite is Class);        // true
trace(Sprite is Sprite);       // false
trace(Class is Class);         // true
</pre>
定義されたクラスのコンストラクタ関数と constructor は別物。<br />
object.constructor は Class から生成されたインスタンスへの参照であって関数ではない。
<pre>
trace(new Object().constructor == Object); // true
trace(Object is Class);                    // true
trace(Object is Function);                 // false
</pre>
コンストラクタ関数を参照する方法は、真っ当な方法では、おそらく以下の方法しかないかと。
<pre>
class ExampleClass
{
    public var constructorMethod:Function;
    
    public function ExampleClass()
    {
        constructorMethod = arguments.callee;
    }
}
</pre>
ただしコンストラクタ関数からインスタンスを生成することはできない。<br />
コンストラクタ関数が MethodClosure インスタンスであるため。<br />
MethodClosure については次項。
<br />
<br />


<h3><strong>■MethodClosure extends Function</strong></h3>
Function クラスは final class なので、継承はできない。<br />
が、定義されたクラスメソッドのコンストラクタは Function を継承した MethodClosure クラス。<br />
ちなみに関数が MethodClosure か判別する方法は以下。<br />
<pre>
function isMethodClosure(func:Function):Boolean
{
    return func is 
        Object(arguments.callee).constructor;
}

var test1:Function = function():void {}
function test2():void {}

trace( isMethodClosure(test1) );     // false
trace( isMethodClosure(test2) );     // true
</pre>
<br />


<h3><strong>■クラス内での prototype の使用</strong></h3>
<pre>
package
{
public class PrototypeClass
{
    public function PrototypeClass()
    {
        prototype.property = "property of prototype";
    }
    
    prototype.property = null;
    
    prototype.methodProperty = function():void
    {
        trace("call methodProperty");
    }
}
}
</pre>
<pre>
var instance:PrototypeClass = new PrototypeClass();
Object(instance).methodProperty(); // call methodProperty
trace(instance["property"]);       // property of prototype
</pre>
使い道が見当たらない。
<br />
<br />


<h3><strong>■マウスイベントをまとめて無効にする</strong></h3>
<pre>
stage.mouseChildren = false;
</pre>
先日Progressionセミナー後の懇親会で教えてもらった。
<br />
<br />


<h3><strong>■Vector の型指定</strong></h3>

<pre>
var vector:Vector.&lt;Object&gt; = new Vector.&lt;Object&gt;();
trace(getQualifiedClassName(vector));
// output : __AS3__.vec::Vector.&lt;Object&gt;
</pre>

<pre>
var vector:Vector.&lt;*&gt; = new Vector.&lt;*&gt;();
trace(getQualifiedClassName(vector));
// output : __AS3__.vec::Vector.&lt;*&gt;
</pre>

<pre>
var vector:Vector.&lt;*&gt; = new Vector.&lt;Object&gt;();
trace(getQualifiedClassName(vector));
// output : __AS3__.vec::Vector.&lt;Object&gt;
</pre>

<pre>
var vector:Vector.&lt;*&gt; = new Vector.&lt;String&gt;();
trace(getQualifiedClassName(vector));
// output : __AS3__.vec::Vector.&lt;String&gt;
</pre>

<pre>
var vector:Vector.&lt;*&gt; = new Vector.&lt;int&gt;();
// TypeError: Error #1034: 強制型変換に失敗しました。
   Vector.&lt;int&gt;@1683e41 を __AS3__.vec.Vector.&lt;*&gt; に変換できません。
</pre>

上記のように、型の指定には変数等に使用するときと同様に、 * （アスタリスク）を使うことができるが、
なぜか Number, int, uint の数値型を指定した Vector オブジェクトを代入しようとすると失敗する。
<br />
<br />
<pre>
trace(new Vector.&lt;Object&gt;() is Vector);          // false
trace(new Vector.&lt;Object&gt;() is Vector.&lt;Object&gt;); // true
trace(new Vector.&lt;Sprite&gt;() is Vector.&lt;Object&gt;); // false
trace(new Vector.&lt;Sprite&gt;() is Vector.&lt;*&gt;);      // true
trace(new Vector.&lt;String&gt;() is Vector.&lt;*&gt;);      // true
trace(new Vector.&lt;int&gt;() is Vector.&lt;*&gt;);         // false
</pre>
こういうもんなんだろうか。<br />
<br />
上記に反して、以下はキャストしてから引数に入れないとエラーが発生する。<br />
以下のコードはエラーが出る例。
<pre>
var vector:Vector.&lt;Object&gt; = new Vector.&lt;Object&gt;();
test(vector);

function test(vector:Vector.&lt;*&gt;):void {}
</pre>
<br />
<pre>
var sprites:Vector.&lt;Sprite&gt; = Vector.&lt;Sprite&gt;([new Sprite()]);
var display1:Vector.&lt;DisplayObject&gt; = Vector.&lt;DisplayObject&gt;(sprites);
var display2:Vector.&lt;DisplayObject&gt; = sprites;
</pre>
上記は display1 ではキャスト成功するが、display2 のようにそのまま代入しようとするとエラーが出る。
<br />
<br />


<h3><strong>■Vector は Array とは違う</strong></h3>
Vector は Array と似ているが、Array とは全く別物なので、以下のようなことは出来ない。
<br />
<pre>
function test(...args:Vector.&lt;*&gt;):void {}
</pre>
Error: ...残りパラメータ定義のキーワードの後に指定したパラメータで使用できるのは、Array データ型のみです。
<br />
<br />
<pre>
func.apply(null, Vector.&lt;int&gt;([1,2,3]));
</pre>
TypeError: Error #1116: Function.prototype.apply の 2 番目の引数は配列でなければなりません。
<br />
<br />
<pre>
var matrix:Vector.&lt;Number&gt; = 
    Vector.&lt;Number&gt;(String("10000010000010000010").split(""));
new ColorMatrixFilter(matrix);
</pre>
Error: 型 __AS3__.vec:Vector.&lt;Number&gt; の値が、関連しない型 Array に暗黙で型変換されています。
<br />
<br />
<br />



<h3><strong>■Vectorオブジェクトの動的生成</strong></h3>
動的に Vector オブジェクトを作成したい場合、下記のように変数からではエラーが出て失敗する。
<pre>
var theClass:Class = Sprite;
var vector:Vector.&lt;theClass&gt; = new Vector.&lt;theClass&gt;();
</pre>
一度文字列にして作成するとうまくいく。
<pre>
var T:Class = Sprite;
var classPath:String = getQualifiedClassName(T).replace("::", ".");
var theClass:Class = getDefinitionByName("Vector.&lt;" + classPath + "&gt;") as Class;
trace( getQualifiedClassName(new theClass()) );
// output : __AS3__.vec::Vector.&lt;flash.display::Sprite&gt;
</pre>
<br />


]]>
        
    </content>
</entry>

<entry>
    <title>[as3] 3 次ベジェ曲線を curveTo() を使って描く</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2008/10/post_200810210.html" />
    <id>tag:blog.seyself.com,2008://7.518</id>

    <published>2008-10-20T15:22:18Z</published>
    <updated>2008-10-20T15:57:48Z</updated>

    <summary>小さいと分かり難いんですが、赤線が curveTo で引いた線。青線が line...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="as3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[小さいと分かり難いんですが、赤線が curveTo で引いた線。青線が lineTo で20分割して描いてる線。<br />
curveTo の分割数は曲線の形によって変化しています。<br />
少ないときで 1 本。多くて 8 本くらいです。<br />
<br />
<script langage="javascript">
var so = new SWFObject("http://blog.seyself.com/2008/10/21/bezier.swf", "bezier", 500, 360, "9" );
so.addParam('wmode', 'opaque');
so.addParam('allowScriptAccess', 'sameDomain');
document.write(so.getSWFHTML());
</script>
<br />
なんだか、やたら長くなってしまった。<br />
最初は曲線の角度から分割しようと思ってたけど、どうやって割り出せばいいかよくわからず、結局こんなことになってしまった。<br />
一応これだと、どんだけひねっても、ほとんどずれないです。<br />
<br />
それにしても、もうちょっとやりようはありそうなもんだけども。<br />
とりあえず僕の低い学力では、今はここまで。<br />
<br />
<pre>
function bezierCurve(
        ax:Number, ay:Number, 
        bx:Number, by:Number, 
        cx:Number, cy:Number, 
        dx:Number, dy:Number, n:Number, t:Number):void
{
    var t1:Number = n + (t - n) * 0.5;
    var t2:Number = n + (t - n) * 0.25;
    var ax2:Number = cubicBezier(ax, bx, cx, dx, n);
    var ay2:Number = cubicBezier(ay, by, cy, dy, n);
    var dx2:Number = cubicBezier(ax, bx, cx, dx, t);
    var dy2:Number = cubicBezier(ay, by, cy, dy, t);
    
    var px:Number = cubicBezier(ax, bx, cx, dx, t1);
    var py:Number = cubicBezier(ay, by, cy, dy, t1);
    var rx:Number = getControl(ax2, px, dx2);
    var ry:Number = getControl(ay2, py, dy2);
    var qx:Number = quadraticBezier(ax2, rx, dx2, 0.25);
    var qy:Number = quadraticBezier(ay2, ry, dy2, 0.25);
    var px2:Number = cubicBezier(ax, bx, cx, dx, t2);
    var py2:Number = cubicBezier(ay, by, cy, dy, t2);
    
    if (checkPosition(qx-px2, qy-py2, 0.5))
    {
        curveTo(rx, ry, dx2, dy2);
    }
    else
    {
        bezierCurve(ax, ay, bx, by, cx, cy, dx, dy, n, t1);
        bezierCurve(ax, ay, bx, by, cx, cy, dx, dy, t1, t);
    }
}
</pre>
<br />
ベジェ曲線のそれぞれの計算は以下。<br />
<br />
<pre>
//曲線が許容範囲内に収まってるかチェック
function checkPosition(x:Number, y:Number, d:Number):Boolean
{
    return (Math.abs(x) < d && Math.abs(y) < d);
}

//2次ベジェ曲線の通過点からコントロールポイントを得る
function getControl(
        a:Number, b:Number, c:Number):Number
{
    return (b * 4 - a - c) * 0.5;
}

//2次ベジェ曲線の任意の点を取得
function quadraticBezier(
        a:Number, b:Number, c:Number, t:Number):Number
{
    var s:Number = 1 - t;
    return s * s * a + 2 * s * t * b + t * t * c;
}

//3次ベジェ曲線の任意の点を取得
function cubicBezier(
        a:Number, b:Number, c:Number, d:Number, t:Number):Number
{
    var s:Number = 1 - t;
    return s * s * s * a 
        + 3 * s * s * t * b 
        + 3 * s * t * t * c 
        + t * t * t * d;
}
</pre>
<br />
<br />
やっぱりソースが長い。<br />
無駄に計算してる感が否めないので、<br />
せめてこの半分くらいにはしたい。<br />
<br />]]>
        
    </content>
</entry>

<entry>
    <title>[as3] Player のバージョンによって Array と Vector を使い分ける</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2008/10/post_2008101712.html" />
    <id>tag:blog.seyself.com,2008://7.517</id>

    <published>2008-10-17T03:35:06Z</published>
    <updated>2008-10-17T03:50:33Z</updated>

    <summary>FlashPlayer の 10 が正式リリースされたけども 今のところ、一番厄...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="as3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[FlashPlayer の 10 が正式リリースされたけども<br />
今のところ、一番厄介なのは、おそらく Vector クラスの使用じゃないかと思うわけです。<br />
<br />
バージョン 9 でも AS3 は使っているわけですが、9 には Vector クラスは対応していないので、
10 対応で作成したクラスを 9 でも使用したくなったときに、Vector クラスはかなりネックになってしまうんじゃないかと思うわけです。<br />
<br />
クライアントから古いバージョンを指定されることはよくあることだと思います。<br />
<br />
で、こんな風にすると、一応 Vector と Array をプレイヤーの状況によって使い分けれるんじゃないかなあ
と、思ってみたわけです。<br />
<br />
<pre>
function getArrayOrVector(T:Class):Class
{
    var theClass:Class;
    try 
    {
        var classPath:String = getQualifiedClassName(T);
        classPath = classPath.replace("::", ".");
        theClass = getDefinitionByName
            ("Vector.&lt;" + classPath + "&gt;") as Class;
    }
    catch (error:Error)
    {
        theClass = Array;
    }
    
    return theClass;
}

var theClass:Class = getArrayOrVector(int);
var a:Object = new theClass();
trace(getQualifiedClassName(a));
</pre>
<br />
これだと、FlashPlayer のバージョンが 9 の場合は<br />
<pre>
Array
</pre>
と出力され、バージョンが 10 だと
<pre>
__AS3__.vec::Vector.&lt;int&gt;
</pre>
と出力されます。<br />
<br />
ただ、これだと変数の型指定は Object になっちゃうので、<br />
実際どれほどの効果があるのかは謎です。<br />
誰か検証してくれないかなあ。<br />
<br />
]]>
        
    </content>
</entry>

<entry>
    <title>[FlashDevelop] FlashDevelop3 beta9 で Shader クラスのコードヒントを表示する</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2008/10/post_2008101518.html" />
    <id>tag:blog.seyself.com,2008://7.516</id>

    <published>2008-10-15T09:36:12Z</published>
    <updated>2008-11-21T02:10:52Z</updated>

    <summary>追記 ---- この記事の内容より有効な方法がタロタローグ ブログさんで掲載され...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="FlashDevelop" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[<strong>追記 ----</strong><br />
<strong>この記事の内容より有効な方法がタロタローグ ブログさんで掲載されています。</strong><br />
<strong><a href="http://blog.tarotaro.org/archives/358">FlashDevelopでFlash Player 10用のswfファイルを作成する方法(最短2秒)</strong></a>
<br />
＜補足＞<br />
playerglobal.swc ファイルは FlexSDK だと
<pre>flex_sdk_3/frameworks/libs/player/10</pre>
に入ってます。<br />
---- 追記（ここまで）<br />
<br />
<br />
たぶんだけど現状では Vector クラスのコードヒントは使えるけど、その他のFP10で実装されたクラスやメソッドが使えない。<br />
<br />
FlashDevelop は Library ディレクトリ内にクラス定義がされてるんだけども<br />
ここに新しいクラス群が追加されていないためだと思う。<br />
<br />
なので、Shader クラスや Graphics.beginShaderFill() メソッドでもコードヒントが出るように、定義ファイルを作ってみました。<br />
<br />
もしかしたら、すでに誰か作ってるかもしれませんがアップしときます。<br />
<a href="http://blog.seyself.com/2008/10/15/AS3_for_FlashDevelop.zip">AS3_for_FlashDevelop.zip</a><br />
<br />
ダウンロードして解凍すると、中に"intrinsic"というディレクトリが入っているので、それを<br />
FlashDevelop のインストールされているディレクトリ、<br />
<pre>
Program Files\FlashDevelop\Library\AS3\
</pre>
の中の同名のディレクトリに上書きするとコードヒントが使えるようになります。<br />
import とかも補完されます。<br />
<br />
<br />
<strong>内容</strong><br />
<strong>display</strong><br />
<ul>
<li>ColorCorrection</li>
<li>ColorCorrectionSupport</li>
<li>Graphics</li>
<li>GraphicsBitmapFill</li>
<li>GraphicsEndFill</li>
<li>GraphicsGradientFill</li>
<li>GraphicsPath</li>
<li>GraphicsPathCommand</li>
<li>GraphicsPathWinding</li>
<li>GraphicsShaderFill</li>
<li>GraphicsSolidFill</li>
<li>GraphicsStroke</li>
<li>GraphicsTrianglePath</li>
<li>IGraphicsData</li>
<li>IGraphicsFill</li>
<li>IGraphicsPath</li>
<li>IGraphicsStroke</li>
<li>Shader</li>
<li>ShaderData</li>
<li>ShaderInput</li>
<li>ShaderJob</li>
<li>ShaderParameter</li>
<li>ShaderParameterType</li>
<li>ShaderPrecision</li>
<li>TriangleCulling</li>
</ul>
<br />
<strong>events</strong><br />
<ul>
<li>ShaderEvent</li>
</ul>
<br />
<strong>filters</strong><br />
<ul>
<li>ShaderFilter</li>
</ul>
<br />
<strong>---追記（2008.10.17）---</strong><br />
<strong>desktop</strong><br />
<ul>
<li>Clipboard</li>
<li>ClipboardFormats</li>
<li>ClipboardTransferMode</li>
</ul>
<br />
<strong>net</strong><br />
<ul>
<li>FileReference</li>
</ul>
<br />
<br />
<a href="http://help.adobe.com/en_US/AS3LCR/Flash_10.0/index.html">ASDoc</a> を参考に、おもいっきり手作業で作ってますので、なんか間違ってるとことかあったらすいません。<br />
ご利用はあくまで自己責任でお願いします。<br />
<br />
きっと、近いうちにFlashDevelop 自体、アップデートされるでしょうから<br />
それまでの気休めぐらいに使っていただければと思います。<br />
<br />
<br />

]]>
        
    </content>
</entry>

<entry>
    <title>[AIR][FlashDevelop] application.xml の namespace の指定</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2008/10/post_2008100916.html" />
    <id>tag:blog.seyself.com,2008://7.515</id>

    <published>2008-10-09T07:48:21Z</published>
    <updated>2008-10-09T08:13:37Z</updated>

    <summary>エラーの意味が分からず四苦八苦してしまったのでメモ。 FlashDevelop ...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="AIR" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="FlashDevelop" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[エラーの意味が分からず四苦八苦してしまったのでメモ。<br />
<br />
FlashDevelop + FlexSDK で AIR を作成する際、<br />
<pre>
<strong>error while loading initial content</strong>
</pre>
<br />
というエラーが出たときは、 <strong>application.xml</strong> 内の以下を確認する。（デフォルトでは2行目）<br />
<br />
<pre>
&lt;application xmlns="<strong>http://ns.adobe.com/air/application/1.0</strong>"&gt;
</pre>
<br />
ここで指定する URL は AIR（adl.exe）のバージョンによって異なる。<br />
adl.exe のバージョンは Windows XP だと adl.exe を右クリックして<br />
「プロパティ」→「バージョン情報」<br />
で確認できる。<br />
<br />
<img src="http://blog.seyself.com/2008/10/09/1223539319171_l96mxu1o.png" border="0" width="474" height="466" /><br />
<br />
今回の場合は 1.5 が入っていたので<br />
<pre>
&lt;application xmlns="<strong>http://ns.adobe.com/air/application/1.5</strong>"&gt;
</pre>
にすることで正常に書き出された。<br />
<br />
ちなみに、この XML ファイルのテンプレートは  (FlexSDK)/templates/air に入ってる。<br />
<br />
]]>
        
    </content>
</entry>

<entry>
    <title>[Progression][as3] Progression でビデオ管理</title>
    <link rel="alternate" type="text/html" href="http://blog.seyself.com/2008/10/post_2008100715.html" />
    <id>tag:blog.seyself.com,2008://7.514</id>

    <published>2008-10-07T06:15:00Z</published>
    <updated>2008-10-07T06:32:53Z</updated>

    <summary>まずはデモから。 デモ Progression ではURLを指定してシーンを変更...</summary>
    <author>
        <name>michi</name>
        
    </author>
    
        <category term="Progression" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="as3" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://blog.seyself.com/">
        <![CDATA[まずはデモから。<br />
<br />
<a href="http://blog.seyself.com/2008/10/07/index.html">デモ</a><br />
<br />
Progression ではURLを指定してシーンを変更できるので、
Flash はビデオプレイヤーのみを実装しておいて、
あとは URL でビデオの再生位置や flv のパスを指定してやる。
ってこともありだと思った。<br />
<br />
デモの FLV はキューポイントを3箇所設定している。
で、onCuePoint のイベントを受け取ってシーンを変更すれば
ブラウザの「戻る」「進む」で再生位置を変更するとかもできる。<br />
何気にタイトルも変えてみたり。<br />
<br />
デモでは一応Flash内にボタンを設置しているけど、
これも場合によってはなくてもいい。<br />
<br />
今回はキューポイントの指定だけども、URLで 直接時間指定することもできる。<br />
<br />
要は SceneObject で URL の変化が受け取れるわけだから<br />
これにあわせていろんなことができますね。って話。<br />
<br />
<br />
<strong>--- 追記</strong><br />
直接 #page3 とかに飛ぶとビデオが読み込めてなくて、<br />
最初から再生になってますが、デモだから。という言い訳。<br />
<br />
]]>
        
    </content>
</entry>

</feed>
