夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【cocos2d】タイルマップの隙間に四苦八苦。解決策は?

引き続きタイルマップと格闘しておりますが、今日はタイルマップのマップチップの間の隙間に悩まされました。
この醜いギャップを何とかしないことには先に進めないのです。

問題その1: マップを動かさない状態で特定の位置に出現する線状の隙間

前回作ったプログラムを実機で実行するとこんな感じに所々に筋状の隙間ができてしまいました。
f:id:takujidev:20130908203500j:plain:w300
シミュレーターだと発生しなかったのですが、何なんでしょうこれ。
とりあえずググってみて出てきた情報を参考に、CCDirectorのsetProjectionでkCCDirectorProjection2Dを指定すると発生しなくなりました。
これはAppDelegate.mの中でデフォールトでkCCDirectorProjection3Dを指定しているので、それを書き換える(2Dの方がコメントアウトされているので入れ替える)か、自分のプログラム内で上書きします。
私はAppDelegate.mはあまり見ないので、あとから思い出しやすいように自分のプログラムで上書きしました。

[[CCDirector sharedDirector] setProjection: kCCDirectorProjection2D]; //タイルマップのギャップをなくすため

問題その2: マップをスクロールさせると画面全体にチラチラと出現する格子状の隙間

この隙間はタッチ操作で得られる座標をそのまま使っているときには出現しません。
慣性を表現しようと、計算で座標を求めると発生します。
計算誤差が原因のようなので、タイルマップのpositionプロパティに座標値を設定する前に次のメソッドを通して小数点以下を丸めてあげる事で発生しなくなりました。

- (CGPoint)allignPosition:(CGPoint)position
{
    CGFloat x = (int)position.x;
    CGFloat y = (int)position.y;
    return ccp(x, y);
}

使い方はこちらの記事をご覧下さい。
計算誤差を防ぐため小数点以下を丸めたpositionプロパティの値は画面表示専用とし、座標の計算は小数点以下を丸めていない正確な値を使う事をお勧めします。

動画だとわかりやすいと思います。
ちなみにこの動画は一時期話題になったもののあっという間にApp Storeから消されたxRecでキャプチャーしました。当時は使えなかったのですが、最近iOS6.1にアップデートしてようやく使えるようになりました。

修正前

修正後