Silverlight で XNA のコンテンツプロパインを使うためのプロジェクトファイルへの追加書き込み

なんか毎回忘れているのでメモ書き。

csproj ファイルをテキストファイルで開き、Project タグ以下に以下のタグを追加する。

<PropertyGroup>
   <XnaContentProject>..XXXXSampleContentProjectXXXXSampleContentProject.contentproj</XnaContentProject>
</PropertyGroup>
<Target Name="BeforeBuild">
   <MSBuild Projects="$(XnaContentProject)" Properties="XnaContentPipelineTargetPlatform=Windows;XnaContentPipelineTargetProfile=Reach" />
   <CreateItem Include="$(XnaContentProject)">
     <Output TaskParameter="Include" ItemName="XnaContentProjectItem" />
   </CreateItem>
   <CreateProperty Value="%(XnaContentProjectItem.RelativeDir)">
     <Output TaskParameter="Value" PropertyName="XnaContentProjectPath" />
   </CreateProperty>
   <CreateItem Include="$(XnaContentProjectPath)cachefile*targetpath.txt">
     <Output TaskParameter="Include" ItemName="XnaContentCacheFile" />
   </CreateItem>
   <ReadLinesFromFile File="@(XnaContentCacheFile)" Condition="Exists(@(XnaContentCacheFile))">
     <Output TaskParameter="Lines" ItemName="XnaContentOutputs" />
   </ReadLinesFromFile>
   <CreateItem Include="@(XnaContentOutputs->'$(XnaContentProjectPath)binAnyCPU$(Configuration)%(Identity)')" AdditionalMetadata="Link=Content%(RelativeDir)%(Filename)%(Extension)">
     <Output TaskParameter="Include" ItemName="Content" />
   </CreateItem> </Target>

ただし、プロジェクトをビルドしたりなんかしているといつの間にか以下のようなコメントが csproj ファイルの中に追加されていて、前に追加したタグもすべてコメントアウトされていることがある。

To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets.

実はコメントアウトされたタグの下にまったく同じタグが再度追加されているが、なぜかこのコメントアウトされたものが残っていると正しくコンテンツパイプラインが動作しない。なのでコメントをすべて削除して再ビルドする必要がある。

メモ書きなので環境によっては動作が異なる場合があるので注意してください。

]]>

しゃべりながらゲーム制作やってみます #19 開発環境移行

すみません、動画を投稿していたのにブログのほうで告知するのを忘れていました。

開発環境を移行していたので、しばらく動画投稿できていなかったのですが、1か月ぶりに再開しました。今回は番外編ということで開発環境移行についていろいろ話しています。

番外編なのでほんとは18.5とかにしようと思ってたのですが、番号を並べた際にここだけ浮いちゃうので19にしました。(^^;)

]]>

しゃべりながらゲーム制作やってみます #17 XNA!!

ゲームデモ版第1弾をリリースしましたので動作環境を変えてみました。環境は「Silverlight」から「Silverlight + XNA」になってます。また、追加フレームワークとして「Silverlight 5 Toolkit」と「SilverSprite」を導入しています。

新環境に移ったせいもあるか、収録時に予定通りに進まなかったので時間が長くなってしまいました。

]]>

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 で公開していいのか不明だからです。一応確認してみますが、運がよければ公開します、ぐらいで思っていただければと思います。

]]>

[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 が絡んでくる場所なので書いておきました。

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

]]>

Windows Phone 7 のゲーム開発でのタッチ操作 残り

前回1回目のほかに2~4回目分もアップしました。ちなみに並び順がおかしいのは記事を自動生成する際にまだ並び順を指定できていないのでそのうち直します。

]]>

Windows Phone & XNA の記事

古い記事になってしまうのですが、以前 Tech Fielders コラム にWindows Phone と XNA でタッチ操作の基本を学ぶ記事を載せていました。ですが、現在その記事(ほかの記事含め)閉じられている状態になっており、資料も ZIP ファイルとしてしか公開されていないので sorceryforce.net のほうに移行することにしました。

とりあえず今回は全4回のうちの第1回目を載せてします。でき次第順次載せていきたいと思います。

まあ古い記事なんで、今となってはあまり使われないかと思いますが、参考にはなると思うので、必要な方はご覧になってください。

]]>

MonoGame の SoundEffect.Play メソッドで未定義エラーが発生する原因について

国内にはさっぱり情報がないので海外のサイトを調べていたのですが、いくつかのサイトでは SharpDX の参照 DLL が間違っているせいという答えが書かれていました。しかし情報としては数か月前のものであり、実際に参照を見ても最新版では間違っているようには思えませんでした。

もう少し調べてみたら下記のサイトを見つけ、内容の通りに修正してみたら見事解決。情報が少ないと割と自力解決しなければいけないので苦労しますね…。

]]>

Windows 8 RTM でのソフトウェア動作状況

Windows 8 を物理 PC に入れてソフトウェアをインストールしたり起動したりしています。とりあえずメモ書きですが動作するものしないものを記載しておきます。Windows 8 はインターフェースががらりとわかっているようなイメージですがカーネルレベルでは Vista 以降と互換性があるのでぜんぜん動かない!っていうものはあまりないですね。

インストール環境

  • Windows 8 RTM x64
  • 第3世代 Core i7
  • メモリ 16GB

インストール系ソフトウェア

  • ○ : 有効確認済み
  • × : 動作不可
  • △ : 警告表示、動作未確認
  • - : 動作未確認
ソフトウェア バージョン インストール 実行
Adobe Reader X 10.1.4
Canon MP Navigator EX 1.0
CLIP STUDIO PAINT 1.0.3
ComicStudioPro 4.1.1
Dropbox 1.4.12
EmEditor Free 6.0.28
Explzh for Windows (64bit) 7.0.5
Google Chrome  
IcoFX 1.6.4
LimeChat (64bit) 2.40
ManyCam 3.0.80
Microsoft Expression Blend 4 4.0.20621.0
Microsoft Expression Design 4 7.0.20516.0
Microsoft Expression Encoder 4 Pro 4.0.1651.0
Microsoft Expression Encoder 4 Screem Capture Codec 4.0.1651.0
Microsoft Expression Web 4 4.0.1166.0
Microsoft Garage Mouse without Boaders 2.1.0.9
Microsoft Silverlight 5 SDK 5.0.61118.0 -
Microsoft SQL Server 2012 Management Studio  
Microsoft Visual Studio 2010 Professional 10.0.30319
Microsoft Web Platform Installer 3.0 3.0.5
Microsoft Web Platform Installer 4.0 4.0.1622
Paint.NET 3.5.10 3.60.0
Sandcastle Help File Builder 1.9.4.0
SuperTagEditor  
tangible T4 editor plus modeling tools V2 (VS2010) 2.0.2 -
Web Standards Update for Visual Studio 2010 SP1 1.0.4 -
Windows Live Mesh 2011  
Windows Live Mail 2011  
Windows Live Writer 2011  
Zune Software 4.8
午後のこ~だ 3.13
Windows Phone SDK 7.1   -
MP3Gain 2.5
Microsoft ASP.NET MVC 4  
XNA Framework Redistributable 4.0 Refresh 4.0.30901.0 -
ワコム タブレット 6.3.3-4 -
XNA Game Studio 4.0 Refresh   -
       
       
       
       
       
       

単独実行ソフトウェア

ソフトウェア バージョン 実行
Tween 1.3.7.0
ねむねむ 2.11
ラステイル 4.0
エルフレイナ 1.22 ○ (DirectX ランタイム要)
     
     
     
     

他にも試したものがあればまた書き込みます。

]]>