やることありすぎる。仕事もちゃんとやらんとな。
SSD移行はできた。バックアップからの復旧でNASが見つけられず手間取ったが、上手く見つけられたらあとは簡単だった。復旧を試せるいい機会だ。 M5P速いけど、今までも遅いところなかったから速さを実感できない。やっぱり安い方でよかったんだ……。
TokyoDemoFest行ってきた。あんまり書けることないかな。 楽しかったけど、会場のメインスクリーンがちゃんと見える位置が限られててコンペがよく見えなかったのが残念だった。 あと何のアナウンスもないまま1時間遅れで進行するのはちょっときつい。 いやなんか否定的なことばっかり書いてるように見えるけど、まとまらなくて楽しかったくらいしか言葉が出ないんだ。
接続してないチャンネルの自動切断を入れてみたんだけど、こいつの自動切断までの時間をどうやって保存したものか。
今まではVisualStudioで普通に作れる設定ファイルを使ってたんだけど、これはどうしてもアセンブリ単位になってしまって外からいじれない。 他アセンブリ内にあるクラスの設定をGUIからいじりたいという時にアクセスできないんだよねぇ。
あとは保存場所がどこだかよくわからないとかいろいろと自由が効かないので自前で管理するようにしたい。 まあそんなに難しい物は必要ないだろうとぱぱっと作ってみた。 適当な設定クラスを登録しておくとそいつのオブジェクトを勝手にシリアル化して読み書きしてくれるようなクラスができた。
保存場所が悩ましいところだったが、まあ普通にユーザのローミングパスに保存しておけばよかろうとつっこんでおいた。 IsolatedStorage使おうと四苦八苦してみたが出来てからそんな必要なくて普通にローミングの下につっこめばいいじゃんと気付いたんだが。
コードからのアクセス用にstaticなPecaSettingsクラスを作ったのでぽいぽい設定をつっこんでおくだけで勝手に読み書きされる。 ちゃんと動きはするんだけどなんだかしっくりこないような……?
何がしっくりこないのか考えてみたけど、やっぱり設定が実質グローバル変数ってのがいまいちだなぁ。 設定ファイルとは本来独立しているべきロジック部分からも設定ファイルに気軽にアクセスできちゃう。 あるクラスのインスタンスを作った時にグローバル変数の状態に依存して動作が変わっちゃうというのは悪手でしょう。 ロジック部分に設定を反映させるのはロジック部分の外から明示的に行うべきだろう。
なんかプラグインのインターフェースか何かに設定読み書きメソッドを作って基本的にはそこから設定にアクセスするようにする? まあその辺が妥当かな。そっちに変更しよう。
WPF版のUI作ったよというPull Requestが来た。 特に問題なさそうなのでマージしてしまいたいんだが、バージョン管理に問題が。
PeerCastStationのバージョン管理はmonotoneを使っていて、monotoneからgitに書き出してgithubに上げているんだが、monotoneはgitへのエクスポートだけしかできない。gitからのインポートはできない。うごごご。
何か方法はないかと考えたけど、普通にgitに移行するしかなさそうな感じだ。まあPeerCastStationは基本的にはWindowsで開発していてTortoiseGitが使えるのでそんなに問題はない。コマンドラインのgitは難しすぎて俺のような常人には扱えないのです。
しかしgit使わずにgithubが使えればもっといいんだが何かいいものはないんだろうか。hgとかbzrでもいいけどなんかもっとしっくり来る物があるといいなー。
PeerCastStationもやらないといけないことが沢山あるなぁ。
優先度はなんとなくだけど上の方が優先な雰囲気で。Issueに書いておけばいいんだけどGithubのIssueはオフラインでみれなくてな……。
ゲームはUIがちょっとかわったくらい?
UIが右にくっついたり、ポーズメニューをつくってみたりした。3がいっぱい並んでるのは3wayショットのアイコン(のつもり)。Nはノーマルショット。
背景に線がついたりもしてるか。段差の境目がわかりづらかったので影を付けたかったんだけど大変だったので線をつけるだけでごまかした……というか充分だった。
UIはレイアウトマネージャを作ってなんとなく簡単にレイアウトを作れるようにした。
@ui.build do |ui|
ui.style :panel, padding: 8.0, border_width: 4.0, border_color: vec4(1, 1, 1, 1), fill_color: vec4(0.0, 0.0, 0.0, 0.5)
ui.style :stack, padding: 8.0
ui.style :text, scale: 2
ui.panel align: :right, width: 160 do
ui.text 'Time: %d' % (@game.scenario.time_limit/60)
ui.text "HP:#{@game.player.hit_point}/#{@game.player.max_hit_point}"
ui.text "Money:#{@game.player.money}"
ui.text "Slot #{@game.player.current_weapon==0 ? 'A' : 'B'}"
ui.stack orientation: :vertical do
weapons = @game.player.weapons[@game.player.current_weapon]
weapon = weapons.first
ui.text("#{weapon.name}: #{weapon.magazine}/#{weapon.max_magazine}")
weapons.drop(1).each_slice(5) do |ws|
ui.text(ws.collect {|w| w.name}.join(' '))
end
end
end
end
右に出てるUIがこんな感じ。毎フレーム実行してレイアウト計算してるので重いと言えば重いんだが動く程度なのでまあいいか。 本当はUIをこうコードで組み立てるのって好きじゃなくて、どう表示されるかは別で(できればリソースとして)定義しろやと思うんだけど、今回はそんなことより早く作ることが目的なのでこんなんでいいでしょう。
ゲーム外のメニューとかも作らないとなぁと思うけど、ステージエディットとどっちが先だろうか。 うーん、ゲームルール的にはメインゲームの外も作らないと回らないのでステージエディットは後でもよさそうか。
ステージエディットは3Dだと大変だが、まずは2Dで充分じゃないかと思ったのでその方向で進むつもり。テキストファイルに記号でマッピングしたのを読み込めばいいと思うんだ。
いずれにせよPeerCastStationをちょっとばかし優先度高めで進めたいのでゲームの進みはしばらく遅くなりそうかな。