<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>左脳Script</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/" />
    <link rel="self" type="application/atom+xml" href="http://n-yagi.0r2.net/script/atom.xml" />
    <id>tag:n-yagi.0r2.net,2009-04-07:/script//1</id>
    <updated>2010-08-31T00:41:54Z</updated>
    <subtitle>「Action Script 3」や「Java Script」での開発、「Movable Type」モロモロの、記憶から漏れ落ちそうな、アンなコトやコンなコトを書き留めるサイト
</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.25</generator>

<entry>
    <title>もチャット作成日誌：2010年7月11日～12日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/201071112.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.371</id>

    <published>2010-08-30T11:57:28Z</published>
    <updated>2010-08-31T00:41:54Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="アイコンボタン" label="アイコンボタン" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="マップエディタ" label="マップエディタ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class="headline">2010年7月11日</h3>
<ul>
<li>アンドゥ＆リドゥ機能コーディング。<br>
→未テスト＆未デバグ。<br>
<br>
</li>
<li>アンドゥ、リドゥ、一時保存、一時読み出し、エクスポート、のボタンアイコン作成。<br>
<br>
</il>
</ul>
思ったより作業が進まなかった・・・orz<br>
<br>
<br>


<h3 class="headline">2010年7月12日</h3>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="popupBtns.PNG" src="http://n-yagi.0r2.net/script/2010/08/29/popupBtns.PNG" width="200" height="200" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<br><br><br>
ボタンアイコンの整理。ポップアップのようにボタンが出る仕掛けにし、画面をすっきりさせた。<br>
<br>
レイヤ編集ボタンにマウスカーソルを合わせると、レイヤの透明度を設定できるボタンが表示される。<br>
<br clear="both">
<br>
<ul>
<li>アンドゥ、リドゥ、一時保存、一時読み出し、を事前にコーディングしたものと関連付け、
ようやくデバグ＆動作確認開始。<br>
→ひとまず、動作を確認できた。破綻もなく動いているようだ。<br>
<br>
</li>
<li>結局全ての操作ボタンをアイコンから作った。<br>
<ul>
<li>FlexコンポーネントでU/Iを作ると、キーボードフォーカスの管理が面倒になる。</li>
<li>一部ボタンを作り始めてしまったが、操作体系から言って統一感があるほうが馴染み易い。</li>
</ul>
というもっともらしい理由により、操作を全てアイコンボタン化した。<br>
<br>
</li>
</ul>
<br>
<br>
やっとの事で、本腰を入れてマップの作成に着手できる・・・カナ？！<br>
ひとまず、初期ログイン地点のひとつとして想定している「森の泉」っぽいものを作ってみる。<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="1st_edit.PNG" src="http://n-yagi.0r2.net/script/2010/08/29/1st_edit.PNG" width="640" height="512" class="mt-image-none" style="" /></span>
<br>
泉しにちゃデカイとかキニシナイ！<br>
<br>
エディットを始めて気づいたこともあるので、それらに一つずつ対処して行こう。<br>
<ul>
<li>マップチップでのフィル（塗りつぶし、矩形領域描画）が無い。イキナリ大きめのマップで当たりをつけるような作り方が出来ない。</li>
<li>コピー＆ペーストが無い。</li>
<li>当たり判定の試験で解ったが、チップの移動方向抑制は出る向きだけではなく、入る向きも判定したほうがマップを作る時に楽。</li>
<li>レイヤの透明度を指定できるが、上層レイヤのマップチップ描画状態によっては、透明度が反映されない。
それぞれのレイヤに描画した後のレイヤの透明度を設定している為、今の時点では構造上仕方ないとも言えなくも無い。
が、エディットするには実は中途半端な機能で、不便である。
</li>
</ul>
それでも、これだけのマップが作れるので、なんとかならなくも無いのだが。<br>
当たり判定は、ゲームのシステムにも関わるので、早急に対処したいところ。<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>Object と キャスト</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/object.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.372</id>

    <published>2010-08-29T06:01:03Z</published>
    <updated>2010-08-29T07:00:04Z</updated>

    <summary>AVM（Action Script 仮想マシン）上で動くオリジナル仮想マシンを作る場合、変数を何らかの配列なりに格納する必要があります。 そこで変数をなんらかの配列で管理しようという事になる訳です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="Action Script" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="array" label="Array" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vector" label="Vector" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="キャスト" label="キャスト" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[AVM（Action Script 仮想マシン）上で動くオリジナル仮想マシンを作る場合、変数を何らかの配列なりに格納する必要があります。<br>
<br>
そこで変数をなんらかの配列で管理しようという事になる訳です。
<ul>
<li>Object：連想記憶配列。すべてを名前で管理できるので、とてもとても楽。VMを作るのは。</li>
<li>Array：つまるところ、添え字に整数を使うことを前提とした、便利メソッドが追加された Object クラス。特に速度が優れているとかは無い。ハズ。</li>
<li>Vector：添え字を整数に限定、格納するデータの型を予め設定し変更できない、という制約が在るが、この制約の為に、上記２つのクラスより早い。
沢山の要素にアクセスしなければならない用途を想定しているようだ。</li>
</ul>
<br>
Vector が整数インデックスで早いのは判りますが、要素の型を指定するのは、具体的にどんな影響があるのでしょうか。<br>
<br>]]>
        <![CDATA[<br>
<h3 class="headline">いきなりベンチマーク</h3>
検証コード。<br>
<div class="PreTag"><pre><code>
{
    var ary:Vector.&lt;Object&gt; = new Vector.&lt;Object&gt;();
    var aryi:Vector.&lt;int&gt; = new Vector.&lt;int&gt;();
    var aryn:Vector.&lt;Number&gt; = new Vector.&lt;Number&gt;();
    var aryx:Vector.&lt;*&gt; = new Vector.&lt;*&gt;();
    var i:int;
    for (i = 0; i &lt; 100000; i++)
    {
        ary.push(i);
        aryi.push(i);
        aryn.push(i);
        aryx.push(i);
    }

    function test0():void 
    {
        var sum:Number = 0;
        for (var i:int = 0; i &lt; 100000; i++)
        {
            sum = sum + ary[i];
        }
    }
    function test1():void 
    {
        var sum:Number = 0;
        for (var i:int = 0; i &lt; 100000; i++)
        {
            sum = sum + aryn[i];
        }
    }
    function test2():void 
    {
        var sum:Number = 0;
        for (var i:int = 0; i &lt; 100000; i++)
        {
            sum = sum + Number(ary[i]);
        }
    }
    function test3():void 
    {
        var sum:Number = 0;
        for (var i:int = 0; i &lt; 100000; i++)
        {
            sum = sum + aryi[i];
        }
    }
    function test4():void 
    {
        var sum:int = 0;
        for (var i:int = 0; i &lt; 100000; i++)
        {
            sum = sum + int(ary[i]);
        }
    }
    function test5():void 
    {
        var sum:Number = 0;
        for (var i:int = 0; i &lt; 100000; i++)
        {
            sum = sum + (ary[i] as Number);
        }
    }
    function test6():void 
    {
        var sum:Number = 0;
        for (var i:int = 0; i &lt; 100000; i++)
        {
            sum = sum + aryx[i];
        }
    }

    trace(getTerm(test0));
    trace(getTerm(test1));
    trace(getTerm(test2));
    trace(getTerm(test3));
    trace(getTerm(test4));
    trace(getTerm(test5));
    trace(getTerm(test6));
}

public static function getTerm(f:Function):Number 
{
    var av:Number = 0;
    for (var i:int = 0; i &lt; 10; i++)
    {
        var st:int = getTimer();
        f();
        var tim:int = getTimer() - st;
        av += tim;
    }
    return  av / 10;
}
</code></pre></div>
<br>
私の環境では、以下のような結果になりました。絶対値はあくまで目安です。
<div class="PreTag"><pre><code>
60.3
21.7
21.5
21.1
21.3
69.7
59
</code></pre></div>
<br>
<br>
<ul>
<li>一番上の「<code>sum = sum + ary[i];</code>」は要素の型をキャストしていないので、演算実行時に型の評価を行っているようです。特に"+"演算子は、数値の加算の他に、文字列の連結も可能ですので、要素となる Object が具体的にどんな型なのか真面目にチェックしなければなりません。そのため、キャストを使わない場合に比べ、３倍程度の時間がかかっています。<br>
<br>
"+" が駄目なら、と"-"に変更したところ、コンパイルの段階で型のエラーが出ました。"+"演算子で試験した事自体あまり良くなかったようです。他の演算子では、Object から明示的なキャストが必須です。<br>
<br>
</li>
<li><span style="color:#990000"><strong>Vector で要素の型を指定するパターン</strong></span>と、<span style="color:#000099"><strong>要素の型を Object のまま、演算時にキャストするパターン</strong></span>で、あまりに差がありません。また、int と Number の差は、この検証コードでは測れないほど微小？なようです。<br>
<br>
</li>
<li>「as」でキャストするパターンが実は最も重く、型変換できなかった時の処理、と言うより型変換ができるかどうかの判別に処理が割かれているようです。最後の「要素の型に ＊ を使う」パターンも、処理自体は Object と同じ程度の時間がかかっています。<br>
</li>
<br>
<br>

<h3 class="headline">個人的結論</h3>
変数の管理は「<code>Vector.&lt;Object&gt;</code>」で、実用レベルと判断しました。<br>
<ul>
<li>要素の型を Object にし、演算時にキャストするのが最も簡単なようだ。</li>
<li>キャストに「as」は使うな。</li>
</ul>
<br>
要素の型をがっちり決めても、AVM 上で動く VM の仕組みを想定すると、労力に見合わない無駄な手間となってしまうでしょう。<br>
<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年7月10日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/2010710.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.370</id>

    <published>2010-08-29T01:42:23Z</published>
    <updated>2010-08-29T02:14:49Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="amf" label="AMF" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sharedobject" label="SharedObject" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ファイル保存場所" label="ファイル保存場所" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="マップエディタ" label="マップエディタ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class="headline">2010年7月10日</h3>
<ul>
<li>マップエディットの場合に限り、別の方法でデータの管理を行う形にした。こういう時に、クラスの継承は便利である。<br>
本来マップチップオブジェクトが保持しない、チップID（どのファイルの、どの位置にある画像データをチップとして扱うか、またチップの移動判定を文字列で管理。）の詳細を保持するようにした。<br>
<br>
</li>
<li>マップチップパレットで設定した「当たり判定」「移動可能方向」「表示状態」を SharedObject に保存する形にした。
作業のモードを変更する際に、いちいち保存するので、ユーザーはそれほど、設定の保存を意識しなくてもよい。<br>
→いずれは、アプリケーション設定のファイルに書き出す形式にしたい。<br>
<br>
</li>
<li>編集したマップデータを、asソースコード の Object 記述形式で出力出来るようになった。<br>
しかし、ファイル名は時間をミリ秒まで表した単純なもので、出力ディレクトリはデスクトップ固定。<br>
そして、この書き出したデータはエディタで再利用できない。ソースコードにマージして、マップをハードコーディングする形となる。<br>
→マップチップの設定と、編集中のマップデータをマップエディタプロジェクトファイルとして
書き出せるようにしたい。<br>
<br>
</li>
</ul>
とにかく、「マップを編集し保存できる」形に、ようやく達した。<br>
正直いうと、今日一日朝から気力が上がらず、やっつけで機能実装した状態になってしまった。
ひとまず動くものが出来たので、ブラッシュアップしていく事にする。<br>
<br>
<br>

<h3><strong><big>データの保存場所</big></strong></h3>
設定を恒常的に扱えるようにする為、SharedObject に保存していたが、データの保存場所が良くわからない。
機能はしているようなので、どこかにデータがあるはずなのだが。<br>

<br>
<br>
「AIR アプリケーションなんだし、ファイル使おうよ」という訳で、ドコにあるか解らないデータを探すのは早々にやめた。
しかし、単純に「データを保存する」という機能に特化しているのか設計の観点から見ると SharedObject は使いやすい。<br>
データ保存のキーのようなものを指定するだけで良いのだ。これがファイルだと、その保存場所から保存時の名称までを入力、
もしくは設定する必要があり、その U/I を作らなければならないと言うことになる。<br>
<br>
作業途中の維持地データの保存なので、保存場所はアプリケーション固有のディレクトリでよい。
ファイル名は「データ保存のキー」（SharedObjectでも使っている）でよい。
と、指定が必要な部分を限定すればどんどん間単になり、最終的に SharedObject と使い勝手のあまり変わらないデータ保存クラスが出来た。<br>
<br>
FileObject.as<br>
<div class="PreTag"><pre><code>
package editor 
{
    import flash.filesystem.File;
    import flash.filesystem.FileMode;
    import flash.filesystem.FileStream;
    /**
     * ...
     * @author 
     */
    public class FileObject
    {
        private var dataObject:Object;
        private var target:File;
        /**
         * 初期化。
         */
        public function FileObject() 
        {
            target = null;
            dataObject = new Object();
        }
        /**
         * 対象のデータを読み込み。
         * @param   index
         */
        public function getLocal(index:String):void 
        {
            target = File.applicationStorageDirectory.resolvePath(index);
            load();
        }
        /**
         * 対象データの実体となるファイルを読み込む。
         */
        private function load():void 
        {
            dataObject = null;
            if (target &amp;&amp; target.exists)
            {
                var fs:FileStream = new FileStream();
                try
                {
                    fs.open(target, FileMode.READ);
                    dataObject = fs.readObject();
                }
                catch (err:Error)
                {
                    dataObject = null;
                }
                finally 
                {
                    fs.close();
                }
            }
            if (!dataObject)    dataObject = new Object();
        }
        /**
         * 読み込んだオブジェクトへの参照。
         */
        public function get data():Object 
        {
            return  target ? dataObject : null;
        }
        /**
         * オブジェクトを書き出す。
         * @return
         */
        public function flush():Boolean 
        {
            if (!target)    return  false;
            //
            var fs:FileStream = new FileStream();
            try
            {
                fs.open(target, FileMode.WRITE);
                fs.writeObject(dataObject);
            }
            catch (err:Error)
            {
                return  false;
            }
            finally 
            {
                fs.close();
            }
            return  true;
        }
    }
}
</code></pre></div>
使い方は簡単だ。AMF 万歳。<br>
SharedObject の使い方を踏襲しているので、SharedObject を使っていた方なら解るはず。<br>
<br>
→<span style="color:#000099"><strong>2010年7月11日追記：</strong></span>保存場所がわかった。WindowsXP では以下のようになった。<br>
<code><b>C:\Documents and Settings\</b>ユーザー名<b>\Application Data\</b>アプリケーション名<b>\Local Store\#SharedObjects\</b>アプリケーションSWF名<b>\</b>データーキー名称<b>.sol</b></code><br>
<br>
さらに言うと、データの保存場所がわかってしまったので、FileObject.as の存在意義が問われ始めている。機能はSharedObjectと同じなので、<strong>ソースを弄れば保存場所を変更できる</strong>程度にしか優位点がなくなってしまった。<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年7月9日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/201079.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.369</id>

    <published>2010-08-19T13:21:17Z</published>
    <updated>2010-08-19T13:24:40Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="マップエディタ" label="マップエディタ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="移動試験モード" label="移動試験モード" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class="headline">2010年7月9日</h3>
昨日実装部分の「チップ属性設定機能」をテスト出来るモードを実装。<br>
キャラクターを直接操作することで、マップの整合性を運用レベル？で確認できる。<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="movetest.PNG" src="http://n-yagi.0r2.net/script/2010/08/19/movetest.PNG" width="640" height="480" class="mt-image-none" style="" /></span><br>
<br>
<br>
動くものを逐一確認しながら作ってきたが、保存で躓く。<br>
<br>
正しくは、実運用には必要のない編集用の中間データと、実運用のデータを切り分けていなかった。
これをきれいに分解管理できないと、マップデータの Export が出来ない。<br>
<br>
機能を維持しつつ構造を変更する必要が出てきた。<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年7月8日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/201078.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.368</id>

    <published>2010-08-18T13:37:43Z</published>
    <updated>2010-08-18T13:43:38Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="マップエディタ" label="マップエディタ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class='headline'>2010年7月8日</h3>
マップエディタへ、マップチップの状態を設定できるU/Iの実装。<br>
チップ毎に、「通り抜けの可、不可」「キャラクタとの重ね描画」「チップ移動判定」の設定が出来る機能の実装。<br>
→上層レイヤのチップに「Low」「Middle」「High」を設ける。Lowは下層レイヤ、Highは上層レイヤに描画する。
Middleは、<a href="http://www.silversecond.com/WolfRPGEditor/" target="_blank">ウディタ</a>のチップ▲指定を実現する。<br>
<br>
<br>
マップチップの状態をマップへ反映するには、マップチップがチップ状態への参照を持つ必要がある。参照先だけを変更すれば、同じチップは全部更新される仕組みだ。<br>
しかし、現在はマップチップそれぞれがチップ状態をuint変数で持っている。物理的にはこちらのほうが、メモリも食わない上に速い。<br>
<br>
マップエディットの時だけ、参照タイプに、ゲーム実行の際には直接型に出来ないだろうか。<br>
→コーディングだけはした。コンパイルも通ったが、物理的なテストはまだ。<br>
<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="icon.PNG" src="http://n-yagi.0r2.net/script/2010/08/18/icon.PNG" width="200" height="200" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<br>
<br>
操作アイコンを作ってしまった・・・<br>
<br clear="both">]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年7月7日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/201077.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.367</id>

    <published>2010-08-17T11:14:41Z</published>
    <updated>2010-08-17T11:18:26Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="マップエディタ" label="マップエディタ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="移動阻止設定" label="移動阻止設定" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class='headline'>2010年7月7日</h3>
マップチップに種別によっては、チップ毎の当たり判定だけでは自然な利用が出来ないものがあった。<br>
高台の角や縁に当たる部分だ。チップの中から別の（移動可能な）チップへの移動を阻止する判定がないと、高さの異なる高台を表現できなくなってしまう。<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="takasa.PNG" src="http://n-yagi.0r2.net/script/2010/08/17/takasa.PNG" width="360" height="256" class="mt-image-none" style="" /></span><br>
<br>
そこで、この当たり判定の機能を実装した。<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="denydir.PNG" src="http://n-yagi.0r2.net/script/2010/08/17/denydir.PNG" width="256" height="160" class="mt-image-none" style="" /></span><br>
チップの辺を跨ぐ際にそれを阻止する判定。と、その設定画面。<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年7月5日～6日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/2010756.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.366</id>

    <published>2010-08-16T09:27:19Z</published>
    <updated>2010-08-16T09:31:43Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="マップエディタ" label="マップエディタ" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class='headline'>2010年7月5日</h3>

オートタイルの親和性を実現する機能の追加。これに伴い、マップチップのシグネチャ表記を変更。<br>
→親和性の設定は、オートタイルを見て手作業で追加している。自動化が出来ると楽だが・・・どうするか。<br>
<br>
エディタのU/IコンポーネントにFlexを利用する事にした。やっとペンの状態を表示する所に着手。<br>
当初の想定より、結構ヘビーな箇所が多い。頑張ろう。<br>
<br>
<br>

<h3 class='headline'>2010年7月6日</h3>
マップチップは、ツクールユーザーでは有名な<a href="http://www.tekepon.net/fsm/" target="_blank">First Seed Material</a>から。<br>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="map_editor.PNG" src="http://n-yagi.0r2.net/script/2010/08/16/map_editor.PNG" width="400" height="400" class="mt-image-none" style="" /></span><br>
<br>
<ul>
<li>Flexの mx.containers.TitleWindow を使い、ペンの状態をサブウィンドウに表示する機能の実装。</li>
<li>マップチップのサブウィンドウ実装。</li>
</ul>
現時点で、下層レイヤだけ、上層レイヤだけ、という編集が出来ない。これはまずい。<br>
<br>
<br>

ボタン追加でアプリケーションとしての機能が充実？してきた。<br>
<ul>
<li>「ドラッグ」「下層編集」「上層編集」ボタンで主だった作業モードを変更できるようになった。</li>
<li>上層の「透明」「半透明」「通常」を切り替えられるようになった。</li>
<li>拡大率「1倍」「2倍」「4倍」の広域表示が出来るようになった。が、「4倍」は重い。</li>
</ul>
<br>
→チップ毎の当たり判定プリセット編集機能。<br>
→作ったマップをテストキャラで歩き回れる（移動テスト）モード。<br>
→作ったマップの保存機能。<br>
後は、これくらいあれば問題ないだろうか。<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年7月3日～4日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/2010734.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.365</id>

    <published>2010-08-15T12:24:12Z</published>
    <updated>2010-08-15T13:55:50Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="オートタイル" label="オートタイル" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="マップチップ" label="マップチップ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="親和性" label="親和性" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class='headline'>2010年7月3日</h3>
マップエディタをAIRで作成することにした。<br>
過去に、HTML+Javascriptで作成したことがあったが、コードが膨大でドキュメンタイズしていなかった（趣味レベルなので仕方なかったorz）ので、とても扱えない。RPGツクール2000系のマップチップ画像を直接扱え、オートタイルの配置にまで対応した結構な大作なのだが・・・おしい。<br>
<br>
→マップチップのクラスを作りこむ。<br>
アニメーション指定で難儀。一度やってるんだがなぁorz<br>
<br>
<br>
マップ表示部分コーディング。ひたすらコーディング。<br>
<br>
<br>
<br>


<h3 class='headline'>2010年7月4日</h3>
マップ表示部分コーディング。ひたすらコーディング。<br>
<ul>
<li>マップチップの情報をテキストで与えられるようにした。データは大きくなるが、エディタで管理しやすくするため。</li>
<li>オートタイルを展開したビットマップを作らずに描画する方法に。</li>
<li>アニメーションチップ、アニメーションタイルの表示を可能に。</li>
<li>マップチップオブジェクト、画像、その他もろもろを明示的に管理＆開放できるようコーディング。
オブジェクトをプールする事で徹底的に使いまわし、GCをなるべく起こさないように対策した（つもり）。</li>
</ul>
<br>
一通り、想定したマップチップの表示が出来るようになったので、マップエディタのU/Iに着手。<br>
<br>
<br>
<ul>
<li><h4>オートタイルとの親和性</h4>
オートタイルとは、「種類の異なる地面を滑らかに繋ぐ境界を描くもの」である。厳密に言うとちょっと違うかもしれないが。<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="auto_tile1.png" src="http://n-yagi.0r2.net/script/2010/08/15/auto_tile1.png" width="384" height="160" class="mt-image-none" style="" /></span><br>
草原～砂地～暗い砂地～暗い草地～暗い草原～草原、と滑らかにつながっている。<br>
<br>
<br>
しかし、滑らかな境界もデータとして用意しておかなければならない。
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="auto_tile2.PNG" src="http://n-yagi.0r2.net/script/2010/08/15/auto_tile2.PNG" width="384" height="160" class="mt-image-none" style="" /></span><br>
暗い草地～草原の境界データがないのでエッジが見えてしまう。<br>
<br>
全ての境界線を繋ぐオートタイルを用意できるのが理想だが、データが膨大になる。<br>
現在、上層と下層の２枚のレイヤーでマップを表示している。もしレイヤーが３層あると、そうとう柔軟性が広がり、少ないデータでも境界を表現できるようになるが、Flash のマップチップ描画処理は結構重い（フレーム毎に全描画している）ので、これ以上レイヤーを増やせない。<br>
<br>
<br>
結局は今在るデータでなんとかするしかないのだ。<br>
<br>
<br>
せめて、境界を滑らかに繋ぐ部分は自動でやりたい。いちいちタイルのデータを配置していては、いくら時間が合ってもマップが完成しなくなってしまう。<br>
</li></ul>
<br>
→オートタイルの親和性チェーンのようなものを定義できるようにする。<br>
例えば「海」～「砂地」～「草原」～「雪山」のような繋がりを明確にする。
ユーザーは、特に意識することなくマップチップを配置していけばよいだけにしたい。
<br>
<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年7月2日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/201072.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.364</id>

    <published>2010-08-14T10:27:28Z</published>
    <updated>2010-08-14T11:16:57Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="netgroup" label="NetGroup" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="netstream" label="NetStream" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="textfield" label="TextField" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class='headline'>2010年7月2日</h3>
ログ部分そっちのけで、通信部分を弄くっていた。<br>
<br>
<div class ="PreText">
エリアをある程度の範囲に区切り、その範囲でNetGroupを作成。局地的な集まりをNetGroupで管理しようと試みた。<br>
<br>
→NetGroup接続から、マルチキャスト送信Streamオープンまで、間が空くとFlashPlayer がフリーズする。<br>
NetGroup.Connect.Success イベント内で 送信Stream を作成せず、
もっと後のタイミングで new NetStream～publish をすると、publish でフリーズ。デバッガがエラーを拾えない致命的な止まり方をする。<br>
<br>
この他、いくつも NetGroup と NetStream を作ると、あっさり重くなり、実用に耐えうるか微妙になってしまった。<br>
</div>
<br>
→結局、それほど検証せずに Flash では、複雑な通信はまだ重くて安定しないと判断し、作業を進めることにした。<br>
<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="chat.PNG" src="http://n-yagi.0r2.net/script/2010/08/14/chat.PNG" width="400" height="400" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>

<br>
ひとまず、チャットが出来る状態になった。<br>
<br>
普通のチャットのルームに当たる機能がない為、ログインで行き成りフィールド上に放り出される。チャットのための面倒を徹底排除した結果こうなった。<br>
<br clear="both">
実はログが3行しかないのだが、TextField なので、マウスで操作すると全てのログが見れる。TextField さまさま。<br>
→ログ一覧のしっかしした機能を作る。<br>
→ログのフィルター機能を作る。<br>
<br>
<br>

<h4>展望</h4>
<ul>
<li>家やダンジョンをチャットルームに見立てて、パスワードをかける。認証が通らないと入れないエリアを作る。</li>
<li>名前のトリップみたいなものを作れないか？</li>
<li>ブラックリスト。リストにあるキャラは、チャットからキャラまで一切画面に表示されない。など。</li>
</ul>
<br>
<br>
展望を語る前に、<b>マップ切り替え機能とマップエディタを作る必要がある。</b><br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>TextField と IME 入力 について</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/flash_ime.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.363</id>

    <published>2010-08-14T06:38:33Z</published>
    <updated>2010-08-14T11:15:42Z</updated>

    <summary>「もチャット」チャット入力機能の使い勝手を向上させるために、入力関連についてあれこれ検索＆実験＆検証した事をまとめてみました。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="Adobe Flash" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ime" label="IME" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="textfield" label="TextField" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="フォーカス" label="フォーカス" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[「もチャット」チャット入力機能の使い勝手を向上させるために、入力関連についてあれこれ検索＆実験＆検証した事をまとめてみました。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class='headline'>IME と TextField の入力フォーカス</h3>
英数字１文字の入力をトリガーにチャット入力を開始できるようにしたいが、IME がネックでなかなか上手くいかない。<br>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="input_ime.png" src="http://n-yagi.0r2.net/script/2010/08/14/input_ime.png" width="360" height="128" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<br><br>
TextField にフォーカスが無い状態で IME 入力があると、このように IME 入力パレットが出てしまう。<br clear="both">
<br>
「<strong>TextField にフォーカスが無い状態</strong>」かつ「<strong>IME 日本語入力状態</strong>」の時に、このパレットを出さずに正しく TextField から入力する方法はないものか。<br>
<br>
→検索＆検証＆実験の結果、それっぽいものが出来た。<br>
<br>
<br>

<h3 class='headline'>チャット入力シミュレーション</h3>
<br>
<span class="mt-enclosure mt-enclosure-file" style="display: inline;"><div style="float: left; margin: 0 20px 20px 0;"></div></span><br>
<br>
<b>水色の入力領域</b>以外の場所をクリックしても、イキナリ文字列の入力を始められる。
<b>どこにフォーカスがあっても、入力を始めると指定TextFieldへフォーカスが移り、正しくIMEの入力ができる。</b><br>
<br>
<br>
<br>
<br>
ただし、完璧ではない（後述）<br clear="both">
<br>
<br>

<h3 class='headline'>ソース</h3>
たいした大きさではないので、全容公開。<br>
<br>
<div class="PreTag"><pre><code>
package  
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.FocusEvent;
    import flash.events.KeyboardEvent;
    import flash.events.TextEvent;
    import flash.events.TimerEvent;
    import flash.text.TextFieldType;
    import flash.ui.Keyboard;
    import flash.text.TextField;
    import flash.utils.Timer;

    import flash.system.Capabilities;
    import flash.system.IME;
    import flash.system.IMEConversionMode;

    /**
     * ...
     * @author 
     */
    public class inputBase extends Sprite
    {
        private var logField:TextField; //  入力ログ
        private var inputField:TextField;   //  入力領域

        private var statusField:TextField;  //  フォーカス情報
        private var keycodeField:TextField; //  キーコード情報

        public function inputBase() 
        {
            //  入力ログ
            logField = new TextField();
            logField.width = 256;
            logField.height = 160;
            logField.x = 32;
            logField.y = 64;
            logField.background = true;
            logField.backgroundColor = 0xeeee99;
            logField.selectable = false;
            logField.multiline = true;
            addChild(logField);
            //  入力領域
            inputField = new TextField();
            inputField.type = TextFieldType.INPUT;
            inputField.width = 256;
            inputField.height = 32;
            inputField.x = 32;
            inputField.y = logField.y + logField.height + 32;
            inputField.background = true;
            inputField.backgroundColor = 0x99eeee;
            addChild(inputField);
            //  フォーカス情報
            statusField = new TextField();
            statusField.width = 256;
            statusField.height = 32;
            statusField.background = true;
            statusField.backgroundColor = 0xee99ee;
            statusField.x = 32;
            statusField.y = 0;
            statusField.selectable = false;
            addChild(statusField);
            addEventListener(Event.ENTER_FRAME, onEnter, false, 0, true);
            //  キーコード情報
            keycodeField = new TextField();
            keycodeField.width = 256;
            keycodeField.height = 32;
            keycodeField.background = true;
            keycodeField.backgroundColor = 0x99ee99;
            keycodeField.x = 32;
            keycodeField.y = 32;
            keycodeField.selectable = false;
            addChild(keycodeField);
            //
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);
        }
        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);
            //
            startKey = new Array();
            var i:int;
            for (i = 0x30; i &lt;= 0x39; i++)  startKey[i] = true; //  数字
            for (i = 0x41; i &lt;= 0x5a; i++)  startKey[i] = true; //  アルファベット
            for (i = 186; i &lt;= 192; i++)    startKey[i] = true; //  記号
            for (i = 219; i &lt;= 222; i++)    startKey[i] = true; //  記号
            //
            stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownStage);
            inputField.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDownInput);
            inputField.addEventListener(FocusEvent.FOCUS_OUT, onFocusOut);
            //  FOCUS_INは特に必要ない。IME.setCompositionStringが「IME.enabled = true;」を兼ねる。
    //      inputField.addEventListener(FocusEvent.FOCUS_IN, onFocusIn);
        }

        //  判定用
        private var startKey:Array;

        /**
         * 入力開始判定
         * @param   e
         */
        private function onKeyDownStage(e:KeyboardEvent):void 
        {
            if (startKey[e.keyCode])
            {
                var t:Timer = new Timer(0, 1);
                t.addEventListener(TimerEvent.TIMER,function (te:TimerEvent):void 
                {
                    t.stop();
                    t.removeEventListener(TimerEvent.TIMER, arguments.callee);
                    /*  キーダウンイベントを抜けた後でTextFieldにフォーカスをあわせないと、
                     *  TextFieldが入力文字を拾ってしまう。    */
                    stage.focus = inputField;
                    //  TextFieldにフォーカスが無いとIME.conversionModeから正しい値が拾えない。
                    if (Capabilities.hasIME
                    &amp;&amp;  IME.conversionMode != IMEConversionMode.ALPHANUMERIC_HALF
                    &amp;&amp;  IME.conversionMode != IMEConversionMode.UNKNOWN )
                    {   //  IMEインライン入力モード
                        IME.setCompositionString(String.fromCharCode(e.charCode));
                    }
                    else
                    {   //  IME変換入力モードではない
                        inputField.appendText(String.fromCharCode(e.charCode));
                        var last:int = inputField.caretIndex + 1;
                        inputField.setSelection(last, last);
                    }
                });
                t.start();
            }
            //
            keycodeField.text = "STAGE:" + e.keyCode.toString();
        }

        /**
         * 入力フィールドキー入力判定
         * @param   e
         */
        private function onKeyDownInput(e:KeyboardEvent):void 
        {
            switch (e.keyCode) 
            {
                case    Keyboard.ENTER: //  文字列入力完了検知
                    logField.appendText("\n" + inputField.text);
                    logField.scrollV = logField.maxScrollV;
                    inputField.text = "";
                    break;
                case    Keyboard.ESCAPE:
                    stage.focus = stage;    //  フォーカスを別のコンポーネントへ移動可能
                    break;
            }
            e.stopPropagation();
            //
            keycodeField.text = "INPUT:" + e.keyCode.toString();
        }

        //  TextField以外のDisplayObjectがフォーカスを得る場合、IME.enabledの操作が必要。
        private function onFocusOut(e:FocusEvent):void 
        {   //  これが無いと、IME 入力パレットが出てしまう。
            IME.enabled = false;
        }

        /**
         * フォーカス表示
         * @param   e
         */
        private function onEnter(e:Event):void 
        {
            if (stage.focus === logField) 
            {
                statusField.text = "入力ログ領域";
            }
            else if (stage.focus === inputField) 
            {
                statusField.text = "入力領域";
            }
            else if (stage.focus === statusField) 
            {
                statusField.text = "ステータス領域";
            }
            else if (stage.focus === keycodeField) 
            {
                statusField.text = "キーコード領域";
            }
            else
            {
                statusField.text = "どこか";
            }
        }
    }
}
</code></pre></div>
<br>
<br>
ポイントは、２点。チャット入力開始判定をしている onKeyDownStage にある。
<ul>
<li>入力のあった文字が文章入力の開始であると判定した際、直ちに入力の TextField にフォーカスを設定していない事。判定のあったイベント処理内でフォーカスを設定すると、TextField が最初の一文字を拾ってしまう。<br>
<br>
もし、IME のモードが日本語入力状態だった場合、ここでフォーカスを移すと、冒頭で述べた入力パレットがでるか、フラッシュの左上に入力文字列が表示されてしまう事になる。<br>
<br>
入力判定をした後、そのイベント処理をぬけた直後に、入力 TextField へフォーカスを移動し、最初の一文字を、モードによって場合わけ処理をする。<br>
<br>
</li>
<li>「イベントを抜けた直後に処理をする」を実現するために、遅延ゼロの Timer イベントを利用。<br>
一定時間後である必要はないが、一旦処理を抜けた後に実行したい処理が在る場合に使う。
これは、意外に応用範囲が広い。<br>
<br>
</li>
</ul>
<br>
<br>

<h3 class='headline'>バグと言うか不具合</h3>
バグというか不具合がある。<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ime_pallet.png" src="http://n-yagi.0r2.net/script/2010/08/14/ime_pallet.png" width="328" height="374" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<br>
ごく稀に（初回入力時が多いので追求が不可能ではないと見ている）、IME の入力パレットがでる。<br>
<br>
マウスによる操作で、適切にフォーカスを設定してやると入力は出来るようになるので、致命的なレベルではない。また、動作モードが不安定で（今のところ）このようになるモードが特定できない。<br>
<br>
<br clear="both">
<br>
<br>

<h3 class='headline'>限界</h3>
もうチョっと便利にしようとしたが、IME 関連の仕様の壁は厚かった。<br>
<br>
<strong>TextField にフォーカスが無いと「半角/全角キーによる IME モード切替」が不可能</strong>であることが判明。どんなに検索しても、IME 周りは不安定でバグが多いとしか情報が出ない。<b>「半角/全角キーによる IME モード切替」をメソッドなりプロパティなりで変更が出来ない。</b><br>
<br>
Flex SDK 4 で、IME 関連のインターフェースが追加されたようだが、解決したい問題との関連性を見出せなかった。<br>
<br>
<br>
もぅ、Adobe の今後に期待するしかない。<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年7月1日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/201071.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.362</id>

    <published>2010-08-13T10:35:19Z</published>
    <updated>2010-08-13T13:00:32Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ime" label="IME" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="textfield" label="TextField" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="アバター" label="アバター" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class="headline">2010年7月1日</h3>
アバターキャラクター選択と、ハンドルネームの設定画面を作った。<br>
ハンドルネームの指定を端折ると「ナナシ」に設定される。
基本なんでも入力可能なので、ドット一文字なども可能。チェック機構が必要かもしれない。<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="select.PNG" src="http://n-yagi.0r2.net/script/2010/08/13/select.PNG" width="480" height="360" class="mt-image-none" style="" /></span>
<br>
キャラクターどころかボタンデザインまでも借用させて頂いた。<br>
→<a href="http://uros.web.fc2.com/" target="_blank">http://uros.web.fc2.com/</a><br>

<br>
<br>
ようやく、メイン画面からチャット文字列を入力する部分に着手。<br>
<br>
<ul>
<li>TextField のフォーカスイベントの取得について、以下のページがわかり易い。<br>
→<a href="http://www.5ive.info/blog/archives/214" target="_blank">http://www.5ive.info/blog/archives/214</a><br>
<br>
</li>
<li>フォーカスの変化を検出できたが、強制的にフォーカスを設定するには？<br>
→Stage の focus に InteractiveObject を設定するらしい。InteractiveObject が判りにくいが、要は TextField のようキー入力を受け付けられるオブジェクトの事。<br>
→参照：<a href="http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/display/Stage.html#focus" target="_blank">http://livedocs.adobe.com/flash/9.0_jp/ActionScriptLangRefV3/flash/display/Stage.html#focus</a><br>
<br>
</li>
<li>KeyBordEvent で Enter キーを検知すると、IMEでの候補確定の Enter まで反応してしまう。<br>
→判別の方法はあるようだ。<a href="http://blog.swee.jp/proto/2009/02/as3-ime-enter.html" target="_blank">http://blog.swee.jp/proto/2009/02/as3-ime-enter.html</a><br>
つまる所、KeyboardEvent.KEY_DOWN の Enter だけを拾えば、IME の確定 Enter を避けられる。というか実際うまくいったので良しとする。<br>
<br>
</li></ul>
チャットの入力欄はそれっぽく出来た。しかし、なぜかまだ実際の送信は出来ない。<br>
明日は、チャットログ。
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年6月30日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/2010630.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.361</id>

    <published>2010-08-12T11:55:37Z</published>
    <updated>2010-08-12T12:15:10Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="netgroup" label="NetGroup" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="netstream" label="NetStream" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="マルチキャスト" label="マルチキャスト" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class='headline'>2010年6月30日</h3>

NetStreamを使う上で参考になるコードを公開しているページ。<br>
<a href="http://createwave.blog104.fc2.com/blog-entry-112.html" target="_blank">http://createwave.blog104.fc2.com/blog-entry-112.html</a><br>
<a href="http://cuaoar.jp/2010/03/rtmfp.html" target="_blank">http://cuaoar.jp/2010/03/rtmfp.html</a><br>
<br>
マルチキャストについて。<br>
<a href="http://cuaoar.jp/2010/03/rtmfp-1.html" target="_blank">http://cuaoar.jp/2010/03/rtmfp-1.html</a><br>
<br>
<br>
NetStream について勘違いがあったが、それを克服し、動くものが出来た。<br>
NetGroup.post と比べ、反応速度が格段に早い。post では、キャラクターをしばらく動かさない状態
（同じデータを送信し続ける状態）にすると、何故か反応が鈍くなる（データ受信取りこぼし？が増える）ように見える状態になることがあったが、
ストリームを使うと、その頻度も激減し、きわめて良好なアクション性を示したと感じた。<br>
→<span style="color:#009;font-weight:bold;">2010年7月2日追記：</span>同じデータを送信すると、端折るのは post 送信の仕様だそうだ。ゲームに使うなら NetStream を選択するべき。<br>
<br>
これならば、ものにもよるがオンラインアクションゲームに十分に耐え得ると思われる。<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="char_move.PNG" src="http://n-yagi.0r2.net/script/2010/08/12/char_move.PNG" width="400" height="400" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<br clear="both">
<br>
<br>

<h4>作って解ったこまごました事</h4>
<ul>
<li>NetGroup.Neighbor.Connectについて<br>
グループに後から参加したユーザーは、グループに接続した際、
すでにグループにいるユーザーが一気にログインしてくるように見えるようだ。<br>
</li>
</ul>

<br>
<br>

プログラム技術的な山は越えた。後はお化けアバターチャットというアプリケーションとしての完成度を高めるばかりである。<br>
→アバター選択画面作成に着手。<br>
<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>もチャット作成日誌：2010年6月28日～29日</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/08/201062829.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.360</id>

    <published>2010-08-11T12:30:59Z</published>
    <updated>2010-08-11T13:15:29Z</updated>

    <summary>もチャット作成作業日記です。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="作業日記" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="netgroup" label="NetGroup" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="netstream" label="NetStream" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="stratus" label="Stratus" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="もチャット" label="もチャット" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[もチャット作成作業日記です。<br>
<br>
<br>]]>
        <![CDATA[<br>
<h3 class='headline'>2010年6月28日</h3>

いきなりマップフィールド部分から作り始める。
最初は、一面草原のマップで、時キャラが操作できる事を最低目標に。<br>
<br>
アバターキャラクターのゴブリンを動かそう！<br>
→とりあえず、マップの当たり判定をし、フィールドを動き回るキャラクターを作成できた。<br>
<br>
<br>
<br>
<h3 class='headline'>2010年6月29日</h3>

複数キャラの表示と、キャラクター管理部分の体系化を目標に。
P2P通信部分の調査。出来れば実験レベルでの実装。<br>
<br>
→「Stratus Developer key」で検索すると、かなりのページがヒットする。<br>
<br>
ここが詳しい（というか説明が日本語）。<br>
→参考：<a href="http://blog.katsuma.tv/p2p/" target="_blank">http://blog.katsuma.tv/p2p/</a><br>

<div class="PreText">
<br>
FlashでP2Pをするには、中継サーバーが必要。そのサービスは、βらしいがAdobeが提供しているようなので、
それに関するページ。<br>
→参照：<a href='http://labs.adobe.com/technologies/stratus/' target="_blank">http://labs.adobe.com/technologies/stratus/</a><br>
<br>
P2P中継サービスを利用するには、「Stratus Developer key」が必要。<b>無償で取得できる</b>らしい。<br>
→取得ページ：<a href='https://www.adobe.com/cfusion/entitlement/index.cfm?e=stratus' target='_blank'>https://www.adobe.com/cfusion/entitlement/index.cfm?e=stratus</a><br>
AdobeIDがない状態だと、AdobeID取得からになるようだ。<br>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="adb_new_id.PNG" src="http://n-yagi.0r2.net/script/2010/08/11/adb_new_id.PNG" width="320" height="128" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<br>
この表示の右側に、Adobe ID ログインフォームがある。<br>
<br clear="both">

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="stratus_reg.PNG" src="http://n-yagi.0r2.net/script/2010/08/11/stratus_reg.PNG" width="400" height="256" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span><br>
入力項目に異常がなければ、そのまま「Stratus Developer key」取得へ移行する。<br>
<br clear="both">

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="your_key.PNG" src="http://n-yagi.0r2.net/script/2010/08/11/your_key.PNG" width="400" height="400" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span><br>
承諾すれば、「Stratus Developer key」を得られる。<br>
<br clear="both">

後は、このキーでP2Pコードを書くのみ。<br>
</div>
<br>
<br>

コードについては、FMSと同じように・・・と書かれているページが多い。困ったことに当方 FMS は未経験。見当もつかない。調べるしかなさそうだ。<br>
<br>
<div class="PreTag"><pre><code>
private var con:NetConnection = null;

con = new NetConnection();
con.addEventListener(NetStatusEvent.NET_STATUS, onStat);
con.connect("rtmfp://stratus.rtmfp.net/取得したキー/");

private function onStat(e:NetStatusEvent):void 
{
    switch (e.info.code) 
    {
        case    "NetConnection.Connect.Success":    //  成功
            trace(con.nearID);
</code></pre></div>
こんな感じで実行すると、64桁の16進数がトレースされる。<br>
これが、クライアントのIDになるのだろう。<br>
<br>
<br>
マルチキャストするには、グループという概念を導入する。これは Flash Player 10.1 からの（現時点で）最新の機能だ。
P2Pのノードネットワークの中に、ノードの纏まりを作りその纏まりの中でマルチキャストできる。という認識でよいのだろうか。
<br>
→参考：<a href="http://www.flashrealtime.com/simple-chat-p2p-netgroup-rtmfp/" target="_blank">http://www.flashrealtime.com/simple-chat-p2p-netgroup-rtmfp/</a><br>
<br>
<div class="PreText">
Flash Player 10.1 の新クラス NetGroup を使おうとすると、エラーが出る。というか、オートコンプリートの一覧に出ないので、
ライブラリにすらない状態のようだ。<br>
調べてみると、Flash Player 10.1 の新機能を使うには、Flash Player 10.1 に対応した playerglobal.swc が必要な模様。
対応の playerglobal.swc だけを探したがどうにも見つからず、途方にくれて昼寝。<br>
<br>
<a href="http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4" target="_blank">http://opensource.adobe.com/wiki/display/flexsdk/Download+Flex+4</a>
から改めて Flex SDK 4系を落とす。落としたバージョンは、Flex SDK 4.1.0.16076 。<br>
これには frameworks/libs/player/10.1/playerglobal.swc が存在した。<br>
<br>
やっと見つけた playerglobal.swc を、開発中の Flahs Develop プロジェクト の lib に置いて Add To Library でプロジェクトに設置。
ようやく、新クラスを使ったコードでコンパイルが通るようになった。
</div>

<br>
このページを大いに参考にさせて頂いた。<br>
→参考：<a href="http://cuaoar.jp/2010/03/netgroup.html" target="_blank">http://cuaoar.jp/2010/03/netgroup.html</a><br>
<br>
その結果、とりあえず動くレベルになった。<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="pear.PNG" src="http://n-yagi.0r2.net/script/2010/08/11/pear.PNG" width="213" height="136" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<br>
起動すると、接続の確認を取られる。<br>
<br clear="both">
<br>
それぞれの画面を中心にオバケが動き、クライアントが増えれば自動的にそのキャラを追加、
クライアントが接続を終えれば、自動的にキャラを削除する。<br>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="ghost3.PNG" src="http://n-yagi.0r2.net/script/2010/08/11/ghost3.PNG" width="480" height="480" class="mt-image-none" style="" /></span>
全員同じ・・・<br>
<br>
キャラクターデータは、<a href="http://uros.web.fc2.com/" target="_blank">http://uros.web.fc2.com/</a>の物をお借りした。<br>
ホームページのデザインセンスについてはシンプルで良いと感心するがどこもおかしくはないな。<br>
<br>
<br>
P2P接続の割には、動きがぎこちなく重い。データ送信メソッドに post を使っていることが原因のようだ。<br>
ひとまず、情報送信間隔が開いても、動きを保管するようにした所、それなりにスムースになった。<br>
しかし・・・やはり遅延が大きい。0.5秒ほどずれる。さすがに、これは大きいので、別の方法を模索。<br>
<br>
NetStreamマルチキャストで、sendを使うと生データを送れるらしいが・・・要調査。<br>
<br>
<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>Flash P2P チャット 「モ（ンスター）チャット」</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/07/mochat.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.359</id>

    <published>2010-07-30T12:56:20Z</published>
    <updated>2010-07-30T14:35:33Z</updated>

    <summary>かねてから思い描いていたオンラインアプリ？をようやく形にできたので公開してみます。 ...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="もちゃっと" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="flash" label="Flash" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="p2p通信" label="P2P通信" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="チャット" label="チャット" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[かねてから思い描いていたオンラインアプリ？をようやく形にできたので公開してみます。<br>
<br>

<a href="/mochat/">
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="title.png" src="http://n-yagi.0r2.net/script/2010/07/30/title.png" width="320" height="144" class="mt-image-none" style="" /></span>
</a>

<br>
<br>]]>
        <![CDATA[<br>


<h3 class="headline">Flash で P2P 通信</h3>
Flash で P2P 通信を・・・<br>
<br>
とかいう記事は、２年程前からネット上にあふれています。<br>
あくまで「新機能のドキュメントを読み、サンプル試験コードで機能を確認した」レベルの記事ばかり。<br>
しかし、それで「こんなもの作ったよ～」というものになると、数がぐんと減ります。<br>
<br>
やはり、Adobeが提供する P2P中継サーバがβである事が大きいのでしょうか。<br>
<br>
<br>
ここではひとまず、βがどうのとかいう事は置いといて、P2Pアプリケーションについて考えて見ましょう。<br>
<br>
P2Pアプリケーションの有名どころでは、ファイル交換ソフトが挙がることでしょう。この他に、身近なものと言えば、オンラインゲームでしょうか。<br>
<br>
今、巷にあふれるオンラインゲームは結局の所コミュニケーションツールだと思っています。<br>
MMO-RPG も、つまるところ<strong>高級なチャットソフト</strong>という位置づけになりますね。<br>
<br>
<br>
いきなり極論ですが、「だったら最初にまず、チャットありき。」でアプリを作り、<strong><span style="color:#990000">只のチャットアプリ</span></strong>から<strong><span style="color:#0000FF">高級チャットアプリ</span></strong>へとブラッシュアップして行けばよいではないかと、開発に着手しました。<br>
<br>
<br>

<h3 class="headline">もちゃっと</h3>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="mochat.png" src="http://n-yagi.0r2.net/script/2010/07/30/mochat.png" width="400" height="360" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span><br>

<a href="/mochat/" target="_blank"><big><strong>Monster Chat</strong></big></a><br>
<br>
今時のアバターチャットアプリケーションです。<br>
と一言で終わってしまう内容ですが、ここまでクルのに結構な時間がかかりました。<br>
<br>
構想自体は２年前から、作業は１ヶ月以上かかっています。<br>
<br>
<br>
詳しい内容は、公開までにつけていた作業日記を順次公開するのでそちらを見ていただくとして、最終的にこれを作るきっかけとなった素材作者様へこの場を借りて御礼申し上げます。あろがとう！<br>
<br>
<br>
<ul>
<li>キャラクターデータ:<a href='http://uros.web.fc2.com/' target="_blank">ひみつ ゲーム用フリー素材</a></li>
<li>マップチップ：<a href='http://www.tekepon.net/fsm/' target="_blank">First Seed Material</a></li>
</ul>
後者の方は、RPG製作者筋には有名どころでしょうか。<br>
<br clear="left">
<br>
<br>

<h3 class="headline">懸念</h3>
冒頭でも述べた「Adobeが提供する P2P中継サーバがβである事」も、さることながら、
P2P 通信の rtmfp の能力を信用するしかないといった作りになっています。<br>
<br>
自分がこのような通信のアプリを作る事自体初めてなので、見当が付かないまま突き進んでいるところも多く、動いちゃいるけど本当に大丈夫？と念を押して聞かれるとしどろもどろにならざるを得ない。orz<br>
<br>
<br>
<br>

<h3 class="headline">今後</h3>
いずればドメイン取ってちゃんとしたサービスとして公開できる日を目標に、精進して参りたいと思います。<br>
<br>]]>
    </content>
</entry>

<entry>
    <title>Adobe AIR 2.0</title>
    <link rel="alternate" type="text/html" href="http://n-yagi.0r2.net/script/2010/06/adobe_air_20.html" />
    <id>tag:n-yagi.0r2.net,2010:/script//1.358</id>

    <published>2010-06-23T09:08:15Z</published>
    <updated>2010-06-28T10:04:30Z</updated>

    <summary>AIRが 2.0 になりました。長らくのβ期間を終えたようです。Release Candidate ですけれどネ。 http://labs.adobe.com/technologies/air2/ F...</summary>
    <author>
        <name>n-yagi</name>
        <uri>http://n-yagi.0r2.net/</uri>
    </author>
    
        <category term="Adobe AIR" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="adobeair" label="Adobe AIR" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="flashdevelop" label="Flash Develop" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webサーバー" label="Webサーバー" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ランタイム" label="ランタイム" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://n-yagi.0r2.net/script/">
        <![CDATA[AIRが 2.0 になりました。長らくのβ期間を終えたようです。Release Candidate ですけれどネ。<br>
<ul><li><a href="http://labs.adobe.com/technologies/air2/" target="_blank">http://labs.adobe.com/technologies/air2/</a></li></ul>
<br>
<a href="http://flashdevelop.jp/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8" target="_blank">Flash Develop</a> も、何時の間にやら RTM 3.2.1 となっております。開発環境を一新しましょう。<br>
<br>
AIR SDK 単体での使用についてはここでは説明いたしません。<br>
flex sdk に統合？された AIR 開発環境を Flash Develop から使う方法を説明します。<br>]]>
        <![CDATA[<br>

<h3 class="headline">インストール</h3>
既に FLEX SDK での開発環境が整っている前提で話を進めます。
そうでない方は<a href="/as3/air/">コチラ</a>から。<br>
<br>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="flex_fl.PNG" src="http://n-yagi.0r2.net/script/2010/06/22/flex_fl.PNG" width="200" height="320" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>
<br>
flex SDK を展開した所へ、AIR SDK を上書きして下さい。<br>
<br>
元となる Flex SDK ファイルリスト。3.4 安定版辺りをお使いならば、AIR SDK のバージョンは 1.5 になるでしょう。<br>
<br>
FLEX SDK 3.5.0.12683 では、AIR 1.5.3 が同梱されています。
<br clear="left">
<br>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="air2rc_fl.PNG" src="http://n-yagi.0r2.net/script/2010/06/22/air2rc_fl.PNG" width="200" height="200" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>

今回の件の AIR 2.0 SDK RC。構成は同じですので、上書きで問題ありません。<br>
AIR SDK だけを上書きできます。
<br clear="left">
<br>
<s>これだけで開発が可能になります。</s>ランタイムが 2.0 以上と、開発ターゲット以上でないと、実行時エラーが起きます。忘れずにインストールしましょう。→<a href="http://get.adobe.com/jp/air/" target="_blank">AIRランタイム</a><br>
<br>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="prj_set.PNG" src="http://n-yagi.0r2.net/script/2010/06/22/prj_set.PNG" width="320" height="128" class="mt-image-left" style="float: left; margin: 0 20px 20px 0;" /></span>

<br>
プロジェクトを作成したら、ターゲットを設定しましょう。デフォルトが Flash Player 9 ままなので、プロジェクト新規作成の度に明示的に設定してやる必要があります。<br>
<br clear="left">
<br>
<br>

<h3 class="headline">AIR 2.0 サンプル</h3>
とりあえず、AIR 2.0 で出来るようになった、Socket サーバー機能を試して見ましょう。<br>
<br>
→大いに参考：<a href="http://192.150.8.55/jp/devnet/air/flex/quickstart/communicating_with_sockets.html" target="_blank">http://192.150.8.55/jp/devnet/air/flex/quickstart/communicating_with_sockets.html</a><br>
<br>
UDP ソケットの話は、<b><span style="color:#009">AIR 2.0 β の新機能</span>説明ページが山ほどあり<span style="color:#990000">散々既出</span>です</b>ので、
一つ捻って TCP サーバを扱って見ましょう。と言っても上に挙げた参考ページで主な事は述べられて居るので、
応用として簡易 HTTP サーバーを作って見ることにします。<br>
<br>
<br>
実際、弄くると判りますが、デバッグの段階でサーバーソケットを開くために、<b>Windows ﾌｧｲｱｳｫｰﾙ</b>が一度だけ反応します。<br>

<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="fw.PNG" src="http://n-yagi.0r2.net/script/2010/06/22/fw.PNG" width="400" height="240" class="mt-image-none" style="" /></span><br>

実際に許可されるプロセスは、adl.exe かと思いきや Flash Develop になるようです。<br>
<br>
<br>

<h3 class="headline">いきなり躓く</h3>
ターゲットバージョンを正しく設定し、コンパイルも無事に通り、いざ実行するとエラーダイアログが。<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="run_err.PNG" src="http://n-yagi.0r2.net/script/2010/06/22/run_err.PNG" width="400" height="160" class="mt-image-none" style="" /></span><br>
<br>
<div class="PreText"><pre><code>
Error #1014: Class flash.net::ServerSocket could not be found.
</code></pre></div>
<br>
上記のエラーメッセージをそのまま検索すると、Adobe のフォーラムに解決策がありました。<br>
<br>
プロジェクト中の、application.xml にAIRのバージョンが記述されている箇所があります。<br>
<div class="PreTag"><pre><code>
&lt;application xmlns="http://ns.adobe.com/air/application/1.5"&gt;
</code></pre></div>
これを、以下のように。
<div class="PreTag"><pre><code>
&lt;application xmlns="http://ns.adobe.com/air/application/2.0"&gt;
</code></pre></div>
フォーラムでは 2.0beta とか 2.0beta2 とかの細かい指定をしていましたが、実際は必要なかったようです。<br>
もしかしたら何か問題が在るかも知れませんが、とりあえず上記のエラーが出ずに動作するようになりました。<br>
<br>
<br>

<h3 class="headline">プロジェクトテンプレート編集</h3>
これらの記述を、プロジェクト作成の度にするのは面倒なので、大元のテンプレートを編集してしまいましょう。<br>
<br>
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="tmpl_fl.PNG" src="http://n-yagi.0r2.net/script/2010/06/22/tmpl_fl.PNG" width="480" height="200" class="mt-image-none" style="" /></span><br>

Flash Develop をインストールした所に Projects と言うフォルダがあります。ここに、新規プロジェクトの際に列挙されるプロジェクトテンプレートが幾つか有ります。<br>
<br>
それぞれのプロジェクトを書き換えます。<br>
<ul>
<li>application.xml.template<br>
→application タグの xmlns 末尾を 2.0 へ変更。<br>
</li>
<li>Project.as3proj<br>
→&lt;project&gt;&lt;output&gt;&lt;movie&gt; とタグ辿ったところに在る、version の値を 10 から 11 へ変更。<br>
</li>
</ul>
これで、次から新規作成されたプロジェクトも、最初から AIR2.0 開発設定になります。<br>
<br>
<br>

<h3 class="headline">とりあえず動いた</h3>
さて、紆余曲折、躓きもありましたが、ひとまず動くものが出来ました。<br>
<br>
<ul>
<li>動的ページは使えません。CGI 未対応。</li>
<li>というか、POSTアクセス未対応。GETアクセスのみです。</li>
<li>アドレス 127.0.0.1:80 にHttpサーバーを立てます。httpのルートは C:\public\ です。<br>
テスト扱い＆面倒なので、ハードコーディングされてますが、初期化の際に与えるパラメータとして設定できるので、ソースコードを見てみてください。<br>
</li>
</ul>
<br>
フリーなソースコード。Flash Develop プロジェクトになります。<br>
→<span class="mt-enclosure mt-enclosure-file" style="display: inline;"><a href="http://n-yagi.0r2.net/script/2010/06/22/air2http.zip">air2http.zip</a></span><br>

<br>
使う為のサンプルでは無い為、アプリケーションとしてはとてもとても微妙。<br>
<strong>アクセスログも、trace されるだけなので、Flash Develop のデバッグ起動でしかログを確認できません。</strong><br>
<br>
<strong><span style="color:#990000">各自で頑張って、改造しましょう。</span></strong>CGI など動かせれば、十分使える物（一般公開とかではなく、個人試験環境レベルで）に化けるはず。<br>
<br>
<br>
<hr>
<span style="color:#000099"><strong>2010年6月28日追記：</strong></span><br>
CGI起動について、意気込んでプロセス起動の調査をしたところ、現時点での仕様では「プロセスへ環境変数を渡せない」「プロセスへ渡す環境変数を加工する手段がない」事が判りました。<br>
<br>
実現するには、「CGIへ環境変数を渡せるネイティブアプリを作り、仲介しなければならない」模様。現時点（AIR2.0RC）では、<span style="color:#990000"><strong>純粋なAIRアプリケーションだけでは CGI対応Webサーバー は作れない</strong></span>ようです。<br>
<br>
とてもとても残念ネ・・・orz=3<br>
<br>]]>
    </content>
</entry>

</feed>
