ホームページ「sorceryforce.net」の実行環境を変更しました

内部フレームワークを変えただけなので見た目とかは特に何も変わっていません。

開発環境を Windows 10 や Visual Studio 2015 に移行したりしていたのですが、ついでなのでホームページを動かしている ASP.NET の中身もいろいろバージョンを上げてみました。もし挙動などがおかしければコメントいただけると助かります。(WordPress 側は特に変えてないのでブログのほうは大丈夫だと思います)

一応変えてみたものは次の通りです。

  • ASP.NET 4 → ASP.NET 4.5.2
  • .NET Framework 4 → .NET Framework 4.5.2 (サーバーがいつの間にか 4.5 対応していたので上げました)
  • Entity Framework 5 → Entity Framework 6.1.2 (4→5 みたいに API 変わってなくてよかったです)
  • jQuery 1.8.2 → jQuery 1.10.2

ただ、Web サーバーのほうが権限の問題で Roslyn を使おうとするとアクセス権エラーが発生してホームページがまったく動かなかったので、web.config から「system.codedom」を抹消して使用しないようにしました。というか自作サーバーでテストしていたときは普通に動いていたのに、いざ本番ホームページサーバーにあげたら不明なエラーが発生して動かなかったので結構焦りました。一時期ホームページが開けなくなっていたのはこのためです。

ちなみに、作り直す前のプロジェクトを VS2013 から VS2015 に移行した時に図のような警告が出ていたので、SQL Server 2012 Express LocalDB を入れようかと思ったのですが、新規に作り直した時に認証系などをすべて外したので警告は出なくなりました。

2015-09-09 20_17_36-Microsoft Visual Studio


3Dモデルアニメーションソフト「エルフレイナ」Ver 1.25 公開しました

不具合の修正版になります。起動するたびに開いているドッキングパネルの高さが狭くなっていく現象がありましたので修正しました。


MonoGame を使って MADOSMA (Windows Phone) で動くゲームを作ってみた検証メモ

前振り

日本でも Windows Phone 8.1 が搭載されたスマフォ(MADOSMA) が発売され、ようやく Windows Phone アプリ開発にも本腰が入れられるようになりました。正直今までは Windows Phone 自体が日本になかったので(7.8 には目をそらしつつ)、Windows Phone アプリの開発についてもほとんど触れていませんでした。

ですが、最近はユニバーサル Windows アプリ(UWP)開発なるものが出てきて、Windows Store App と Windows Phone 8.1 のアプリを同時開発できるなど、WP 開発の敷居も少し下がったような感じがします。MonoGame でも最新バージョンではこの UWP に対応したりしています。

ということでせっかく MADOSMA も入手したので、MADOSMA で動くゲームを作ってみようかと思いました。

しかし、ここで問題になるのは MonoGame を使ってちゃんと WP で動くゲームを作れるか、ということです。正直これは作ってみないとわからないのですが、かといってかなり作りこんだ後に、「実はパフォーマンス上の問題が…」「実はリソースの問題が…」なんてことになったら元も子もないので、やはり事前に調査は必要になってくると思います。

が、さらに問題になるのは、その検証するのを作るのもかなり大変だということです。「とある機能」を検証すること自体は必要な機能の数だけ検証すればいいのですが、実際に出来上がるゲームは多数の「とある機能」が複雑に絡み合って動くものなので、こればかりは実際にゲームを構築したあとにならないとわからないものです。

とまあ結局何が言いたいのかというと、1から作って検証するのもめんどくさいので、すでに作ったゲームでとりあえず動くか検証しようというのが今回の話です。

動かすゲーム

私の実況動画でもたまに出していますが、以前 Windows ストア向けに作ったゲームがあって、それをそのまま Windows Phone で動かしてみようと思いました。

エイッとウォーズ」というゲームなのですが、タッチでキャラクターを動かして戦わせるというシンプルなゲームです。タッチ操作前提のゲームなので、意外とそのまま Windows Phone に移植できるんじゃないかと思いました。

222

シンプルなゲームとは言っても数百のスプライトを60FPSで動かすという意外に負荷のかかるゲームです。これが Windows Phone で動けばゲーム制作に希望が持てるので、検証するにはもってこいのゲームだと思いました。

移植

エイッとウォーズ」は「Windows 8」向けのゲームです。今回「UWP」として作り直すので、UWP プロジェクトを新規で作り、Windows 8 時代のコードをそのまま持ってきました。MonoGame のバージョンも 3.0 から 3.4 に上がるので、フレームワークに差異がないか(多少は)心配しましたが特に問題ありませんでした。(さすが XNA)

コンテンツ(画像などのリソース)については XNA Framework のコンテンツパイプラインを使わず MonoGame のコンテンツパイプラインで作り直しました。SpriteFont で一部ビルドできないフォントがあったので別なフォント名にしましたが、それ以外については問題なくコンパイルできました。MonoGame でのコンテンツの作り方は以下のページにまとめてあります。

コードについてはほぼ変えていません。1か所だけ、マウスカーソルを表示するように設定していると WP で実行時にアサートが発生するのでシンボル条件で WP では表示しないようにしました。これだけです。

で、実行した結果の写真です。MADOSMA でゲームが動きました。ちゃんとタッチして操作できます。

WIN_20150705_181947

何気に 60 FPS で動いているものすごいです。一部のステージではキャラ数が多すぎて 50 FPS ぐらいには落ちるのですが、スマフォのせいかはわかりませんが遅延しているようには感じられませんでした。XNA のころは WP は標準 30FPS に設定しているぐらいなのでたぶん問題ないのでしょう。

 

と、オールクリア的な書き方をしているのですが、やはり WP ならではの問題はありました。解決未解決も含めて3つほどありましたので書いておきます。

アクションセンターが邪魔

WP 特有の機能です。普通に WP を使っている場合は縦向きで上から指を下にスライドするとアクションセンターが表示されます。このゲームは横向きなので左側から指をスライドするとアクションセンターが出てきます。

このゲームはキャラクターを移動させるためにキャラをタッチしてスライドして移動するのですが、キャラクターが左端にいるときに移動させようとするとアクションセンターが移動します(おまえじゃない)。

画面外からスライドしてアクションセンターが出るのであればまだ許容はできたのですが、ゲーム内の1キャラ分画面内をタッチしてもアクションセンターが反応するので厄介でした。Windows タブレットのころもチャームなどサイドから出てくるメニューはあったのですが、あちらは画面外からタッチしないとでないのでなんとかなったのですが WP はそうはいきませんでした。

とりあえず対応策としてはキャラクターの移動できる範囲を両サイド 50px ほど中にせばめました。狭めたところで難易度はほとんど変わらないのでこれで対応することにしました。

音が遅延してくる

最初普通にプレイするには全然問題なかったのですが、しばらくゲームしてると、効果音に雑音が入るようになってきました。ゲームを続ければ続けるほどよりひどくなります。最初は雑音かと思っていたのですがよくよく聞いてみると音の再生スピードがだんだん遅くなってくるような感じに聞こえました。

原因は定かではないのですが、このゲームはやたら効果音が再生されるので、内部バッファ的なものが溜まりすぎてうまく音声が調整できなくなったのではないかと思います。ちなみに BGM (MonoGame では Song クラス)の再生の方は問題ありませんでした。(要は BGM は普通に聞こえるのに効果音がおかしくなる状態)

これはプログラムで対処しました。効果音の再生には「SoundEffect.Play」を使用しているのですが、このメソッドは連続で使うと内部的に「SoundEffectInstance」をプールします。おそらくこのインスタンスをプールするあたりの制御がうまくいってないような感じがしたので、「SoundEffect.Play」メソッドは使わず事前に「SoundEffectInstance」を作成してプログラム側でこれを使いまわすようにしました。とりあえず全クリするぐらい耐久テストしてみましたが今のところ再生される音が遅延することはなくなりました。

ゲームをプレイしていると勝手にサスペンドする

未解決でありながらやっかいな現象です。

ゲームをしていると画面が止まります。

一瞬ハングしたのかと思ってしまうのですが、「アプリ間の切り替え」画面をいったん表示させて再度ゲームを選択すると停止した状態から動き出します。なのでおそらくサスペンドしてしまっているのではないかと思います。

原因が全く分からないので、どういったタイミングで停止してしまうのかを調査してみました。するとどうやらタッチ操作をしたタイミングで停止するようです。もちろん毎回ではなくタッチしてもまったく止まらないこともあれば止まることもある、という状態です。

タッチ系の処理が悪さをしているのかとおもって「TouchPanel.GetCapabilities」や「TouchPanel.GetState」「Mouse.GetState」など関連しそうなところをつけたり消したししてみましたが、処理を入れなくても停止するようでした。

ちなみにどの状態でも停止するかというとそういうわけでもなく、MonoGame を新規で作った時にできるサンプルコードを実行したときはいくらタッチ操作をしても停止することはありませんでした。おそらく高負荷な状態で発生しているような気もしました。

さらにコードのどの部分で停止しているかも調査してみました。すると Game.Draw メソッドが終わった後なので、停止場所はフレームワーク内部ということになります。ちなみに停止している間は Update メソッドも Draw メソッドも呼ばれないので、残念ながら手をつけられる範囲ではないようです。

まとめ

まあ、まとめることは特にないのですが、とりあえず MonoGame で Windows Phone 向けのゲームを作るのは「あり」だと思います。最後の未解決問題の件はありますが、「高負荷な状態」「頻繁にタッチをする」という条件下で発生するようなので、そういう形にならないように作ればなんとかなるのではないかと思います。仮に停止してしまったとしてもいったんアプリ間切り替えに移動して再度ゲームを選択してもらえば一応続けられます。この問題が WP 全体の問題なのか MADOSMA だけの問題なのかわからないので、別な環境でもおいおい調査してみたいと思います。

ちなみに調査用に移植したこの「エイッとウォーズ」なのですが、Windows Phone アプリとして公開するかどうかは微妙です。なぜかというとこのゲームの元はコンテスト用に作ったものなので、Windows Phone で公開していいのか不明だからです。一応確認してみますが、運がよければ公開します、ぐらいで思っていただければと思います。


3Dモデルアニメーションソフト「エルフレイナ」Ver 1.24 公開しました

報告をうけた不具合がありましたので修正してバージョンアップしました。

アニメーションモードに移行したときにモデルの線表示を ON にしても表示されない不具合を直しています。


ビルド時に「MakePRI : warning 0xdef00520: Invalid qualifier」の警告がでる原因

メモです。

「.NET for Windows Store apps」を参照しているプロジェクトにおいてビルドすると「MakePRI : warning 0xdef00520: Invalid qualifier:xxxxx」という警告がでる場合があります。

原因がわからなく、そのままでも問題なかったので放置していたのですが、原因がわかりました。

プロジェクト内にファイル名が「xxx.xxxx.xx.txt」のように複数のピリオドを持つファイルが含まれていると警告が出るようです。ファイル名を変えたらでなくなりました。


[MonoGame] カスタムコンテンツプロセッサーを利用した高度な日本語表示を行う

日本語の表示となるとゲームプログラムにおいては相変わらず不得意な分野になるのですが、もちろん MonoGame でも同様です。

標準の SpriteFont では英数字ぐらいなら問題ないのですが日本語を含めると高確率で壁にぶち当たってしまいます。

Tips ではその問題を解決するために「ひにけにGD」さんのサイトで配布されている XNA での日本語描画の仕組みを使い、MonoGame で代用できるようにしてみました。


MonoGame の Tips 始めました

最近 MonoGame の更新が Win10 対応や VS2015 対応とかで積極的になっているようなので、MonoGame に関連する Tips でも作っていこうかなと思いました。

ただ、今回の Tips は連載的なものではなく、気づいた点があったら書き込んでいくという形になるので不定期な更新になると思います。(とは言っても今までも不定期でしたが…)

あと、書くお題については初心者にもわかるように初歩的なものから順番に、というものにはならないと思います。そもそも MonoGame は XNA Framework のクラスライブラリなどをベースに作られているものなので、入門的なプログラムについては XNA の Tips を見れば大体動かせると思います。一応私の方でも以前に XNA の Tips の入門的なものは書いているので、プログラムでわからないことがあればそちらをご覧ください。

そのため、今回書く MonoGame の Tips は以下のようなものになると思います。

  • MonoGame 専用の Tips
  • ゲームプログラム中級者あたりを目安にした Tips

前述通り、初心者向けの Tips については XNA の Tips にあるものを見ていただければある程度わかると思います。今までゲームプログラミング Tips は入門的な部分を書くのに手一杯だったので、今後は少し高度な Tips とかも書いていきたいと思っています。

 

さて今回、MonoGame を始めるにあたっての Tips を3つほど書きました。MonoGame での開発を始めるにあたっての最初の部分なのですが、一応 MonoGame が絡んでくる場所なので書いておきました。

あともう一つ「コンテンツ・パイプライン」について書く予定なのですが、ちょっと時間がかかりそうなので、こちらはでき次第上げたいと思います。


[XAML] 数字で始まるフォルダを作成して埋め込まれたリソースをいれるとパスがかわる

ちょっとハマってしまったのでメモ。

ソリューションのフォルダ構成で「XXXX/YYYY/000_ZZZZ」みたいなフォルダを作り、「000_ZZZZ」フォルダの中にリソース(XAMLとかmp3とか)を入れていました。リソースは「埋め込まれたリソース」として登録し、実行時に動的に読み込むようにしました。

この場合は「Assembly.GetManifestResourceStream」メソッドで読み込むことになるのですが、パス指定では以下の注意点が挙げられます。

  • パス区切り文字は「. (ピリオド)」になる
  • パスの最初に「名前空間」をいれ、ピリオドを挟んだ後プロジェクトのルートからの相対パスを書く
  • 大文字小文字は区別される

一応これらを注意して書いたのですが、実行時にどうしても null が返ってきてしまいます。

どうしてもわからなかったので「Assembly.GetManifestResourceNames()」メソッドで中身を調べてみたところフォルダのパスが「XXXX.YYYY._000_ZZZZ」のようになっていて数字から始まっているフォルダ名の最初に「_ (アンダースコア)」が追加されていました。とりあえず読込パスを同じようにアンダースコアを入れてみたところ正常に読む込むことができました。

ハマりそうなので注意が必要ですね。


チェックリスト管理ソフト「ラステイル」Ver 4.03 を公開しました

小規模バージョンアップです。細かい改善と影響度の低い不具合を修正しています。ひさびさのバージョンアップなのですが、ラステイルは基本的な機能は一応実装済みなので、今後も小規模なバージョンアップ対応になるかと思います。まあ、実際はその時にならないとわからないんですけどね。


3Dモデルアニメーションソフト「エルフレイナ」Ver 1.23 公開しました

ひさびさのバージョンアップです。今回は小規模のバージョンアップで主に不具合対応となっています。内容としては一部の環境で起動できない問題への対応とモデルデータ保存時にエラーが発生するパターンがあることへの対応です。

ほとんどバージョンアップができていないのですが、その主な要因は使っているフレームワークの移行先が現在ないってことなんですよね…。今までは候補が出てきては消え、出てきては消えと繰り返し、おそらく今後はもうでないと思っています。

開発環境もまだ最新版で行えていますが、今後対応されなくなる可能性もあるかもしれないので心配です。