HaxeTips の変更点
[[FrontPage]]
* Tips [#c86af2b8]
HaxeのTipを紹介するページです
----
#contents
----
** 文字列 [#d0ca35d6]
*** 文字列内の変数展開 [#taa19ced]
シングルクォートの文字列内で「${xxx}」を使うと文字列内で変数を展開することができます。
#geshi(Actionscript3){{
var str = "hoge";
trace('My name is ${str}');
}}
*** 文字列内の特定の文字を別の文字に置き換えたい [#d569a1ce]
StringTools.replaceを使用すると文字列を置き換えられます。
#geshi(ActionScript3){{
var str1 = "2,5,6,2,8";
// "2"をすべて"0"に置き換える
var str2 = StringTools.replace(str1, "2", "0");
// "0,5,6,0,8" と出力される
trace(str2);
}}
StringTools.replaceの引数の説明は、replace("元の文字", "置き換える文字", "置き換えた後の文字") となります
**正規表現 [#z0020f14]
*** 正規表現で文字列を置き換えたい [#n33f91e6]
例えば以下の用に記述すると、0と1以外を0に置き換えます。
#geshi(Actionscript3){{
var text = "0,1,2,3,5,7,11,13";
var r = ~/([\d]{2,}|[2-9])/g; // 0と1以外は置き換える
text = r.replace(text, "0"); // 0に置き換える (=> "0,1,0,0,0,0,0,0")
}}
*** 正規表現を動的に生成したい [#l1434cdc]
ERegクラスを使うと文字列で指定が可能となります
#geshi(ActionScript3){{
// 第一引数に正規表現の文字列、第二引数に正規表現のオプションを指定する
var regex1 = new EReg("^.+", "i"); // -> ~/^.+/i
// オプションを指定したくない時は、第二引数は空の文字列を指定する
var regex2 = new EReg("^.+", ""); // -> ~/^.+/
}}
- 参考:[[Haxeで正規表現を動的に生成する>http://qiita.com/k-motoyan/items/315f1194b83c6e88d075]]
** 変換・キャスト [#zadd8322]
*** 型をキャストしたい [#y36680ec]
castキーワードでキャストできます。
#geshi(Actionscript3){{
var num = 1.23;
// Int型にキャスト
var num2 = cast(num, Int);
}}
左辺値の型が決まっていればcastの引数は省略可能です。
#geshi(Actionscript3){{
var num = 1.23;
// 左辺値に型の指定があれば省略可能
var num2:Int = cast num;
}}
*** 文字列を数値に変換する [#yb5d4de3]
Std.parseIntで整数値に変換できます。
#geshi(Actionscript3){{
var str = "123";
var num = Std.parseInt(str);
if(num == null) {
// 数値に変換できない場合、Std.parseIntの戻り値はnull
trace('numは数値ではありません');
}
}}
*** 浮動小数を整数に変換する [#e26ca825]
Std.intで変換をします
#geshi(Actionscript3){{
// 「3」と出力されます
trace(Std.int(3.14));
}}
*** 数値を0埋めした文字にしたい [#uadfeaad]
#geshi(ActionScript){{
/**
* 0埋めした数値文字列を返す
* @param n 元の数値
* @param digit ゼロ埋めする桁数
* @return ゼロ埋めした文字列
*/
public static function fillZero(n:Int, digit:Int):String {
var str:String = "" + n;
return StringTools.lpad(str, "0", digit);
}
}}
*** 数値をスペース埋めした文字列にしたい [#ca2197d4]
#geshi(ActionScript){{
/**
* スペース埋めした数値文字列を返す
* @param n
* @param digit
* @return
*/
public static function fillSpace(n:Int, digit:Int):String {
var str:String = "" + n;
return StringTools.lpad(str, " ", digit);
}
}}
*** 秒を「時:分:秒」の形式の文字列にしたい [#z341f8bf]
#geshi(ActionScript){{
/**
* 秒を「HH:MM:SS」形式の文字列に変換して返す
**/
public static function secToHHMMSS(sec:Int):String {
var hour = Std.int(sec / 60 / 60);
var minute = Std.int(sec / 60);
var second = sec % 60;
return fillZero(hour, 2) + ":" + fillZero(minute, 2) + ":" + fillZero(second, 2);
}
}}
** 文法・制御 [#meff5857]
*** 一定回数処理を繰りかえす [#h758049d]
以下のコードは10回ループします。
#geshi(Actionscript3){{
for(i in 0...10) {
trace(i);
}
}}
*** 関数の引数を省略したい [#xbaabfc8]
コールバック関数を定義する際など、引数の定義が必要だけれども、それを使わない場合は「_」で省略できます。
#geshi(ActionScript3){{
// ■引数をちゃんと書く場合
new FlxTimer().start(1, function(timer:FlxTimer) {
// 何か処理をする
});
}}
#geshi(ActionScript3){{
// ■引数を省略
new FlxTimer().start(1, function(_) {
// 何か処理をする
});
}}
少しだけ短く書くことができます。
*** 関数のバインディングについて [#kd7fdd60]
関数のバインディングを使うとコードを短く書くことができます。
例えば、選択メニュー用のボタンとして作成したFlxButtonのコールバック関数の指定です。
#geshi(Actionscript3){{
/**
* 選択肢の決定
*/
function resolveChoice(choice:Int):Void {
switch(choice) {
case 0:
// ゲーム開始
FlxG.switchState(new PlayState());
case 1:
// ゲーム終了
System.exit(0);
}
}
}}
この関数を、FlxButtonに登録します。
#geshi(Actionscript3){{
// スタートボタンの作成
var _buttonStart = new FlxButton(0, 0, "START", function() {
// 1番目を選んだ
resolveChoice(0);
});
// 終了ボタンの作成
var _buttonExit = new FlxButton(0, 0, "EXIT", function() {
var _buttonExit = new FlxButton(0, 32, "EXIT", function() {
// 2番目を選んだ
resolveChoice(1);
});
}}
普通に書くとこのようになります。ですが関数のバインディングを使うと、少し短く書けます。
#geshi(Actionscript3){{
// スタートボタンの作成
var _buttonStart = new FlxButton(0, 0, "START", resolveChoice.bind(0));
// 終了ボタンの作成
var _buttonExit = new FlxButton(0, 0, "EXIT", resolveChoice.bind(1));
}}
このように関数のバインディングを使うと、引数を省略した関数オブジェクトを作ることができます。
- 参考:[[Qiita - 部分適用で、関数の持つ引数を減らす>http://qiita.com/shohei909/items/f858fa1341ed54396b61]]
** アルゴリズム [#vb85a243]
*** ソートを実装したい [#b8b44bc9]
数値配列であれば、Array.sortが使えます。
#geshi(Actionscript3){{
var array:Array<Int> = [3, 5, 2, 4, 1];
array.sort(
function(a:Int, b:Int):Int {
return a - b; // 昇順ソート
}
);
}}
オブジェクト配列の場合は、ArraySortを使います。
#geshi(Actionscript3){{
import haxe.ds.ArraySort;
function sort() {
var _itemList:Array<ItemData>;
ArraySort.sort(_itemList, function(a:ItemData, b:ItemData) {
// ソートキーを比較
return a.sortkey - b.sortkey; // 昇順ソート
});
}
}}
** データ構造 [#i39b3a97]
*** キューを実装したい [#xbc223cd]
List.add() で末尾に要素を追加、List.pop() で先頭から要素を取り出すことができます。
Array.push() で末尾に追加して、Array.shift() で先頭から取り出す方法もありますが、Listの方がメモリ消費が少なく済みます。
** 環境 [#y801e414]
*** Flash環境でDynamicオブジェクトをcastすると止まる [#j08f0b26]
Flash環境ではDynamicオブジェクトをClassにcastすると、それ以降が実行されなくなるようです。そのためFlash環境で動かす場合は、castではなく、1つ1つのフィールドを取り出す必要があります。
#geshi(Actionscript3){{
class MyClass {
public var score;
}
……
var obj = Json.parse('{"score":100}');
// Flash環境では動かない
//var myclass = cast(obj, MyClass);
// このようにする必要がある
var myclass = new MyClass();
myclass.score = obj.score;
}}