HaxeFlixelによる開発手順

トップに戻る

HaxeFlixelによる開発手順

HaxeFlixelを使って開発する際の一般的(と思われる)手順をまとめてみました。

1.テンプレートプロジェクト作成

テンプレート作成コマンドを入力してテンプレートプロジェクトを作成。

flixel tpl -n "ProjectName"

2.テンプレートプロジェクトを修正

テンプレートに足りない設定を追加します。例えば「Intellij IDEA」のテンプレートであれば、ライブラリのパスやビルドターゲットの設定がされていないので設定しておきます。

3.Main.hxを修正

解像度やフレームレートを変更、初期StateをPlayStateに修正、起動時のスプラッシュのスキップをtrueにします。

/// Main.hx
class Main extends Sprite {
    var gameWidth:Int = 320; // 画面の幅
    var gameHeight:Int = 240; // 画面の高さ
    var initialState:Class<FlxState> = PlayState; // 最初の画面
    var zoom:Float = -1; // -1の場合、自動でズームを行う
    var framerate:Int = 60; // フレームレート
    var skipSplash:Bool = true; // 起動時のスプラッシュ表示
    var startFullscreen:Bool = false; // フルスクリーン描画を行うかどうか

4.ゲームオブジェクト追加

FlxSpriteを継承したゲームオブジェクトを追加します。 以下、よくある実装方法です。

/// Player.hx
class Player extends FlxSprite {
  public function new() {
    super(FlxG.width/2, FlxG.height - 64);
    // 画像の読み込みやサイズ、各種パラメータを設定
  }
  override public function update():Void {
    super.update();
    // キー入力や移動処理・状態遷移
  }
}

5.PlayState.hxにゲームオブジェクトを配置

PlayState.hxでゲームオブジェクトを配置します。 以下、実装例です。

/// PlayState.hx
class PlayState extends Flxstate {
  private var _player:Player;
  override public function create() {
    // プレイヤーを生成
    _player = new Player();
    add(_player);
  }
}

6.ゲームオブジェクトの動作制御や衝突判定を実装

PlayState.hxに動作制御や衝突判定などゲームルールを実装していきます。

/// PlayState.hx
class PlayState extens FlxState {
  private var _player:Player;
  private var _shots:FlxGroup;
  private var _enemys:FlxGroup;
  private var _bullets:FlxGroup;

  overrid public function update():Void {
    if(_player.exists == false) {
      // プレイヤー死亡。ゲームオーバー処理へ
    }
    if(_enemys.getFirstExisting() == null) {
      // 敵が全滅。勝利シーケンスへ
    }

    // 衝突判定
    FlxG.collide(_player, _emenys, _hitPlayerVsEnemy); // プレイヤーと敵
    FlxG.collide(_shots, _enemys, _hitShotVsEnemy); // プレイヤーの弾と敵
    FlxG.collide(_player, _bullets, _hitPlayerVsBullet); // プレイヤーと敵弾
  }

  // 衝突処理
  private function _hitPlayerVsEnemy(player:Player, enemy:Enemy) {
    player.kill(); // プレイヤー死亡
  }
  private function _hitShotVsEnemy(shot:Shot, enemy:Enemy) {
    shot.kill(); // 自機の弾を消す
    enemy.kill(); // 敵を消す
  }
  private function _hitPlayerVsBullet(player:Player, enemy:Enemy) {
    player.kill(); // プレイヤー死亡
  }
}

7.タイトル画面を作る

MenuStateクラスをタイトル画面として実装します

/// MenuState.hx
class MenuState extends FlxState {
  override function create():Void {
    _text = FlxText(0, 16, FlxG.width); // テキスト生成
    _text.alignment = "center";
    _text.text = "Hello world";
    add(_text);
  }
  override function update():Void {
  }
  override function destroy():Void {
    _text.destroy();
  }
}

8.メインゲームとタイトル画面をつなげる

メインゲームとタイトル画面をつなげて完成です。

タイトル画面の実装例

/// MenuState.hx
class MenuState extends FlxState {

  override function update():Void {
    if(FlxG.keys.justPressed.SPACE) {
      // SPACEキーが押されたら、ゲーム開始
      FlxG.switchState(new PlayState());
    }
  }
}

メインゲームの実装例

/// PlayState.hx
class PlayState extens FlxState {

  override public function update():Void {
    if(_player.exists == false) {
      // プレイヤー死亡。ゲームオーバー処理へ(タイトル画面へ戻る)
      FlxG.switchState(new MenuState());
    }
    if(_enemys.getFirstExisting() == null) {
      // 敵が全滅。勝利シーケンスへ
      _nextLevel();
    }
}