taoru's memo

Objective-c,cocos2d,など開発についてのメモ(andoroidも少しだけ)

cocos2d v2.0 個人的に覚えておきたいアップデート内容

cocos2d v2.0 の安定版が出た。(7/9)
http://www.cocos2d-iphone.org/archives/2003

v2.0 highlights:

OpenGL ES 2.0 support
Better Physics engine support
Better DoubleResolution sprite support
Easier to maintain Retina Display code
Faster MotionStreak code
New ProgressTimer actions
New Transitions
Better Labels supports
Better templates
Includes v1.1-beta features like Particle Batches
Many many bug fixes
…and more

CHANGE LOGを読んでて、これはイイ!と思ったものをメモしておきます。
rc版も適用してなかったので、結構たくさん機能が増えてますね。
(rc2.3の内容も含めて書きます。)

[NEW] Director: Added popToRootScene method


pushでSceneを重ねているとき、RootSceneまでpopをしてくれる(たぶん)

[FIX] LabelTTF: supports multiline even if no dimensions are provided


領域指定しなくても、複数行のラベルの描画をよしなにしてくれる(たぶん)
今までは複数行描画するときは、領域指定が必要でした。
もし領域からはみ出すと、はみ出した部分は切れて表示されなかったので、この機能は多様しそうです。

[FIX] SpriteFrameCache: plist is not loaded again if it was already loaded (performance)


SpriteFraneCacheに同じフレームリストが二重登録されなくなる!!
if文などで制御する必要がなくなるので、利便性超UP!!

CCTouchDispatcher と isRelativeAnchorPoint が非推奨だった

ブログなどで紹介されているクラスやメソッドが、Cocos2d 2.xでは非推奨になっていることがよくある。
ソースを追えば、現在の推奨メソッドが発見できたりする。

[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO];

↑Cocos2d 2.x では非推奨

↓こうする

[[[CCDirector sharedDirector] touchDispatcher] addTargetedDelegate:self priority:0 swallowsTouches:NO];


CCLayerに対してアンカーポイントを設定したいときはignoreAnchorPointForPositionを使うようにする。

CCLayer *layer = [CCLayer alloc] init];
layer.isRelativeAnchorPoint = YES;

↑Cocos2d 2.x では非推奨
[layer setIsRelativeAnchorPoint:YES] でも非推奨(↑と同じです)

↓こうする

CCLayer *layer = [CCLayer alloc] init];
[layer setIsIgnoreAnchorPointForPosition:NO];


isRelativeAnchorPointと、ignoreAnchorPointForPosition は振る舞いが逆なので注意

CCLabelTTFでカスタムフォントを使う

カスタムフォント(自作フォント)を使いたいなら、ビットマップフォントを生成して、
CCLabelBMFontを使うしかないと思っていました。

が、どうやら私のフォント指定の方法が間違っていただけで、実はそのままCCLabelTTFでttfフォント使えるんですね。
フォントファイル名と、中身のフォント名は違うということを見落としていました。

例えば美咲フォントを入れたいと思ったら、

1.Resouceにフォントファイルを追加

2.info.plistにフォントファイルの記述を追加
 Fonts provided by applicationの項目に misaki_gothic.ttf などのファイル名を追加(フォント名ではない)

3.Projectのルートクリック→BuildPhase ->CopyBundleResoucesに追加
 フォントファイルクリック→TargetMembershipにチェックつけるんでもいいかも?

4.フォント名を指定して呼び出す
 CCLabelTTF *label = [CCLabelTTF labelWithString:labelString fontName:@"MisakiGothic" fontSize:15];


これで表示することができました。
フォントのファイル名は "misaki_gothic.ttf" でも、フォント名は "MisakiGothic" だった。というオチです。


参考
Error loading custom font for CCLabelTTF

美咲フォント
8×8 ドット日本語フォント「美咲フォント」

プレフィックスヘッダーに関するメモ

Cocos2d の新規  HelloWorldプロジェクトを 作成
HelloWorld/Supporting Files/Prefix.pch
に、
#ifdef __OBJC__内に #import "cocos2d.h" を追加する

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "cocos2d.h"
#endif

すると、HelloWorldのspf(seconds per frame:1フレームの実行時間)が、
0.017 から 0.001 になった。

コンパイルを早くするだけじゃないの?

ダイアログ表示でBadTokenExceptionが出る

final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( getApplicationContext() );

例えばhogeActivity内で、上記のようにAlertDialogを作成する処理を書くと、

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

というエラーが出て落ちてしまう。

で、エラー名でぐぐった
ダイアログ表示時(Dialog#show)にBadTokenException
上記ブログ様によるとサービスのコンテキストでダイアログは表示できないらしい。

サービスとはなんぞや。
Androidで動く携帯Javaアプリ作成入門(7)常駐アプリが作成できるAndroidの“サービス”とは

むむむ…よくわからない。
バックグラウンドで動かし続けたい処理なんかに使うみたい。



なぜgetApplicationContext()で取得したコンテキストが、サービス扱いなのかよくわからないが、
以下のようにしたらエラー落ちしないで正常っぽく動いた。

hogeActivity.java

final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder( hogeActivity.this );

とあるプロジェクトで、前任者がこう書いていたものをマネした。
自分自身のクラス(アクティビティクラス)をコンテキストとして渡している。


しかしこの書き方では、参照が残るとかなんとか
Androidアプリのメモリリークを調査する
上記ブログ様の記事、「Contextに注意」の項目でActivity.thisが登場している。

getApplicationContext()を使うと参照が残らない…のか?
知識不足で全然理解していないので、もっと勉強が必要ですね。。

vimでディレクトリ内の全ファイルの文字コードを変換する

以前、vimでEUCやShift_JISで書かれたファイルをUTF-8に変換するという記事を書いた。

あるプロジェクトで、Javaのソースファイルが全てShift-jisで書かれていて困った。
数十ファイルを1つずつvimで開いていくのは面倒なので、方法を調べたら簡単にできたのでメモしておく。

1.ファイルを複数同時に開く
開きたいファイル名を並べてもできるけど、正規表現で開ける

$ vim *.java

この状態で「:args」と打つと、argument list一覧を見られる

2.開いている全ファイルの文字コードに変更を適用する

:argdo e ++enc=sjis | set fenc=utf-8 | update

:argdoでargument list全てにコマンドが実行される
vimコマンドでは、パイプを使うことで連続でコマンドを実行することができる。

e ++enc=sjis で元のエンコードでファイルを開き直した後、
set fenc=utf-8 でファイルのエンコードをセット、
update で変更があれば書き込み
を行なっている。と思う。

updateコマンドについては自身が無い。無いとエラーが出る。

これにて一件落着。


参考にさせていただいた記事
Vimで複数ファイルを纏めて編集する
Hack #11: argument listを利用して複数のファイルを取り扱う

AndroidのImageViewで、縦横比を維持しつつ拡大するときにハマった(5/10追記)

ImageViewをxml内に記述するとき、縦横比を維持するために

<ImageView
      android:layout_width="match_parent"
      android:layout_height="135dp"
      android:adjustViewBounds="true"
      android:background="@drawable/hoge" />

としていたが、縦横比が固定されずに横長になってしまう。
adjustViewBounds してるのに…と思っていたが、リソースの指定方法を勘違いしていた。

backgroundはViewの背景であって、
ImageViewのリソースはsrcで指定しなければならなかった。

正しくは、

<ImageView
      android:layout_width="match_parent"
      android:layout_height="135dp"
      android:adjustViewBounds="true"
      android:src="@drawable/hoge" />

これで縦横比が保たれたまま、縦が135dpにフィットするように拡大された画像が表示される。

もし一緒にbackgroundも指定すると、
View目一杯に拡大された画像の上に、srcで指定した画像が表示される。


恥ずかしい勘違いでした。


  • 追記 2012/05/10

横画面の場合、面倒な事にScaleTypeの縦横の扱いが逆転しない。
scaleType = CenterCrop だと、横幅いっぱいまで拡大して中央表示だが、

横画面にした場合、縦横を自動で逆転させてくれない。
横画面で同じ効果にしたい場合、
scaleType = FitCenter としなければならないようだ。

QLOOKアクセス解析