すべてのキーボードイベントを取る方法

Flex2でのキーボードイベントは、ActionScript2.0の頃のように、キーイベントをすべて取るのが少し難しくなっています。
すべてのキーボードイベントを取るには、stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp) を登録するのですが、
MXMLプロジェクトでは、の initialize イベントの時、
stage が null になっているため、アプリが起動した直後からイベントを取ることができません。
ActionScriptプロジェクトでは、コンストラクタでstageが正しく設定されています。)

そこで、click イベントなどで取ると良いです。ゲームを作る時は、一度、画面をクリックさせるなどの工夫が必要かも
しれませんね。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    layout="absolute"
    click="onClick()"
    >
    <mx:TextInput x="20" y="10" id="a_txt"/>
    <mx:Script><![CDATA[
        import mx.core.UIComponent;
         private function onClick():void {
             a_txt.text = "ready";
             stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp);
         }
         private function onKeyUp(event:KeyboardEvent):void {
             a_txt.text = "code = " + event.keyCode;
         }
    ]]></mx:Script>
</mx:Application>

あと、Flex2のマニュアルに載っている方法では、適当なを作り、
そこにフォーカスを移動させておくという方法が紹介されています。
確かに、この方法なら、creationCompleteイベントでフォーカスを指定できます。

先日、教えてもらった stageを参照できるすばらしい方法です。

 <?xml version="1.0" encoding="utf-8"?>
 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 layout="absolute">
      creationComplete="completeHandler()">
      <mx:Script>
          <![CDATA[
              private function completeHandler():void
              {
                  callLater(initializeHandler);
              }
 
              private function initializeHandler():void
              {
                  trace(stage); // is not null
              }
          ]]>
      </mx:Script>
 </mx:Application>

参考)中国語ですが、以下のサイトが役に立ちました。
http://www.nshen.net/blog/article.asp?id=496
最近、flex2のページ探していると、中国のページが多くヒットします。
※幸いにも、英語以上に中国語が読めるので、没問題ですが。

Flex Builder2 で背景色を指定する方法

デフォルトの青っぽい背景色は、Adobe(Macromedia)っぽいけど、
普通の人には変な色なので、白にして欲しかったです。

デフォルトの背景色の変え方、ちょっと迷いましたが以下のようにすれば良いです。

Flex2プロジェクトなら

タグに、属性「backgroundColor」を追加します。
たとえば、白色なら、以下の感じです。

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
 backgroundColor="#FFFFFF">

ActionScriptプロジェクトなら

  1. メニューから[プロジェクト - プロパティ]を選択。
  2. ActionScriptコンパイラを選択
  3. 追加コンパイラ引数に、「-default-background-color=(背景色)」と指定

背景色は、白なら、0xFFFFFF を、黒なら、0x000000と書きます。

Flex2 SDKなら

mxmlcコンパイルするとき、コンパイルオプションに
「-default-background-color=(背景色)」を追加します。
例えば、Test.mxmlコンパイルで背景所を青色にする時は
以下のように書きます。

mxmlc -default-background-color=0x0000FF Test.mxml

もしくは、ソース内にメタデータで埋め込み

package {
    import flash.display.Sprite;
    import flash.text.TextField;

    [SWF(width="800",height="600",frameRate="24",backgroundColor="#FFFFFF")]
    public class FirstAS extends Sprite
    {
        public function FirstAS()
        {
            var a_txt:TextField = new TextField();
            a_txt.text = "Hello, World!";
            this.addChild(a_txt);
        }
    }
}

数値を0で埋めて指定の桁数に揃える関数

        // 数値を0で埋めて指定の桁数に揃える関数
        private function formatZero(n:Number, keta:Number):String {
            var s:String = String(n);
            var i:int = 0;
            while (s.length < keta) {
                s = "0" + s;
            }
            return s;
        }    

こちらも別解を教えていただきました。

private function formatZero(n:Number, keta:uint):String
{
      return ("0000000000000000000000000" + n.toString()).substr(-keta);
}

substrにマイナスも指定できるんですよね。

右へ1つインデントするツール

Pukiwikiのソースで右1つインデントすると、ソースファイルとして
認識する整形ルールがあるのですが、これが意外と
手作業でやると面倒なので、ソースファイルを
右一つだけインデントするプログラムを作ってみました。

http://nadesi.com/tools/right-indent/EditConv.html

以下、そのソースです。

MXMLのソース

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:TitleWindow x="0" y="0" width="470" height="446" layout="absolute" title="ソース編集">
        <mx:TextArea x="10" y="10" width="430" height="356" id="a_txt" fontSize="12" fontStyle="normal" fontFamily="_typewriter"/>
        <mx:Button label="右一つインデント" width="130" x="10" y="374" click="convIndent()"/>
        <mx:Button x="148" y="374" label="左スペース1つ削除" width="117" click="convIndentLeft()"/>
    </mx:TitleWindow>
    <mx:Script source="EditConv.as"/>
</mx:Application>

上記MXMLから取り込まれるActionScriptファイル

// ActionScript file
// indent
private function convIndent():void
{
    var s:String = a_txt.text;
    s = replaceStr(s, "\r\n", "\n");
    s = replaceStr(s, "\r", "\n");
    var r:String = "";
    var a:Array = s.split("\n");
    var i:int;
    for (i = 0; i < a.length; i++) {
        var line:String = a[i];
        line = replaceStr(line, "\t", "    ");
        r += " " + line + "\n";
    }
    a_txt.text = r + "\n";
}

private function convIndentLeft():void
{
    var r:String = "";
    var s:String = a_txt.text;
    s = replaceStr(s, "\r\n", "\n");
    s = replaceStr(s, "\r", "\n");
    var a:Array = s.split("\n");
    var i:int;
    for (i = 0; i < a.length; i++) {
        var line:String = a[i];
        if (line.substr(0,1) == " ") {
            line = line.substr(1);
        }
        r += line + "\n";
    }
    a_txt.text = r + "\n";
}

private function replaceStr(s:String, a:String, b:String):String
{
    var a_ary:Array  = s.split(a);
    var s_str:String = a_ary.join(b);
    return s_str;
}

はっきり言って、はてなWiki記法の方が記述が楽が・・・。

文字列の置換は、正規表現を使って以下のような書き方もできるそうです。

s = s.replace(/(\r\n|\r)/g, "\n");
      • -