新エンジンのプロトタイプ版公開

http://www.nscripter.com/sgesmpl.lzh
(12/11朝6:00)FPSの固定をDirectXの垂直同期待ちに任せるのではなくスクリプト側で実装した。62.5FPSとか半端な数字になってますが、これは1フレーム16ミリ秒だからです。
(12/11夜7:00)3Dのデモが視点が近すぎて不自然だったので少し離した。
(12/20)かなり高速化。これならネットブックでもDirectXで出来ます。フォントをキャッシュせずに直接書く命令を作った(多分こちらを正式採用する)。年内更新はこれで終了。
*フォント機能は変更予定。

  • 当面忙しいのでここで小休止です。
  • ぶっちゃけて言うと、これがTJSに相当する。このLuaでKAGに相当するシナリオ解釈プログラムを組んで、そちらがNScripter2ということになればいいなと(仮称だけど)
  • Sunday Game Engineという名前は、小学校の頃BASICでやってたような日曜ゲームプログラミングを楽しめるツールになればいいなーという思いを込めて付けました(これも仮称だけど)
  • DirectX9の2008年12月版より新しいものが必要です。
  • 2DギャルゲADVの演出装置として3Dを融合していく方向で考えています。例えば天球を作って書き割り背景を貼るとか、四角い部屋を作って部屋の壁を貼るとか。ビルボードも搭載しているので、現状でもパラッパ的なものは作れそう。
  • 画像はPNG、音楽はOGG、ムービーはMPEGに対応しています。SQLiteを内蔵していて、セーブ等に利用できます。

予定

  • 年が明けたらぼちぼちADVエンジンを作り始めます。バックバッファとかの扱いを修正したら、ネットブックでも見違えるほど速くなったので、DirectXベースで開発していきます。
  • まずはフリーや同人ADVで使ってみて、ある程度安定してきたところで商業でも使っていく。

予定メモ/進捗状況

  • ns2でbmpを直接読む時に何かバグがあるらしい。ns2にbmpを格納すると容量がかなり大きくなるのであまり使わない機能だと思うけど、一段落ついたら修正します。
  • 現在商業製品でns2を使って作業中。pngを使っています。
  • 必要だったのでpngをα値を維持したまま左右もしくは上下に連結して保存するツールを作った。Luaスクリプトで連続実行できるので、好きなように連結できる。が、これは開発中のゲームエンジンをそのまま使って作ってるので、単独ツールとして公開するには無駄な部分が多すぎて、どう扱うか考え中。
    • まあいいや、ということで試験公開。次期ゲームエンジン……を使ったPNG連結プログラム。自分が使う時用に公開しておきます。http://www.nscripter.com/pngrenketu.lzh
      • 現段階でも拡大縮小無しのゲームなら作れるとは思うけど、ゲームエンジンとしてはまだまだ未完成です。
      • エンジンはDirect3D9を使っています。XP以降専用です。
        • 今回のPNG連結は、Direct3D機能を使っていません。内部のDIBクラスでデータ的に連結してるので、カードの都合で画質が変化したりはしません。
      • 試験段階なのでまだ使用条件とか決めていません。ないとは思いますが、実際にゲームエンジンとして利用して公開する人は連絡してください。

新しいエンジンについて

  • SJIS版のLuaでも英語の(オリジナルの)プラグイン類はたぶんだいたい使えるのでこのままでも外のライブラリを使う分には問題ないと思うんだけど、一応内部的にUTF-8にして、もともとのLuaを使うようにしようかな。すると中身をシフトJISで動かしてるのはあまり意味がなくなるので、Unicodeコンパイルしなおす必要があるけど、今の段階でその処理をするのは簡単なので今のうちにやる。OggPNGも内部に持ってるのでそういう改造は比較的楽。
    • ファイル名……ASCII文字(半角の字、半角かなは含まない)
      • NScripterでもそうなんだけど、こちらでもこのルールで。ファイル名処理にシフトJIS対応を組み込むと専用になってしまうので、ファイル名は最初からASCIIに限っておく。ASCIIコードと衝突する文字コードはどこの国にもたぶんないので。
    • スクリプト……シフトJISUTF-8(内部的にはUTF-8に変換される)
    • exeはUnicode版でコンパイルされ、各国語対応という感じで。
  • 現状のNScripterではC++で書かれているような処理のうち、Luaで書いても問題なさそうなものをLuaで外部に出すことで、ユーザー側からいじれるようにして、その分システムカスタマイズ周りの仕様がすっきりするようにするのが狙い。このLuaスクリプトを使って、NScripterの(システムカスタマイズを伴わない)シナリオ演出スクリプト相当のものを作り上げるので、そちらはむしろ現状のNScripterより初心者向けのはず。
  • 問題は、システムカスタマイズをやろうとしたときに、Luaの既存の入門コンテンツはほとんどがC言語を習熟しているのを前提にしていることだけど、これはまあ、そのうちなんとか。
  • NScripterのマニュアルがとっちらかってる問題。アーカイブをns2、音楽再生をnsogg2、画像をnspngに絞った形ですっきりしたガイドを書いていきたいけど、時間がない。レガシーな機能の解説まで含んでいると大変なので。
  • Lua上で行番号式のクラシックなBASIC言語を実装しようかなとか検討してる。作るのも簡単だし、プログラマじゃない人が使うにはLuaよりは敷居が低いだろうと思うので。

(メモ追記)

  • TP.exeとSGE.exeを統合する。ついでにインストーラーくらいはSGE.exeで書けるようにしてもいいかも。(今の汎用インストーラーは、ちゃんと動くけどちょっと古くなってきてるからなあ)
    • この場合二重起動の判定処理に工夫が必要→ミューテックスを二つ使って処理すればexeごとに別の判定ができるかも。
  • SGE.exeにLua経由でSQLiteを組み込む(バインドライブラリにライセンスがMITのがある)。
    • データ処理方面が強くなる。テキスト処理をSQLを使ってやれると記述性が高い。
      • 今回、台本処理でデータベースがあれば楽だなと思ったので。パーサはLuaで書けるけど、きめの細かい選択・整列処理とかはSQLで書けたほうが楽。
    • ゲーム本体でも使えそう。SQLiteは速いらしい。
  • エラー処理をテキストエディタと連携することを考えていたが、テキストエディタは固定しないほうがよさそうな気がする。エラー処理関数をlua上でコールバックできるようにする。
  • 関数をテーブルに分けて、他のライブラリとあわせて全部小文字の名前にする。

台本作成に便利なテキスト処理支援ツール

http://www.nscripter.com/tp.lzh
実験公開中。俺は仕事でバンバン使うつもりだけど、他の人が使いやすいかどうかは不明。
正規表現とかワイルドカードとかGREPとか分かってる人なら、台本作業がすごく速くなると思う。
スクリプト言語SJIS対応のLuaをそのまま使ってる。exeひとつで済む手軽さを重視した。
スクリプトを入れ替えれば他のテキスト処理にも使える。
(サブフォルダも含めて)フォルダ内のファイル名を取得する関数があるので、GREPツールみたいに使えるかも。

  • 細かく修正中。タグ入れでコメント行を飛ばすようにした。

もうこの日記はNScripter用に使うことにしよう(汗

シナリオ仕事って年に数作程度だから書くことあんまりないんだよね。今始まったとこだけど。新作。

  • GDIを利用した描画命令を増やす予定(Windows標準の、矩形、円、扇形、2Dポリゴン、角の丸い矩形、辺りが書けるかな)。
  • 画面に直接書くだけじゃなくて、テクスチャにも書ければスプライトとして使えそうなんだけど、WindowsのGDIはたぶんα値に対応していないのでむつかしそう。

プロット作業中

仕事でおおまかなストーリーを構想中。NScripterちょっと止まってます。25日以降更新します。

  • NScripterはGDIで特化することにする。DirectXで何か作りたいなら子ウィンドウ作ってそこで動かしたほうが楽そう。
  • というわけで、GDI描画命令と、画面もしくはスプライトからNSDテクスチャに画像を取り込む命令と、テクスチャ画像をNScripterスプライトに変換して書き込む命令を追加する。
    • あと画像がないときのエラー落ちバグ修正が必要
  • これで、Luaを通してフォントを出力する仕組みが完成する。
    • Luaの文字列処理でいろいろ前処理が出来る。
    • 表示文で一文字ずつ表示するところはNSD系命令で組む
    • 表示文を出力し終わったら、テキストのテクスチャ画像をスプライトに書きこんでしまえば再描画も簡単
  • テクスチャもメモリの中に置くことになったので、NSDCallに""を渡したら前のテクスチャデータをそのまま使うことにする。フォントを自由にいろいろ書けるかも。

NScripter更新中

しばらく、作業中のものはここに付け足していきます。
http://www.nscripter.com/test1.lzh

  • RPG風スクロールマップ移動のデモ。カーソルキーで移動です。
  • さすがにGDIで800x600を毎回再描画すると、多少ちらつくのかな。1920x1200の液晶モニタなんで、限界が来てるだけかもしれない(フルスクリーンだとちらついてない気もする)。
    • たぶんこの液晶の転送の限界っぽい。動画でもときどき引っかかってるからなあ。ネットブックでもそう無理なく動いてました。
  • 階段踏むとウィンドウが出て文字が出るようにしてみた。こんな感じでNScripterのほうの機能と連携取れますよ、ということで。
  • これを見てユーザさんがRPGを作る、というのはたぶん難しいと思います(C言語とかHSPとかJava等を使ってプログラム組むのとあまり変わらないので)。実際にはこういうコードを汎用に書いて供給するライブラリプログラマが必要になると思います。そういう基盤部分の技術デモなので、中身が分からなくてもあまり気にすることはないかと。

http://www.nscripter.com/nsdtest.lzh

  • NSD系命令のシンプルなデモ。

(進捗状況)

  • 拡大縮小回転も実装した。
  • NSD系命令からNScripter側のトランジションを使えるようにした。
  • テクスチャをDLLを呼び出してその中の関数で初期化できるようにした。
    • DLLとしてフォントを描画する物をサンプルに提供した。

(メモ)

  • Luaの分厚い本買った。仕事道具になりそうなので奮発した。とりあえず、バグらないけどバグ発見。今出先なので、帰ったら直します。
    • forループのカウントの変数は自動生成されるforループ内ローカル変数なので、ループより前にlocal宣言してる今まで書いたソースは間違いです。値を使ってないから不具合になってないけども。直します。

(以下検討中)

  • まず、検証待ち様子見の期間もかねて、GDI機能のほうで何かゲーム作ってみます。ちょっとしたやつ。安定したところで、↓の作業へ。
  • NSD系命令をDirectXに対応させる(そのために、DirectXにかなり近い仕様にしてあります)
    • DirectXとの連携はDLL部分で行うことにして、本体への影響を極力小さくします。ガワは作ったので、DirectXのいい資料を探します。これはゆっくりやります。
    • 回転無しならオフスクリーンサーフェイスだけで簡単にさくっと実装できそう。これはそういうモードとして実装したほうがいいかもしれない……マシンに優しそうだし。
      • これはダメぽ。システムメモリ上でいろいろやるみたいで、たぶん今と速度的に変わらない。
  • いきなりこれでユーザー公開するのは敷居が高すぎますね。マニュアルも散漫だし。とりあえずLuaへの処理の委譲が一通り終わったら、整備しなおす必要がありそう。RPGツクールrubyが使えるのと同じような感じにしたい。きっちり切り分けて、簡単に使える部分は簡単なまま残さないと。