大きく構造の変わった HaxeFlixel 4 に対応する


# HaxeFlixel 4.0.0は3.3系から大きく変わっています
Haxe用ゲームフレームワークであるHaxeFlixelのメジャーリリースであるバージョン4.0.0が2016/02/16にリリースされました。breaking changes と書かれている通りモジュール構造が大きく変わっているので3系のコードはそのままではビルドが通らないでしょう。

"Haxe Game Development Essentials"(Jeremy McCurdy, PACKT PUBLISHING 2015)を読んでいたのですがこれもエラーがところどころ出て、いろいろ調べながらやったのでそのメモです。

## 公式のアップグレードガイドを参考にする
http://haxeflixel.com/documentation/upgrade-guide-4-0-0/
これで大体は対応できます。

### update()が引数をとるように
一番影響が大きいのは、アップグレードガイドの一番上にもありますが、update関数が引数なしからFloat型の引数を取るようになったところでしょう。ゲームの状態を管理しているFlxState継承クラスではだいたいoverrideしているのであちこちあると思います。

```as
override public function update(elapsed:Float):Void
	{
		super.update(elapsed);
		...		
	}
```
### Util系static method が instance methodに
また、画面の中央に配置するscreenCenterは
```as
FlxSpriteUtil.screenCenter(flxSprite);
```

が、

```as
flxSprite.screenCenter();
```
のように、flxObjectがメソッドとして持つようになりました。

##  demoのコードをあさる
https://github.com/HaxeFlixel/flixel-demos
demoのコードはちゃんと4.0.0に対応したものになっているので適当に関数名を検索して使いかたを調べます。今回調べてわかったところなど。
### FlxEmitterインスタンスのプロパティの設定
```as
var smoke = new FlxEmitter(0, 0, maxParticles);
```

に対し、

```as
smoke.setXSpeed(-100, 100);
smoke.setYSpeed(-100, 100);
smoke.setScale(0.15, 0.5, 1, 3);
smoke.setAlpha(0.25, 1, 0, 0);
smoke.setRotation( -180, 180);
```

としていたものは

```as
smoke.velocity.set( -100, 100, -100, 100);
smoke.angle.set( -180, 180);
smoke.alpha.set(0.25, 1, 0, 0);
smoke.scale.set(0.15, 0.5, 1, 3);

```

と書くようになりました。

### Textureからのアニメーション読み込み
pngとjsonで一対になったTexturePacker形式から画像を読みこんでFlxSpriteのインスタンスにアニメーションを設定する場合、

```as
import flixel.util.loaders.TexturePackerData;
var texturePackerData = new TexturePackerData(AssetPaths.sprites__json, AssetPaths.sprites__png);
flxSprite.loadGraphicFromTexture(texturePackerData);
flxSprite.animation.addByNames("Loop", ["image01.png","image02.png"], 8);
flxSprite.animation.play("Loop");
```

としていたものは

```as
import flixel.graphics.frames.FlxAtlasFrames;
var textureAtlasFrames = FlxAtlasFrames.fromTexturePackerJson(AssetPaths.sprites__png, AssetPaths.sprites__json);
flxSprite.frames = textureAtlasFrames;
sprite.animation.addByNames("Loop", ["image01.png","image02.png"], 8);
sprite.animation.play("Loop");
```

とFlxAtlasFramesをframesに渡すように書くようになりました。また、pngとjsonの引数順が逆になっています。
アップグレードガイドにもloadRotatedGraphicFromTexture()は removed (assign a frames collection to frames)と書かれていますがわかるまでちょっと悩みました。
アニメーションでなく単一画像をTextureから引っぱってくる場合は、

```as
import flixel.graphics.frames.FlxAtlasFrames;
var textureAtlasFrames = FlxAtlasFrames.fromTexturePackerJson(AssetPaths.sprites__png, AssetPaths.sprites__json);
flxSprite.frames = textureAtlasFrames;
sprite.animation.frameName = "imageName.png";
```

でいけました。

### tweenのコールバック引数を渡すフィールド名がcompleteがonCompleteに
Flx.tweenは第四引数でオプションとして匿名オブジェクト(構造体)を使ってイージングやコールバック関数を与えることが多いですが、このフィールド名がcompleteからonCompleteに変わりました。


```hx
// HaxeFlixel 3.3.x
FlxTween.tween(sprite, { x:0 }, 1.0, { ease: FlxEase.quadIn, complete: onAnimateIn } );
```

```hx
// HaxeFlixel 4.0.0
FlxTween.tween(sprite, { x:0 }, 1.0, { ease: FlxEase.quadIn, onComplete: onAnimateIn } );
```

## はい
これで冒頭にあげた書籍で作るサンプルゲーム"StarWalrus"は動くようになりました。よかったですね。

ちなみにAmazonでもKindle版が売っていますが出版社からeBookを買うほうが安いです。
https://www.packtpub.com/game-development/haxe-game-development-essentials