BANXの日記

ゲームとか、たまにプログラムとか。

XNAで製作中のゲーム紹介

以前より少しづつ作り続けている、パズルゲームのご紹介。
元は大学時代に友人が作ったゲームを
少しアレンジしたりしてXNAに移植しています。

基本的なルール
・ブロックには重さが設定されている
・左右の天秤の重さの差が5以上になると半ブロック分、
 10以上1ブロック分天秤の高さが上下する。
 15以上でゲームオーバー。
・3つ同じ色のブロックを隣接させると消える。
 半ブロックずれた状態でも、隣接扱いとなる。


クラス設計はこんな感じ。
f:id:BANX:20120215102511p:image
ゲームのクラス設計はしたことないので我流です。
リファクタリングしやすく、
仕様変更や機能追加などをしやすいように、
を目指して作っています。
例えば、上の図にあるControlBlockは、
実際にはControlBlockを継承したControlBlockDoubleを使用しており、
ControlBlockSingleを生成するように変更すると
落下ブロックがひとつになるように作っています。


ゲームの基本部分はできているので、
いろいろと要素を肉付けしていっている状態です。

ストレージI/O時、ゲームが止まる現象の調査

Xbox Indie Gamesのa Voxel Actionで、自動セーブを行った際に
ゲームが止まる人、止まらない人がいるということで
ちょっと調査してみました。


Picboxというゲームを購入して試したところ、
メニューの遷移に相当時間がかかったので、これもあわせて調査しました。


データ保存機器管理のIndie Games項目 : 2.8GB
Indie Games項目数 : 380


1. Indie Games 全てHDD
a Voxel Action
自動セーブ時に数秒止まる


Picbox
メニューのBEGINNER PUZZLES選択からパズル一覧表示までかなり時間がかかる(時間計測しそこねました)


2. セーブのみUSBに移動
a Voxel Action
自動セーブ時止まらない


Picbox
一瞬でパズル一覧が表示される


3. Indie Games 全てUSB
a Voxel Action
自動セーブ時一瞬止まる


Picbox
1よりは速いが、やはりロードが遅い
メニューのBEGINNER PUZZLES選択からパズル一覧表示まで 2分20秒程度


4. 再度 Indie Gamesを全てHDDに戻す
a Voxel Action
一瞬だけ止まるようになった


Picbox
ロード時間が1分34秒に短縮した(が、やはり長い)


この調査で、想像ですが
・断片化によりアクセス速度が低下する
・ストレージのIndie Gamesに多くのファイルが存在する場合、
 XNAのファイルI/O APIに、処理が重くなる不具合が存在
という問題があるのかもしれないと思いましたがどうなのでしょうか…


ちなみに、ストレージの整備を使ってもアクセス速度は改善されませんでした。
Xboxってフルデフラグとかできないのかなぁ…

QTEについて思う

最近になってもちょくちょく見かけるQTE。
シェンムー時代は画期的だったけど、結局は決まった箇所でボタンを押すだけ、
失敗したらやり直しってのが多いので、今時のゲームでは嫌われがち。
(シェンムーでは失敗しても分岐したりはしてたけど)

で、ふと「映画的演出しつつも普通にプレイするように操作できる場面」を
次世代QTEとして作ればいいんじゃないかなーと思ったら
それはまさにアンチャーテッドなのかもしれないなぁと気づきました。

XNA メモ - 謎の音声再生停止 原因と解決策

XNAでBGMをループ再生させようとした時、
XACTで無限ループに指定したはずの音声が
何故か突然再生停止し、悩まされたのでメモ。


【現象】
XACTで無限ループ指定したはずのCueを再生中、
突然再生が停止する。


【原因】
WaveBankかSoundBankがGCで破棄されていた


【詳細】
1. LoadContentメソッドでAudioEngine、WaveBank、SoundBankを生成
2. 生成したSoundBankからCueを取得
3. AudioEngine、Cueはメンバ変数として保持
4. WaveBank、SoundBankは保持していなかった
Cueはメンバ変数として保持していたため破棄されていなかったが
Cueに紐付くBankがGCで破棄され、Cueの再生が停止していた。
この時、CueはIsPlayingもIsStoppingもIsPausingもIsDisposingもfalseという
不思議な状態になっていた。


【解決策】
生成したWaveBank、SoundBankをメンバ変数として保持することで
GC対象とならないようにする

Macbook Air、Boot Campの不満点

Macbook Air購入から約1ヶ月。
主にBoot CampでWindowsを使用していて、
Boot Campはどうやら完全ではない事に気づきました。


実際に使ってみて、下の症状に悩まされていました。
・ヘッドセットプロファイルのBluetooth機器をペアリングできない
Boot CampでWindowsを使用中、本体が高温になりキーボードまで熱くなる


それぞれについて調べてみると、
Boot CampBluetoothドライバではA2DPプロファイルの機器が使えない
Boot Campのファン回転数コントロールドライバは、かなり高温にならないと回転数が増えない(2000回転固定という説も)
ということがわかりました。


ファン回転数については、Lubbos Fan Controlというフリーソフトを使用することで
何℃になったらファンの回転数をいくつにする、という設定を行えるので
それで解決できました。
Macbook Pro用のように記載されていますが、Airでも使用できました。
http://sourceforge.net/projects/lubbofancontrol/


Bluetoothについては、他のPC用のドライバを入れるなどすれば使えるようですが
Magic MouseをWindowsで使っていることもありあまり非公式的なものを入れたくないので、
現在はBoot Campの対応を待つことにしてみました。


これらの問題(?)は、どうやらかなり昔から指摘されているにも関わらず
なかなか対応されていない状態のようです。
もちろん、その他対応されてきているものも多数あるようですが…


特に発熱に関しては、Macbook Airの寿命自体に関わりそうなことなので
公式で対応してほしいものです。