What is it, naokirin?

NME : Haxeでクロスプラットフォーム開発のできるライブラリ

Haxeの勉強を始めたばかりですが、NMEが面白いのでちょっとだけ紹介します!


Haxe自体、様々な言語へ変換出来ると言う面白い言語です。

さらにNMEでは様々な環境向けにビルドができ、GUI開発ができます。(とはいえ、今はゲーム開発専用と言っても良さそうではあります。例えば、UIで言えば表の表示とか箇条書きもなさそうです。これからなのか、このままなのか。。。)
まだちゃんと自分で全部は試していませんが、WindowsMac OS XLinuxiOSAndroidBlackBerry、webos、Flashhtml5向けにビルドが出来るようです。

インストール

次のページからダウンロードしたら、Haxeごとインストールされるみたいです。
http://www.haxenme.org/download/

ただし、例えばMacであれば
/usr/lib/haxe/lib/
というディレクトリがあると思うので、このパスを

haxelib setup (上記のパス)

のようにしておかないとビルドが出来ないと思います。

その後にコマンドでnmeと打ちこんで、次のように表示されればOKです。

$ nme
NME Command-Line Tools (3.4.2)
Use "nme setup" to configure NME or "nme help" for more commands

失敗するようであれば、上のような設定を行ってみてください。それでも無理ならWebで調べる等行ってください。


つぎに、nmeでそれぞれの環境向けにビルドするために、たとえばMac OS X向けのビルドを行う場合は

nme setup mac

のようにビルドするためのセットアップをする必要があります。

ただし、MacおよびiOS向けにはXcodeのインストール、WindowsではVisual C++のインストールが必要となるようです。

Hello, World!

はろーわーるどです。

// Source/Sample.hx
import nme.Lib;
import nme.display.Sprite;
import nme.text.TextField;


class Sample extends Sprite {

  public function new () {
    super ();

    // テキストフィールドを生成
    var textField = new TextField ();
    textField.text = "Hello, World!";
    textField.width = 320;

    // テキストフォーマット
    var textFormat = new TextFormat ();
    textFormat.size = 30.0;

    textField.setTextFormat (textFormat);

    // テキストフィールドを登録
    Lib.current.addChild (textField);
  }

}
<!-- build.nmml -->
<?xml version="1.0" encoding="utf-8"?>
<project>

  <app title="Sample" file="Sample" main="Sample" package="com.naokirin.sample" version="1.0.0" />

  <window width="320" height="480" fps="60" orientation="portrait" resizable="false" />

  <set name="BUILD_DIR" value="Export" />

  <classpath name="Source" />
	
  <haxelib name="nme" />
  <haxelib name="actuate" />

  <ndll name="std" />
  <ndll name="regexp" />
  <ndll name="zlib" />
  <ndll name="nme" haxelib="nme" />
	
</project>

これで

nme test build.nmml mac
nme test build.nmml ios -simulator
nme test build.nmml windows
nme test build.nmml html5

などとするとそれぞれの環境向けにビルドされ、実行されます。

Haxe自体はJavaに似ていると言う印象ですね。(ActionScriptに似ていると言う話もありますが、ActionScript知らないので何とも…)。NMEもJavaGUI開発の感じに非常に良く似ています。

代入のある変数宣言や関数の戻り値の型は省略しても型推論で型を付けてくれるため、静的型付けではありますが型名は省略してます。難しいところもありますが、クロスプラットフォーム開発のときには使ってみるのもいいかもしれません。



かなりクロスプラットフォーム&ゲーム開発では使える感じです。

ただ問題もあるのでいろいろと注意する点もあります。

分かっている注意点

クロスプラットフォーム開発が出来るとはいえ、環境に対しての対応がまちまち。
・ウィンドウのwidth, height、画面のwidth, heightの保持や扱いも環境ごとにまちまち。最上位のSpriteクラスにwidth, heightを設定するとFlashでは拡大されてしまうといったことも。
HTML5の表示のパフォーマンスがとりあえず悪い。シューティングゲームのような表示オブジェクト数が多いものは表示速度だけで問題になる。画像を出力する際にSpriteクラスではそれぞれがcanvasタグとして処理されるので量が多くなると重い。かといってBitmapData.draw()はさらに重い。
HTML5での表示はSpriteクラスを使うとfpsが低いとちらつく。おそらく最初に表示されるタイミングではCSS等の対応がきちんと処理されていないからだと思われる。
・個別の問題だが、html5にエクスポートする際にTextFieldの中央寄せができない、と言った問題がでることもある。(参考 : http://d.hatena.ne.jp/naokirin/20120901/1346511694


テストがやりにくい。
・標準のテストをNMEから呼び出す事は出来るが、標準のテスティングフレームワークでは機能が弱いのでmunitを使おうなどとするとNMEの自動生成部分との依存関係の解消がうまく行かずにテストが出来ない。


環境に対しての対応の差異に関してはそれぞれの環境に対して表示してみて確認を取ってみるしか無いところもあります。


参考になるかは分からないですが、現在かなり適当なシューティングゲーム制作中です。
さぐりさぐりやってるのでいろいろヒドいですが、Mac, flash, iOS等に対応してます。
https://github.com/naokirin/nme-shoot

現状、上のコードではNMEのテスト方法、HTML5エクスポート時に描画オブジェクトが多いとcanvasタグが大量生成されて遅いという問題を抱えています。だれか解消できる方法知ってたら教えてくださいな。