Xamarin + CocosSharp を使ってみたい ⑧
iPadで画面の向きが変わってしまう問題
Info.plist
にチェックを入れたらiPadでも向き変更抑制が効くようになった。めでたし。
public override bool ShouldAutorotate()
{
return true;
}
public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations()
{
return UIInterfaceOrientationMask.Landscape;
}
CocosSharpのフォント描画
フォントの読み込み方法がわからない。うぐぐ。
ふむ?
/Resource/Content/hoge.ttfとおいて、プロパティから「コンテンツ」を選択すればよさげ?
読み込めた!
が、読み込みがくっそ遅い。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週間かかったなー。