Xamarin + CocosSharp を使ってみたい ⑥
回転抑制
画面の向きを変えると表示位置がおかしくなる。
手持ちのAndroid機にいたってはフリーズ。どうすれば……。
→ めんどっちいからとりあえず横向き固定化だ!
ここを参考にまずiOS。
UIViewControllerを継承したクラスにて
public override bool ShouldAutorotate()
{
return true;
}
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
{
return UIInterfaceOrientationMask.Landscape;
}
[Export("application:supportedInterfaceOrientationsForWindow:")]
public UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, IntPtr forWindow)
{
return UIInterfaceOrientationMask.LandscapeLeft;
}
各所で見かけたAppDelegateのおまじないも効果なし。
解決の糸口がつかめぬまま数時間、あーでもないこーでもない。しかし、ふとiPhoneで試すと問題なく回転を抑制できてた。どういうこと……。iPadで回転しないゲームとかあるよね?iPadとiPhoneで何が違うの……。iPadは一旦保留で。
<activity
</activity>
</application>
ついでにandroid:largeHeap="true"というおまじないもつけておいた。
バックグラウンドからのレジューム対応
iOS(ipad mini4)で復帰時に音が戻らないことがある。なんで?
iphone7は問題ないぽいな。性能依存だろうか。
それとも、レジューム周りの処理は自分で書く必要があるのだろうか?
ふむふむ。Androidは勝手にやってくれると。
iOSはテンプレートにCCGameView.pause = true / false は書いてあったな。
CCGameViewの中を見るとちゃんとpauseのsetterでAudioのPauseとResumu呼ばれてる。うーん。
public bool Paused
{
get { return paused; }
set
{
if (gameStarted && paused != value)
{
paused = value;
previousTicks = gameTimer.Elapsed.Ticks;
if (paused)
{
AudioEngine.PauseBackgroundMusic();
AudioEngine.PauseAllEffects();
}
else
{
AudioEngine.ResumeBackgroundMusic();
AudioEngine.ResumeAllEffects();
}
PlatformUpdatePaused();
}
}
}
いろいろ試してたところ、Preloadしたら直った気がする。原因は不明。メモリ食いそうだからPreloadはSEだけにしてたんだけどまぁいいか。
CCAudioEngine.SharedEngine.PreloadBackgroundMusic(path);
端末再起動
テストしてるとiphoneが画面真っ黒操作不能になってびっくり。スリープボタン長押しもきかない。調べたら1段階上の強制終了として[音量下げボタン]+[スリープボタン]長押しがあるそうで。
動作を軽くする
CCDrawNodeは可能な限り再利用しつつ、矩形描画等は最小限に、CCLabelもDictionaryにキャッシュした。加えて、フレームレートを30FPSに下げた。
といっても、ロジックは60FPSで組んじゃったので描画だけ間引く。
そしたらそこそこ動いてるかな。
60FPSでぬるぬる動かすにはCocosネイティブ造りにしないと無理そうだ。