scheduleUpdateが動かない?!
[self scheduleUpdate];とか[self schedule:@selector(update:)];とかが軒並み動かなくなった。焦った。
2時間ほど調べまくった結果、onEnterをオーバーライドした際にスーパークラスの内容を呼んでなかった。
エラーも出ないからはまった。
リリース申請前でも、Gamecenterを使いたいならAppを登録する必要あり
development環境ではsandboxというGamecenterにつながります。ここにつなぐために、Appを登録申請する必要がある。
詳細はどこぞのサイトで調べてもらうとして、
- AppIDを登録(Bundle Identifierが大事)
- Provisioningを作成(AppID、Develep環境、対象HWを設定)
- XcodeでProvisioningを読み込む
- itunes conncetでApp登録(アプリ紹介文書かないといけないがあとで直せる)
- Xcode上でBundle IdentifierやらProvisioningを設定
- gamekitをくみこむ
ここまで準備しておいてから、Gamecenterを使うテストコードを投入。
いろいろ探してみたけど、AppDelegateに組みこんじゃうコレがらくちん。
Game Center Tutorial for iOS: How To Make A Simple Multiplayer Game: Part 1/2 | raywenderlich.com
これはmultiplayerのチュートリアルだけど、前半部分のコードでテストできる。
ここでGamecenterの画面が自動で出てこないならここまでの行程の何かおかしい。悩め。
あとは【iPhoneアプリ、cocos2d】アプリをGame Center対応にする方法(後編: プログラミング編) - 夏までにiPhone アプリつくってみっか!を参考にしながらGamecenterのランキングを表示させる画面を作る。この例では新たにsceneを起こしてるけど、単にUIViewControllerを追加したところにgamecenterの画面を載せてるだけだから、例えば既存のTitleSceneとかのボタンを押したあとのアクションなんかに書いてやればいい。
AppID周りはとにかくややこしい印象だったけど、一度通過すれば理解できる。
Gamecenterに対応したアプリを作成する
簡単なシューティングゲームを作ったものの、GamecenterでLeaderboardを使わないと味気ない。一人でハイスコアを目指すよりもみんなのスコアが見れた方が楽しいよね!やり込み度があがるよね!
ということでcocos2dを使いつつGamecenterに対応させる方法をメモ。
スプラッシュ画面が一瞬横になる?
cocos2dのテンプレートはLandscapeだが、今回作成しているアプリはPortrait。そこで設定を変更したのだけれど、スプラッシュ画面から遷移するときに一瞬横向きにスプラッシュ画面が出てしまう。
なんでだー!と思い、ソースを追ってみたところ意外と盲点で驚いたのでメモ。
IntroLayer.mのinit内で
if( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone ) {
background = [CCSprite spriteWithFile:@"Default.png"];
background.rotation = 90;
と書かれているため、rotation=90;の行をコメントアウトして対処完了。
ちゃんとソース読めっちゅうことやね。
Webで解決策が出てこなかった件
AppDelegateに変数を定義し、各クラスで#import "AppDelegate.h"を実施しているものの、AppDelegateはundeclaredになりerrorになった。In detail,
AppDelegate * appDelegate = [[UIApplication sharedApplication] delegate];
ここでエラーが出る。
二時間ほど試行錯誤した結果、原因が判明。cocos2dを使っているせいかは不明だけど、よくよくソースを読むとAppDelegateの中でAppDelegateはimplementされていない。
@interface AppController : NSObject
{
look!
Therefore, 以下に書き換えたらエラー解消。
AppController * appDelegate = [[UIApplication sharedApplication] delegate];
教訓。
- importするソースくらいはちゃんと目を通そう
- Web上の情報は常に完全ではない
なぜレベルマネージャとレベルは別クラスなのか
Harder Monsters and More Levels: How To Make A Simple iPhone Game with Cocos2D 2.X Part 3 | raywenderlich.com
こちら参照。cocos2dでゲームを作ってみたい人の最初の第一歩として超おすすめなチュートリアル。
一度理解してしまえば簡単なんだけど、一旦引っかかってしまうと挫折の原因にもなりうるので補足。レベル制を採用し、クリアする毎にステージが変わるようにするチュートリアルの中に、Level.hとLevelManager.hがある。
なんでLevelManager側に片寄せせずにふたつもクラス作ってんだろう。無駄だなあ。
と思ってたんだけど、一ヶ月くらい経ってソースを読み直していてふと気がついた。
要するに、Arrayに突っ込むときにLevel単位で格納したいからクラスを起こしてる。構造体を使うようにクラスを使ってるというわけ。
確かに分かりやすいなあ。ということで同じところで引っかかってる人のためにメモ。
ステータスバーを非表示にするには
plist.info内で以下を設定する。
View controller-based status bar appearance -> Value: NO
参考:
Hiding the Status Bar - XCode 5 and iOS 7 | Michael Webb