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(); } }