アプリ置き場

アプリ置き場

http://www.moreread.net/

Xamarin + CocosSharp を使ってみたい ⑥

回転抑制
画面の向きを変えると表示位置がおかしくなる。
手持ちのAndroid機にいたってはフリーズ。どうすれば……。
→ めんどっちいからとりあえず横向き固定化だ!
 
ここを参考にまずiOS
UIViewControllerを継承したクラスにて
public override bool ShouldAutorotate()
{
    return true;
}
 
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
{
    return UIInterfaceOrientationMask.Landscape;
}
としてみるが、シミュレータでは期待通りに動作だが、実機(iPad mini)ではまったく効果なし。回転しまくり。わからん。
[Export("application:supportedInterfaceOrientationsForWindow:")]
public UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, IntPtr forWindow)
{
    return UIInterfaceOrientationMask.LandscapeLeft;
}
各所で見かけたAppDelegateのおまじないも効果なし。
 
解決の糸口がつかめぬまま数時間、あーでもないこーでもない。しかし、ふとiPhoneで試すと問題なく回転を抑制できてた。どういうこと……。iPadで回転しないゲームとかあるよね?iPadiPhoneで何が違うの……。iPadは一旦保留で。
 
Androidマニフェスト弄ればいけた。
<application android:label="RetroAction.Android" android:largeHeap="true">
    <activity
        android:name=".MainActivity"
        android:screenOrientation="landscape" >
    </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ネイティブ造りにしないと無理そうだ。