開発状況 2019 #2
ようやくといいますか、やっとといいますか、チュートリアルを書き始めました。 Lumino 全体を浅く触りながら、2D のアクションゲームを作るものです。
実際に書いてみるとゲームエンジンとしてちょっと足りてないところが出てきたので、今月のコミットはいろいろなところに手が入っています。
Audio
0.4.0 以降、とりあえず音鳴ったわーいで止まってたものを、ちゃんと BGM と SE 同時再生できるようにしたり、キャッシュを実装して効率よくたくさんの SE ならせるようにしたりしてました。
新しい Audio システムは WebAudio ライクなノードベースで柔軟にエフェクト掛けられるすごいやつですが、このへんの API をちゃんと決めてテストできるのはまだ先になりそうです。
Physics
Box2D を組み込んで、2D シーン用の高速な物理演算システムを作りました。
Unity などのゲームエンジンと Box2D では API にかなり差がありますが、Lumino は 3D と同じく Unity 寄りに実装してあります。なので、単なる薄いラッパーではないです。
UI
画面に文字を表示するための UITextBlock を実装しました。使い方は WPF の TextBlock をイメージしています。
というより、Lumino の UI モジュールは全体的に WPF をイメージしたスタイリングやレイアウトシステムとなっています。
Animation
プロパティアニメーションを実装途中です。スキンメッシュアニメーションと同じようなインターフェイスでオブジェクトのプロパティを変更できるようになります。
とりいそぎ、チュートリアルでのスプライトアニメーションで使う予定です。
Graphics
UITextBlock の実装のため、スプライトベースのテキストレンダリングを実装しました。0.4.0 以降はとりあえずテクスチャへのBlitだけで実装していましたが、これからはリアルタイムに描画できるようになります。
あと、Vulkan を引き続き組み込み中です。一応次の 0.8.0 は Graphics モジュールを固めて出す予定なので、100% ではなくてもせめて公開 API へのインパクトの有無くらいはつかめるくらいには入れておきたいです。
今後について
チュートリアル完成と Vulkan 組み込みが二大柱です。 次の 0.8.0 はこの 2 つを目標にリリース予定です。
開発状況 2019 #1
いつのまにか、このブログを始めてから2年経ってました。 コードはすごく変わりましたが、機能的にはほとんど進みが無いように思います。 リファクタリングやりすぎ案件の事例です。
v0.7.0 リリース
こっそりしてました。
ただ、HLSL シェーダをいろいろなターゲット向けにトランスパイルする機能を仕上げただけなので、これだけで何かできるってわけではありません。なのでこっそり。
Graphics
Vulkan の対応を進めています。
これまではずっとレガシーDirectXやOpenGLでした。
しかし、次の 0.8.0 で fix したい Graphics 機能のために、少なくともモダングラフィックス API の「クセ」みたいなものをちゃんと知った上で実装しないと また大きな作り直しをしそうなので、ここで対応することにしました。
Mesh
ふと、丁度一年くらい前に作っていたボクセルモデルの自動生成をまた進めたくなったので 3D 周りに手を入れ出しました。 ただ Vulkan 対応がすごく重かったので、こっちはとりあえず .obj と .pmx を読めるようにしただけです。
今後について
Vulkan がんばります。
開発状況 2018 #12
リポジトリの Readme で「実際にゲームを作りながら」と言ってますが、ぼちぼちゲームを作るための機能がそろってきたので制作を始めました。
と言っても何年も前にプロト公開した作品のエンジン部分を乗せ換える作業がメインです。
今年の戦果。多分2年くらい前にも同じような動画上げた気がする。バックエンドがどれほど良くなろうとも、それは進歩として見えづらいのであった。 pic.twitter.com/SJoRreQ3s0
— lriki (@lriki8) December 31, 2018
あとはコミットログを遡って、今月やったことを思い出してみます。
Audio
Sound クラスと GameAudio クラスを実装しました。 基本的な使い方は 0.4.0 のものと変わりませんが、内部実装は Web Audio ライクなノードベースのサウンドシステムの上に作られています。 ので、今後はエコーやノイズなどのエフェクトを適用できるようなインターフェイスを追加する予定です。
あと、Ogg vorbis ファイルを再生できるようにしました。
Graphics
Texture2D クラスに、
- 単色塗りつぶし (clear)
- 他のテクスチャからのビットマップ転送 (blit)
- 文字列描画 (drawText)
を追加しました。 プログラム内での簡易的なテクスチャ編集に使います。
Tilemap
2D ゲームのマップなどでよく使われる機能です。 ロードマップ にはありませんが、ちょっと2Dなゲームを作りたい気持ちが出てきり、↑で制作中のゲームで必要になってきたりしたので実装中です。
ImageEffect
いわゆるポストエフェクトです。Unity の ImageEffect と同じです。 今回は2つ作りました。↑の動画でも使っています。
ToneImageEffect は画面全体の色調を調整します。セピア調のイメージを作ったり、フェードイン・フェードアウトの演出に使用できます。
ScreenBlurImageEffect は前回フレームの描画内容を重ね合わせる単純な方法で画面全体のブラーを表現します。
Scene
主にデバッグ用に、マウスでカメラを操作するための CameraOrbitControlComponent を実装しました。
これは Camera オブジェクトにアタッチして使う Component です。以下のようにするだけでぐりぐりできます。
Engine::mainCamera()->addComponent(CameraOrbitControlComponent::create());
Physics
bullet ライブラリをビルドシステムに追加しました。 とりあえず PhysicsWorld を作れるようにしただけで、まだ何もできません。
Shader
実際に本番環境で動かすと出てくるバグからはどうしても逃げられないようで、 あとはドキュメントだけで次のバージョン出せるぞ!とか思っていたら、↑で制作中のゲームで問題が出てきました。 バグっていうか単純な検討不足だったんだけど・・・。
とりあえずこんな↓対策にしました。
今後について
Shader モジュールに対してちょっと変則的な実装を加えたので、1月一杯くらいは様子見です。
他はゲーム作りつつ実装を続けていきます。
開発状況 2018 #11
次verではシェーダコンパイラの対応を行う予定ですが、相変わらず別モジュールの実装に浮気中です。
といっても fix できたものも無いので、コミットログをざっとさかのぼります。
Sprite
2D イメージを表示するためのアレです。
0.4.0 では配置する座標空間が異なる Sprite2D, Sprite3D がありましたが、 それぞれ
- Sprite2D → UISprite
- Sprite3D → Sprite
となりました。
2D 系は基本的に UI モジュールに押し込める感じで、ほかにもサフィックスとして 2D,3D とついていたものは同じように変更されます。
ImageEffect
適用先が増えました。
- Camera
- OffscreenRenderTarget
- Window 全体
- UIサブツリー
いろいろなところにエフェクト掛けられるようになります。
Archive
画像や音声など、配布するリソースファイルを1つのファイルにパックするアレです。
抽出防止のために暗号化掛けますが、以前のものはライセンスのソースがなんかパッとしなかったので zlib を参考に書き直しました。
ちなみに zip 圧縮も掛けようとしましたが、よく調べてみるとランダムアクセスが困難だったので、圧縮はやめました。
Audio
0.4.0 で公開していた Sound クラスとバックエンド (XAudio, OpenAL など) の間に、Web Audio ライクなノードベースのシステムを作りました。
これでかなり細かくサウンドエフェクトの適用個所を制御できるようになります。エミッタ個別でノイズ掛けたり、シーン全体にエコー掛けたり。
0.7.0 (Shader) について
前回の内容で、各プラットフォームの動作確認中です。 あとは
あたりかな。
開発状況 2018 #10
0.6.0 をリリースしました
Documentation: https://lriki.github.io/lumino/articles/documents/GettingStarted/getting-started.html
コマンドラインツールでプロジェクトを作成し、各プラットフォームでバックバッファをクリアするまでです。
※テクスチャのクラスとかも入ってたりしますが、これらはまだテストされていません。
これでひとまずクロスプラットフォーム対応を謳えるようになった気がしますが、できることはほとんどないのでまだそんなに面白くはないです。
このリリースは今後の開発のベースラインとして、本当にスタートラインに立つための動作保証を行ったものとなります。これでいろいろ安心して開発を進められるはず・・・。
Azure Pipelines を使いました
ターゲットプラットフォームも増え、フルビルドの時間も馬鹿にならなくなってきたので、毎回 5 ターゲットをテストするのはとても大変です。
ということで、ようやく CI を導入しました。リポジトリの Readme にバッジが載ります。
0.7.0 (Shader) 実装中
次はシェーダのトランスコンパイラです。
以前の記事に書いた通り、HLSL で記述されたシェーダを SPIR-V 経由でいろいろ変換します。
変換は lumino-cli コマンドから行います。
lumino-cli fxc shader.fx -o shader.cfx
プログラムからは Shader クラスの create 関数を使います。
auto shader = ln::Shader::create("shader.cfx");
こんなイメージです。
開発状況 2018 #9
0.6.0 はプロジェクト作成の自動化と各プラットフォームでウィンドウ出して画面クリアまでが目標ですが、ぼちぼち形になってきました。
lumino-cli コマンドによるプロジェクト作成
こんなコマンドを打ちます。
$ lumino-cli HelloLumino
次のようなフォルダとファイルができます。
- Assets フォルダ
- Sources フォルダ
- Projects フォルダ
- Engine フォルダ
- HelloLumino.lnproj
- LuminoApp.sln
Assets フォルダ
音声や画像などのファイルを入れておくフォルダです。 デプロイ時にまとめてアーカイブ化して配布パッケージに含まれます。
Sources フォルダ
.cpp などのソースファイルを置いておくフォルダです。
Projects フォルダ
各ターゲットプラットフォームごとのプロジェクトファイルが入っているフォルダです。
中はさらに次のように分かれています。
例えば、LuminoApp.iOS と LuminoApp.macOS の中には xcode のプロジェクトファイル、LuminoApp.Win32 の中には VisualStudio のプロジェクトが入っています。
Engine フォルダ
Lumino のライブラリがまるごと入っています。
ビルド済みライブラリ or Luminoのソース一式(Cocos2d-x方式) は選べるようにする予定です。 プロジェクトごとに使うLuminoのバージョンを変えたり、Lumino自体をカスタマイズするような使い方を想定しています。
git などでバージョン管理するべきフォルダではないので、クローンし直しとかしたあとは $ lumino-cli restore
コマンドで Engine フォルダを復元します。
HelloLumino.lnproj と LuminoApp.sln ファイル
HelloLumino.lnproj は lumino-cli が使う情報を保存しておくためのファイルです。
LuminoApp.sln は、メインの開発環境は VisualStudio を想定しているのでサッサとプロジェクト開きたいときにダブルクリックする用です。(後でよく考える)
今後について
結局 Unity や Cocos2d-x と似たフォルダ構成になりそうです。 最初はもっと違ったのですが、特に Android、iOS あたりの開発環境の制約を受けてこんな感じになりました。仕様変更の回数がえげつないです。
えげつなさで痛めたメンタルを癒すのに他のモジュールをいじってたので、他もそこそこ進んでたりします。 Input あたりはもうすぐ出せそうだし、テストしやすさにかかわってくるので先行して入れちゃいます。
開発状況 2018 #8
クロスプラットフォーム対応が重いです。 ネイティブ Linux は見送るかも・・・。
プロジェクトの作成について
以前は Visual Studio にプロジェクトテンプレートを登録していましたが、新しくコマンドラインからプロジェクトを作れるようにしています。
create-react-app や vue-cli のようなイメージです。
後々、プロジェクト作成だけじゃなくてリリースやパッケージ作成もコマンドひとつでできるようにしたいところ。
Shader について
先月の記事にも書きましたが、プラットフォーム問わず HLSL で書けるように詰めています。
Windows, macOS, Emscripten は多分OK。これからモバイル系を検証していきます。
Audio モジュールについて
お盆明けくらいに突然 "音" が恋しくなったので、対応予定verはかなり先ですが先行して実装していました。
ハイレベルAPIは従来の Sound クラスや GameAudio クラスなどから変える予定はありませんが、ローレベルAPIとして WebAudio に似たオーディオグラフを自由に構築できるようにしています。 これで自由度の高いエフェクトの適用を狙っています。
特定の SE にだけエコーやリバーブをかけたり、逆にシーン全体や BGM にだけかけたり、いろいろできる・・・はず。
バックエンドは DirectSound, OpenAL, SDL あたり。 Emscripten でも動作確認済み。
ちなみに XAudio2 はやめようと思います。やめることでDirectXランタイムのインストールが不要になるので、エンドユーザーに面倒かけずに済む。かも。