2014年1月22日水曜日

Cocos2dとMKMapViewとOpenGLについて([[CCDirector sharedDirector]pause];)

Cocos2d for iPhoneを使用していて、iPhone標準のMapViewを表示するときの注意点です。

Mapを表示している間は、可能ならば
[[CCDirector sharedDirector]pause];
をしといたほうがいいです。


MapViewを表示する際は、下記コードで実現できます
(mapViewはメンバーにしています。

    CGRect frame = CGRectMake(50, 45, s.width - 100, s.height - 100);
    self.mapView = [[[MKMapView alloc] initWithFrame:frame] autorelease];
    _mapView.backgroundColor = [UIColor clearColor];
    _mapView.mapType = MKMapTypeStandard;
    _mapView.delegate = self;
    [_mapView setShowsUserLocation:YES];

    [[[CCDirector sharedDirector] view] addSubview:_mapView];

問題は、少し前のOS、具体的にはMKMapViewで呼び出されるのがGoogleMapのものでは、
地図が表示されなかったり、拡大縮小、移動がかくついたりする現象がありました。
それも毎回おこるわけではなく、再表示で直ったり直らなかったりで原因がよくわかりませんでした。

いろいろ考えた結果、そういえばGoogleMapってOpenGL使ってるのではと思いだしました。
もしやCocos2dとGoogleMapでOpenGLが競合して表示が変になっているのでは…

そこで、Map表示時に、Cocos側の描画処理を止める
[[CCDirector sharedDirector]pause];
を呼び出してみました。
すると、何回ためしてもMap側の表示がおかしくなる現象が見られなくなりました。
Mapの動作がいらなくなったり、Cocos側のアニメーションや画面遷移が必要になったタイミングで、
[[CCDirector sharedDirector]resume];
を呼び出せば、自分のアプリの場合は特に問題なく実装できました。

GoogleMap以外にも、OpenGLを使っているAPIを使用している方は、
参考になるかもしれません。


以上です。

違う環境に移した時の clang: error: linker command failed with exit code 1 (use -v to see invocation)

久しぶりの更新です。


Xcodeのプロジェクトを、丸ごと持ち運んで別々の環境でコーディングする人も居ると思います。

自分も最近よくやっているのですが、その際に追加しているライブラリが原因で下記エラーが出てしまいました。

d: warning: directory not found for option 'パス'

clang: error: linker command failed with exit code 1 (use -v to see invocation)

原因は、ライブラリのパスが絶対パスになっており、
違うMacに移したことでそのパスにたどり着けないことによります。

自分の場合の解決法としては、ライブラリファイルをプロジェクトフォルダにコピーしてあるので、
TARGET→Search PathsのSettingのところを探して、
絶対パスで指定してあるところを相対パスに置き換えました。

/Users/(ユーザー名)/.../(プロジェクトフォルダ名)/
これを
$(SRCROOT)
に置換してやるとエラーがでなくなりました。


以上です。