記事一覧

100件目

ちょっと前に記事をアップしたらデータベースが壊れてしまったんですが、それがちょうど100件目。
その時容量がかなりギリギリだったんでそっちが原因とは思うのだけど、いちおうアップできるか確認; 行けるか100件目?

Application Loader cashes some information

When I tried to upload my binary to AppStore using Application Loader, I got the error saying "Bundle identifier:***** differs from reserved bundle identifier:**** ".
At the first try, there really was an error. But even after checking carefully around info.plist or those related files and tried several times, I still get the same error.

After several trials, I've found that I'm overwriting the .ipa file when re-making the binary.
In general, using the same file name sometimes cause some kind of confusions because of cache effect or something.
So I, in my last try, just changed the name of .ipa and had it into Application Loader.
.... That's it. Upload successful.

But it's not understandable why it caches the information of overwritten archive file...


アプリをAppStoreに上げるべく、ApplicationLoaderで作業していたのだけど、"Bundle identifier:***** differs from reserved bundle identifier:**** ". というエラーが出てアップロードできない。
で、調べてみると最初は確かに間違いがあった。
しかし、いろいろチェックして直してみてもずっと同じエラーが出続けるようになってしまった。

なぜだ・・・と思いつつふと気づいたのが、.ipa を作り直す際に、毎回上書きで保存していたという点。
一般的に、同じ名前を使うとキャッシュだ何だの影響で混乱が起こることはよくある。
ということで最後に .ipa の名前を変えてトライしたところ
・・・行けました。アップロード完了。

できたのはいいけど、なんでこんなところでキャッシングをする必要があるんだ・・・。理解できん。

Cocos2d解説(1) スプライト

cocos2dのアニメーション周りがけっこうややこしくて理解するのに苦労したので、使い方・・・というよりはどうしてそういう使い方になるのか、といったあたりを 自分で理解する目的も含めまとめてみようと思う次第。
コードは実際に動作してるものを切り取ってきてるわけではないので、間違い多いかも知れません。


■そもそもスプライト

OpenGLで二次元画像を表示しようと思うと、テクスチャ画像読み込み→頂点座標を指定して面を作成→面にテクスチャを貼り付け・・・ということを長々とOpenGL命令で指定する必要があり、さらにそれを移動・拡大・縮小・・・などやろうとすると同じくらい面倒な手続きが延々と必要となる。
cocos2dのスプライトはそのあたりをまとめてやってくれる非常に便利な仕組み。
自分は OpenGL の入門書を開いた時点で挫折したクチなので、これはものすごく助かる。

「テクスチャ」はもともと3D描画でポリゴンの面に貼り付ける画像のことであるが、2D描画の場合も正面向きのポリゴンを作ってそれに画像を貼り付けるという処理を行っているので、同じようにテクスチャと呼ばれる。

スプライトの最も単純な作り方は、


CCSprite* aSprite = [CCSprite spriteWithFile:@"texture.png"];

でOK。この場合、画像の大きさに対応したスプライトができる。これを


[self addChild:aSprite];

などとして現在のシーンに追加すれば描画が完了する。

スプライトは、位置・スケール・アルファ、それにテクスチャ画像への参照と切り出し情報(後述)などを保持しており、これらは変更すればすぐに反映されるので、移動や変形などは簡単に行える。たとえば位置を変えたいなら


aSprite.position = CGPointMake(160, 240); //(*1)

などとすればよい。

*1)CGPointMakeを省略した ccpというマクロが用意されているのでそれを使うとタイプ量を軽減できる。

cocos2d - run animation on startup

I intended to run an animation at my app's startup, like my app's logo slides in. But it won't run at all, while direct changes to parameters (like sprite.opacity=100 etc.) work without problem.

I don't know the reason, but I set a timer to wait a bit before starting animation and it worked fine.
You have to notice that you should use NSTimer instead of CCNode's schedule: method.
CCNode's schedule method doesn't work maybe because of the same reason.


アプリのスタート時に、ロゴがスライドインしてくるようなアニメーションをさせたかったのだけど、どうも動いてくれない。パラメータを直接変更する(sprite.opacity=100 とか)は反映しているんだが。

理由はよくわからないが、タイマーを使ってちょっと待ってからスタートさせるようにしたらとりあえず動きました。
ただし注意なのが、NSTimer を使うという点。
CCNode の schedule: だとやはり動かないようです。何か共通した原因があるっぽい。

日付

Objective-Cの日付周りの処理ってホンっッとイヤだな・・・。
ロケールとか絡んでくるから複雑になりがちなのは分かるが、もっと素直でシンプルな実装あるだろ・・

cocos2dアニメーション

悩むこと数時間、やっとアニメーションが動いた・・・。

(1)
まず、テクスチャサイズが巨大になるのをおそれてスプライトシート方式を避けていたが、iPhone全画面・数コマくらいならいけることがわかったので、もうそれでいいことにした。(でも今後10コマとかに増えそうだったらやはり脱スプライトシートの方法を探らないといけない・・・)

(2)
コードはこれでOK。
http://www.raywenderlich.com/1271/how-to-use-animations-and-sprite-sheets-in-cocos2d

(3)
が、スプライトシート(.png/.plist)を作るツールは
こっちじゃないとダメっぽい
http://www.texturepacker.com/

ちなみに cocos2d は 0.99.5 です。
もう1.xにした方がいいのかな・・・

久しぶりだが・・・

久しぶりに cocos2d で作業すべく cocos2d をアップデートしたが
・・・アニメーションの仕組み変わりすぎだろ・・・
plistとか使うのデフォになってるし・・・
webで使い方検索しても見つかるのはほとんど TextureAtlas から切り出して使う方法だし・・・。
前のアニメーションの仕組みも簡単ではなかったけどな・・・

Email with Attatchment

I tried several methods to send an email with an attachment but all failed. Seemingly the image is attached but the content is empty.
I finally succeeded with the method of using ContentResolver.
I'll write about the detail maybe later...

画像を添付してメールを送る方法をいろいろ試していたのだけど、どれもうまくいかず。なんか中身が空になってしまう。
最終的に、ContentResolverを使った方法だとうまく行きました。
詳細は後で書きます。たぶん。。。

Adding an inflated XML layout as a subview

If you want to place your XML layout as the main contents of your activity just invoke setContentView( your_xml_resource_id ) and everything will be fine, but if you want it to be a subview of existing view the method is totally different:
((LayoutInflater)getSystemService(Activity.LAYOUT_INFLATER_SERVICE)).inflate( your_xml_resource_id , your_parent_view);

If you google around about this agenda you'll find codes like this:
View v = activity.getViewInflate().inflate(R.layout.buttons, null, null);
But this never works in my environment. May be Android API has been changed?

XMLレイアウトを、アクティビティのメインコンテンツにしたい場合は、 setContentView( your_xml_resource_id ) でイッパツなんですが、これを既存のビューのサブビューにしたい場合はかなりやり方が違ってきます。

((LayoutInflater)getSystemService(Activity.LAYOUT_INFLATER_SERVICE)).inflate( your_xml_resource_id , your_parent_view);

ところで、この件をググるとこんなコードが出てきますが、これはウチの環境では動きませんでした。
View v = activity.getViewInflate().inflate(R.layout.buttons, null, null);
これも2.xで変更された部分なのかな??

Workspace currupted!!

I had got an error while Eclipse was saving my workspace, and it had damaged the workspace file. As result everything seemed to have disappeared.
In my case the solution was pretty easy, just "import" my projects from the menu.
But one thing made me upset is: just when I have imported project no Perspective was opened and still nothing seen on the workspace. Selected Window > Open Perspective to open one and everything is back as before.

Eclipse が異常終了してしまった際にワークスペースが壊れてしまい、起動しても何も表示されなくなってしまいました。
今回のケースでは解決方法は簡単で、単にプロジェクトの import を行えばよい、というものだったんですが、一瞬青ざめたのが、インポートしたばかりのときは Perspective が開かれておらず、したがってプロジェクトは読み込んだもののワークスペースには何も現れない、という状態だった点。
Window > Open Perspective で Javaパースペクティブなりを開いたらちゃんと元通りになりました。