すべてのキーボードイベントを取る方法
Flex2でのキーボードイベントは、ActionScript2.0の頃のように、キーイベントをすべて取るのが少し難しくなっています。
すべてのキーボードイベントを取るには、stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp) を登録するのですが、
MXMLプロジェクトでは、
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プロジェクトなら
たとえば、白色なら、以下の感じです。
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="#FFFFFF">
ActionScriptプロジェクトなら
- メニューから[プロジェクト - プロパティ]を選択。
- ActionScriptコンパイラを選択
- 追加コンパイラ引数に、「-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");
-
-
- -
-