アプリ置き場

アプリ置き場

http://www.moreread.net/

Xamarin + CocosSharp を使ってみたい ⑧

iPadで画面の向きが変わってしまう問題
 
Info.plist

にチェックを入れたらiPadでも向き変更抑制が効くようになった。めでたし。
public override bool ShouldAutorotate()
{
    return true;
}
 
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
{
    return UIInterfaceOrientationMask.Landscape;
}
 
 
CocosSharpのフォント描画
 
フォントの読み込み方法がわからない。うぐぐ。
CCLabel label = new CCLabel(string, "/Resources/Fonts/hoge.ttf", font.size);
 
ふむ?
/Resource/Content/hoge.ttfとおいて、プロパティから「コンテンツ」を選択すればよさげ?
CCLabel label = new CCLabel(string, "hoge.ttf", font.size);
読み込めた!
 
が、読み込みがくっそ遅い。Labelの数が多いと使うのは不可能なレベル。
CCLabel生成すると、それぞれフォント読み込んでるくさいなぁ。
 
あとCCRenderTextureに描画しているんだけど、初回描画はアンチエイリアシングOFFにしてもぼやける。一度描画して文字列変えたらようやくOFFにある、なんじゃこりゃ。
 
文字列描画まわりもあやしいなぁ。
できるだけ画像リソースで文字列をもっておいて描画するしかないか。。。
 
 
ロケールの判断
 
iPhoneで常にen-USじゃねーか(怒)
CultureInfo.CurrentCulture //en-US
 
しょうがないのでiPhoneネイティブで取って渡す。
だんだん構造がきたなくなってくるぞお。
NSLocale.CurrentLocale.LocaleIdentifier //ja_JP
 
 
Android版のログ出力抑制
 
AndroidEnvironmentで設定すればいいらしい
MONO_LOG_LEVEL=message
 
 
広告対応
 
AdMob登録後、
をNuGetしてきて、適当にこのへん見たりして実装してみる。
 
must be called on the main UI thread.
っておこられた。RunOnUiThreadというのを使うらしい。
activity.RunOnUiThread(() =>
{
    if (interstitialAd != null && interstitialAd.IsLoaded)
    {
        interstitialAd.Show();
    }
});
 
Interstitial広告は閉じると再度ロードが必要らしい。
AdListener.OnAdClosedでもっかい作る。
public override void OnAdClosed()
{
    base.OnAdClosed();
    interstitialAd.Dispose();
    //requestInterstitialAd();
}
 
 
アプリ名(Android)
 
アプリ名がどこ設定していいかわからなくて悩む。Activityのラベルだった。
[Activity(Label = "ここ", MainLauncher = true, Icon = "@drawable/icon", AlwaysRetainTaskState = true, LaunchMode = LaunchMode.SingleInstance, ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.Keyboard | ConfigChanges.KeyboardHidden)]
public class MainActivity : Activity
 
 
アイコンの作成
 
必要なアイコンをまとめて作ってくれるWebアプリ。すばらっ!
 
パワポでシートを正方形にして、適当に高解像度の画像を作る。
それをPNG出力して、先ほどのサイトに食わせると、30種類くらいの画像ができました。まじか、そんなに使うのか……。
 

 
 
Androidアプリのライフサイクル
 
ライフサイクルとか全然きにしてなかったけど、ふと戻るボタン押したらActivity死ぬじゃないの。初代Xperia時代から久しぶりの開発で、完全に忘れてた。
とりあえず、下記で戻るボタンをHOMEボタン化できた。
public override bool OnKeyDown([GeneratedEnum] Keycode keyCode, KeyEvent e)
{
    if (keyCode == Keycode.Back)
    {
        Intent homeIntent = new Intent(Intent.ActionMain);
        homeIntent.AddCategory(Intent.CategoryHome);
        homeIntent.SetFlags(ActivityFlags.NewTask);
        StartActivity(homeIntent);
        return true;
    }
    return base.OnKeyDown(keyCode, e);
}
 
あとは、Sleepボタン押したとき、他のアプリが動いたときにたまにActivityは死ぬ。
死んだら、CCSpriteやCCLabelなど、CocosSharpのUIコンポーネントのバッファがおかしくなってる。作り直さないとだめぽい。
もう完全にプロセス死んで再起動したほうがましなんだが……。なんでこんなゾンビ状態で動いてるの。プロセス殺す命令はAndroid5.0かららしい。4.xで動かしたいしなぁ。
 
 
ようやく
公開できそうなくらいにはなってきた。
くっそー1週間で作ったゲームの移植に3週間かかったなー。
iPhoneAndroidの知識の不足分を除いても、なかなかの地雷原ぷりでイニシャルコストは結構高いんじゃないかな。でもメンテは楽だと信じてる。あとやっぱC#だけで書けるのが大きい。