Windows Phone 7でデータベースを使う

WindowsPhoneアプリ開発、始めました(前簡単なアプリ作って公開してたり、ゲーム作って公開してなかったりしてるけど)

ある種の日記めいたアプリを作ってるわけですが、その記録にデータベースを使おうと。プログラミングWindows Phone (MSDNプログラミングシリーズ) という本を参考に書いていたらInsertOnSubmitするところでMissingMethodExceptionが発生。テーブルの定義が変なのか思いと色々探っても解決せず、もうちょい調べてみたら解決法が見つかりました。

http://stackoverflow.com/questions/8907621/insertonsubmit-causes-missingmethodexception

Table属性を指定してあるクラスに引数なしのコンストラクタが必要だったと。

 

これが解決したら今度はSubmitChangesでSqlCeExceptionが発生。データベース上にテーブルが存在しないとか何とかが原因で一旦アプリを削除し再インストールすることで解決しました。

これでようやくSQL周りが解決。開発は続く。

Visual Studio 2012 ProfessionalでXNAを動かしてみた

Visual Studio 2012ではXNAが動かないと評判ですが、下記のURLにインストール方法が書いてあったので試してみました。非公式の方法なので自己責任でお願いします。
API Only - Stack Exchange
ここに書いてある通りでは出来ないというコメントもあるのでアレンジして行った方法を記しておきます。
(0. XNAをインストール)
1. C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\Extensions\Microsoft\XNA Game Studio 4.0のディレクトリをC:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\XNA Game Studio 4.0にコピー

2. 後者のディレクトリのextension.vsixmanifestを開き、10行目のSupportedProducts以下の部分を

<VisualStudio Version="11.0">
      <Edition>Pro</Edition>
</VisualStudio>

に書き換える。Expressの場合はEditionに Express_Allも加えると多分動く(確認はしていない)

3. 後者のディレクトリのProjectTemplates\CSharp\XNA Game Studio 4.0\以下の

  • CSWinPhoneRichApp-v4.0.zip
  • CSXnaWindowsPhoneGame-v4.0.zip
  • CSXnaWindowsPhoneLibrary-v4.0.zip
  • CSXnaXbox360Game-v4.0.zip
  • CSXnaXbox360Library-v4.0.zip

を削除。ProjectTemplates\CSharp\XNA Game Studio 4.0\1041以下にある同名のファイル5つも削除。
VBでのXNA開発を使わないならProjectTemplates\VisualBasicディレクトリもまるごと削除。使う場合は同じような要領でやれば大丈夫かと。
上記のURLには書かれていませんが、この作業をやらないとプロジェクトの新規作成をするときにエラーが出て作成ができなくなります。またこの作業によってXBox360やWindowsPhone上で動かすプロジェクトは諦めることになります。

4. このItemTemplates\VisualBasic\を削除する。これをやらないとファイルの新規作成でエラーが出るようだがよく分からない。

5. C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe に /setup とオプションを与えて実行

こうすることで動作するようになりました。2010で作ったソリューションを開くことができ、ビルドや起動もできます。
WindowsPhoneやXBox360向けXNAアプリケーションができるかは確認していません。また何か不具合が出る可能性もあります。自己責任で。

アルファテスト

技術的なネタを書き留めるべきに思えるので書き始める。今日はXNA4.0でのアルファテストについて。

アルファテストとは、ピクセルのアルファ値によってそのピクセルを描画するかどうかを判定するというもの。昔のXNAではグラフィックデバイスの設定として存在していたのだが、XNA4.0やDirectX10以降などではピクセルシェーダで実装したほうが速いということで設定項目が廃止された。使いたい時はAlphaTestEffectというものを使えという情報があちこちで見つかるが、カスタムシェーダで使うにはどうすればいいのかという情報はあまり見ない。

カスタムシェーダでの実装は実際簡単で、ピクセルシェーダ内でclip命令を呼ぶだけだ。clip命令は数値をひとつ取り、その値が0未満ならばそのピクセルを破棄する。破棄するというのはつまり、画面に描画されずかつデプスバッファなどにも書き込まれないということである。これを利用することで透明なポリゴンを描画するときにデプスバッファ関係で問題が起きるのを防ぐことができる(半透明を扱うのは無理)。

注意点としては、強調したように条件が「0以下」ではなく「0未満」であること。α=0を渡しても破棄されないので、条件式にはαから適当に小さい値を引いたものを渡す必要がある。

参照
AlphaTestEffectなどのHLSLコード Windows Phoneデベロッパーセンター
clip命令のリファレンス

clip (DirectX HLSL)

Windows Phone開発

Windows Phone向けにゲームを作ってみたので感想。
まずWindowsで動くように作ってからWindows Phoneに移植する形で開発した。色々あったライブラリ群をWindows Phone用に機能を限定して移植する作業も一緒に。ライブラリの大半のコードはそのままで動く、かと思いきや微妙に機能が削られている点が多くてなかなか面倒だった。
使えなかったものを挙げていくと、まずExpressionTreeのCompileメソッド。これはセキュリティとかを考えたら仕方が無いのかもしれないし、そもそも普通は使わない。
続いてデフォルト引数機能。何故か使えない。オーバーロード使ったほうがお行儀がいいってことなのか。
それからSortedDictionary。貧弱な環境のために少しでも速くしようと思って使おうとしたらなかった。非ジェネリックのコレクションクラスがごっそりなくなっていたのは分かるがこれは何故。
XNAでのプログラマブルシェーダ。これが使えないのが一番デカイ。でも仕方が無いんだろうな。
Enumの色々なメソッドも使えない。これはC#につい最近追加されたばかりの処理だった気がする。
ジェネリクスでの暗黙的な型変換も気が利かない。自前でキャストしてやればいいだけの話だが。
そしてさっきバグの原因になっていたのがfloatに大きい数を入れた時の扱い。floatで角度を扱うところにRandom.Nextの値を入れた所で判明。Windowsだとfloatに大きいintの値が入ってもなんとかしてくれるのだけど、WPだとNaNになってしまう。CPUのアーキテクチャとかそこらへんの問題なのだろうか。
使えないと言えば、Main関数も存在しない。XNAだとGameクラスのコンストラクタをエントリポイントとして扱っているようだ。それはいいのだが、Windows用のGame1クラスのソースコードをWP用プロジェクトに入れてビルドしたら何故かそのクラスを認識してくれなかった。
ファイル読み込みでFile.Openとか使うと怒られるのも忘れずに。TitleContainer使ってあげましょう。

と色々文句を垂れてみたけれどおおむね快適に開発できる。タッチ操作が面倒だと思っていたが、単純なシングルタッチ操作であればMouseクラスでLeftClickとPositionとして扱えるため何も書く必要がなかった。

作ったのはそのうちマーケットプレイスで公開する予定。ソースコードも公開するかも。

アーケードスティック自作記

アーケードスティックが欲しいが高い、売ってない、置き場所がない、ということでアーケードスティックの自作をやってみた。昔5000円ぐらいで買ったものの操作性が気に入らなくて放置していたアーケードスティックがあったのでそれの改造という方法で作り始めたのだが、筐体からスティックが外れない、ボタンを嵌める構造が変、ということで断念。部屋を見渡してみれば「Amazonのあの箱」が転がっていたのでそれを使って作ることに決定。

では今回のレシピ

  • 直径30mmのセイミツ工業製ボタン(ネジ式)4つ(@\280)
  • セイミツ工業製スティック1つ(レバーボールつき)(\1200)
  • Amazonのあの箱1つ
  • 組紐2本
  • アーケードスティックからもぎ取った制御基板1枚(適当なUSBゲームパッドのもので多分可)
  • 使えなくなったイヤホン2つ(代わりにエナメル線や皮膜線を使うことを推奨)
  • ハンダ少々

必要な道具

それでは材料の調達から。メインの食材となるボタンとレバーは秋葉原の千石電商で買います。他にも置いている店はあるはずだけど。ハンダごてやエナメル線/皮膜線を持っていなければここで一緒に買うのがいいでしょう。ボタンの数は用途によって増減させてかまいません。
さあ工作タイムです。
まずはAmazon箱のフタにボタンとレバーを取り付けます。配置は実際のアーケードコントローラーを適当に真似します。ボタンを取り付ける穴は、固定するためのリング状のパーツの内側を線でなぞってそれに沿ってダンボールを切るとちょうどいい大きさに開けられます。レバーを取り付ける穴はレバーが引っかからないようにそれなりの大きさが必要です。レバーの根本にある円盤状の部品よりもひと二回り小さい正方形で開けるとちょうどよくなります。ボタン穴、レバー穴どちらも加工精度はあまり高くなくても問題ありません。
穴を開けたら今度は取り付けです。ボタンの方は特に問題ないでしょう。レバーの取り付けには本来ネジとナットを使うのですが、ここで組紐を使います。単にナットが見つからなかったから組紐を使ったのですが、穴二つで止めるネジ+ナットよりも線で止める組紐のほうがダンボールへの負荷が小さくなるためよさげです。レバーの土台部分に開いているネジ穴2つに加えダンボールに更に2つ穴を開け、その穴を通してフタの表裏交互に組紐を通していきます。強度を得るためもう一本の紐は一本目と互い違いになるように通して結びます。これで取り付けは完了です。
f:id:masa_m:20120302231443j:image:medium
f:id:masa_m:20120302230703j:image:medium
続いて電子工作タイムです。とは言っても基板にボタンやレバーをつなぐだけです。
ここでイヤホンの線を流用しようとするとひどい目に会います。イヤホンの線の中身はよく分からない素材の繊維と銅の繊維を何本か撚り合わせて作った糸状のもので、皮膜だけ切ろうとすると中の繊維まで切れたり、皮膜を剥こうとすると繊維がちぎれたり、ハンダ付けするときに糸の先端がほつれて扱いにくかったりと非常に面倒です。素直に皮膜線かエナメル線を買いましょう。
イヤホンの線を使おうとしなければただのハンダ付けです。スティックを倒した時の向きとスティックの下のスイッチの位置は上下左右が反転しているので注意しましょう。ボタンやレバーはただのスイッチなのでプラスマイナスを気にする必要はありません。
というわけで完成です。簡単ですね!
http://twitpic.com/8quny0

実際使ってみるとなかなか良好です。ダンボールの筐体ということで耐久性が不安になりますが、水をかけたり台バンしたりがなければ十分に持ちそうです。安い、簡単に作れる、操作性良好、場所をあまり取らない、カスタマイズしやすい、とメリットもなかなか多いので試しに作ってみてはいかが?

書き殴り

ついったーでぶつぶつ言ってたら気分が盛り上がってきたのでまとめて書き散らす。

コミケ終わっていくつかシューティング買ってきて遊んでいて、自分は弾遅い弾幕とか複雑な操作のゲームが苦手だなと再認識したわけだ。
弾遅いのが苦手なのは、CAVEシューとか弾速めのSTGばかり遊んでいるうちにそれに適応して自機を見なくなったから。弾が速いものは自機の周りを広く見て弾道予測して避けるというのが基本で、普通は弾の密度低かったり方向がまとまってたりするので当たらないスペースに余裕があり、予測誤差があまり問題にならない。弾が遅いものは弾の密度が高かったりいろいろな方向から飛んできたりするので当たらないスペースが狭く、正確に弾の軌道を把握しないとならない。そのため自機を、ひいては自機当たり判定を睨みながら避けることになる。そういうわけで弾速いのと遅いのとでは求められる能力がだいぶ違うのであるまる

複雑な操作が得意な人というのはそもそもいるのか不思議なところ。複雑なシステム、複雑な操作を扱いこなせば俺SUGEEE感が出るから採用するのだろうが。操作が複雑で、かつそれを使いこなせないとまともに遊べないゲームというのは言うまでもなく敷居が高い。その敷居を越えさせるためには何度もプレイして慣れてもらう他ないが、まともに遊べないゲームを遊ぶのは基本的に苦痛である。基本的に、とつけたのはまともに遊べない中でも少しずつ先に進めるようになっていて、かつ進むごとにプレイヤーを魅了できれば慣れの過程も楽しいからである。複雑な操作を求めるゲームを作るのであれば、最初は何も分からなくてもなんとか遊べるようにし、そこから段階的に慣れていけるようにするのがよいのだろう。