<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog.alumican.net &#187; ActionScript2.0</title>
	<atom:link href="http://blog.alumican.net/tag/actionscript20/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.alumican.net</link>
	<description>日々の記憶と記録とActionScript とその周辺</description>
	<lastBuildDate>Tue, 20 Jul 2010 16:21:59 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[AS2] Delegate.create()の戻り値でハマる</title>
		<link>http://blog.alumican.net/2009/01/28_203938</link>
		<comments>http://blog.alumican.net/2009/01/28_203938#comments</comments>
		<pubDate>Wed, 28 Jan 2009 11:39:38 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript2.0]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=167</guid>
		<description><![CDATA[AS2のthisはすぐに迷子になる。
trace("此処は"+this+"です"); //此処は_level_0です
button.onRelease = Delegate.create(this, function() [...]]]></description>
			<content:encoded><![CDATA[<p>AS2のthisはすぐに迷子になる。</p>
<pre><code>trace("此処は"+this+"です"); //此処は_level_0です
button.onRelease = Delegate.create(this, function():Void {
    trace("此処は"+this+"です"); //此処はbuttonです
});</code></pre>
<p>Delegateを使えば、スコープがbuttonの中に入るのを防ぐことができる。</p>
<pre><code>trace("此処は"+this+"です"); //此処は_level_0です
button.onRelease = Delegate.create(this, function():Void {
    trace("此処は"+this+"です"); //此処は_level0です
});</code></pre>
<p>Delegateのおかげでthisが迷子になることがない。</p>
<p>ちなみに僕はAS2でコーディングするときにはDelegateを鬼のように使う。「でぇ」で「Delegate.create(this, function():Void {});」を辞書登録してるくらいだから相当だと思う。今回はそのDelegateでちょっとだけハマったので書いておく。<br />
<span id="more-167"></span><br />
経緯としてはEventDispatcherを使っていて、まずインスタンスメソッドを直接addEventListenerした。</p>
<pre><code>hoge.addEventListener("event", Delegate.create(this, func));</code></pre>
<p>同様に、Delegateを使って同じメソッドをremoveEventListenerしようとしたのだが何故かできなかった。</p>
<pre><code>hoge.removeEventListener("event", Delegate.create(this, func));</code></pre>
<p>そこでDelegate.createの実装を見てみると、新たに宣言したfという関数を返している事が分かった。細かい実装は気にしない。目を瞑ればそこはカプセル化。</p>
<pre><code>static function create(obj:Object, func:Function):Function {
    var f = function() {
        var target = arguments.callee.target;
        var func = arguments.callee.func;
        return func.apply(target, arguments);
    };
    f.target = obj;
    f.func = func;
    return f;
}</code></pre>
<p>つまり、インスタンスメソッドfuncとDelegate後の関数Delegate.create(this, func)とでは参照先が違っているということだ、多分。</p>
<pre><code>trace(Delegate.create(this, func) == func);
//false</code></pre>
<p>当然こういう事にもなる。</p>
<pre><code>trace(Delegate.create(this, func) == Delegate.create(this, func));
//false</code></pre>
<p>addEventListenerした関数とremoveEventListenerした関数の指すモノが違っているので正しくremoveEventListenerできていなかった。そこで、イベントリスナオブジェクトを介すことでaddEventListenerしたリスナをremoveEventListenerすることができた。</p>
<pre><code>//イベントリスナの生成
var listener:Object = new Object();
//イベントリスナに関数を設定する
listener.func = Delegate.create(this, func);
//イベントリスナを登録するときはこう
addEventListener("event", listener);
//イベントリスナを削除するときはこう
removeEventListener("event", listener);</code></pre>
<p>変数をふやすのが面倒でlistenerを使っていなかったし、脊髄反射でDelegateを使っていたので気をつけよう。</p>
<p>ちなみにAS3では何もしなくてもthisスコープは移動しないので便利。<br />
あと、メソッドと関数の使い分けは適当なので突っ込まないでね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/01/28_203938/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AS2] ライブラリに無いMovieClipのサブクラスをattachMovie</title>
		<link>http://blog.alumican.net/2009/01/27_161414</link>
		<comments>http://blog.alumican.net/2009/01/27_161414#comments</comments>
		<pubDate>Tue, 27 Jan 2009 07:14:14 +0000</pubDate>
		<dc:creator>alumican</dc:creator>
				<category><![CDATA[DEVELOPMENT]]></category>
		<category><![CDATA[ActionScript2.0]]></category>

		<guid isPermaLink="false">http://blog.alumican.net/?p=105</guid>
		<description><![CDATA[すぐ忘れてしまうので書いておく。

AS2でMovieClipを継承したSubClassをステージ上に表示したいときがある。AS3では
addChild(new SubClass());
AS2ではライブラリに空のMov [...]]]></description>
			<content:encoded><![CDATA[<p>すぐ忘れてしまうので書いておく。<br />
<span id="more-105"></span><br />
AS2でMovieClipを継承したSubClassをステージ上に表示したいときがある。AS3では</p>
<pre><code>addChild(new SubClass());</code></pre>
<p>AS2ではライブラリに空のMovieClipシンボルを登録して、シンボルのリンケージからSubClassに関連づけをおこなってattachMovieすればいい。</p>
<pre><code>attachMovie("SubClass", "subclass", 0);</code></pre>
<p>が、わざわざ空のMovieClipを作ってリンケージするのは気持ち悪いので、こうする。<br />
このときSubClassに関連づけられたシンボルはライブラリに存在しなくてもよい。</p>
<pre><code>/**
 * MovieClipのサブクラス
 */
class SubClass extends MovieClip {

    //クラスを登録する
    static var SymbolName:String = "__Packages.SubClass";
    static var SymbolOwner:Function = SubClass;
    static var SymbolLinked:Boolean = Object.registerClass(SymbolName, SymbolOwner);

    public function SubClass() {
        _x = _y = 150;
        beginFill(0x000000, 100);
        moveTo(-50, -50);
        lineTo( 50, -50);
        lineTo( 50,  50);
        lineTo(-50,  50);
        lineTo(-50,  50);
        endFill();
        onEnterFrame = function():Void {
            _rotation += 5;
        }
    }
}

/**
 * 呼び出し側の記述
 */
attachMovie(SubClass.SymbolName, "subclass", 0);</code></pre>
<p><a href="/wp-content/uploads/2009/01/attachsubclass.swf" rel="shadowbox;height=300;width=300">実行結果</a></p>
<p>無事にattachMovieすることができた。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.alumican.net/2009/01/27_161414/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
