ボーシム研

ボーシム研(Boosim Lab)のブログです。
★ボーシム研のモバイルゲーム★
外部リンク
CATEGORIES
RECENT COMMENT
ARCHIVES
MOBILE
qrcode
OTHERS
無料ブログ作成サービス JUGEM
<< ボーシム研のiPhone対応の状況 | main | 道具屋シリーズ新作「道具屋の帝国」続報その2 >>
[iOS開発]UIImageViewの上にグラフィックを描画するには
iOSゲーム開発で行き詰まるポイントの一つが、png画像の描画の遅さ。
私のように携帯やAndroidをやって来た者が、同じようなやり方でUIImageをdrawAtPointで描画すると、その遅さにショックを受ける(大きい画像ほど遅くなる印象)
CGContextDrawImageが少し速いと知ってそっちを使ってみるが、ほとんど変わらない。
OpenGLを使うか、cocos2dを使うしかないのか…と思っていたら、にっしー氏から、UIImageViewだと速くなるとの貴重な情報を頂いた。
試してみると確かに速い。これで助かった…と思ったが、UIImageViewは物理的に描画する画像データではなくViewであり、ヒエラルキーで管理されるものである。
ゲームによっては、全てUIImageViewにするのはキツいし、UIImageViewの上にCGContextFillRectなどのグラフィック描画APIでウィンドウなど描きたい場合もある。

ところがUIImageViewをグラフィックを描くUIViewにaddSubviewし、その後にdrawRectのタイミングでウィンドウなどを描画をしても、追加したUIImageViewの下になって隠されてしまうのである。

UIImageやfillRectなどのグラフィックをUIImageViewの上にするにはどうしたらいいのか?

xibファイルで自分のViewの上に親Viewを作り、UIImageViewを親ViewにaddSubviewした後、グラフィックを描くUIViewを最後にaddSubViewしてしまえばいい。

[self.superview addSubview:〜]
[self.superview addSubview:〜]



[self.superview addSubview:self] //自UIViewを最後に追加して一番上に


しかし、これをやってみると、自分のUIViewが上になるものの、今度はUIImageViewのほうが自分のUIViewのベタ背景により隠されてしまう。

自分のUIViewを透過にしなければならないのである。どうすればいいのか?

UIColor *color = [UIColor blackColor];
UIColor *alphaclor = [color colorWithAlphaComponent:0.0]; //完全透過
self.backgroundColor = alphaColor;

これでやっと、UIImageViewの上に描画したグラフィックを重ね合わせが可能になる。
自分のiPod touch4で動かしてみたが、alphaのせいで遅くなったりはしないようだ。
完全透過だしね。
(なお、initWithCoderのタイミングでやると、透過になりません。ハマりました…)

こんな変なことしてないでcocos2d使えばいいんじゃね?と言われればその通り。マップチップをたくさん表示するRPG的なゲームの場合、膨大な量のUIImageViewを出すのって大丈夫なのかと思う。まぁマップチップを結合した1枚の画像を用意しておけばいいのだけど、シムシティ的に地形をいじるようなゲームだと無理。

なお、このやりかたで最上位のUIViewにUIImageを描画すると、透過しているはずのpngでも透過されずに表示されることがある。
その場合、MacのユーティリティのColorSyncユーティリティでpngを開き、保存すると透過される。
なぜそれで直るのかはわからないのだけど…24bitなのになあ…。iOSの透過指定色の仕様の関係かな。
pngを作成する作業をMacでやれば問題なさそうだけど。

追記
iOS7からSprite Kitなる高速描画APIが使えるらしい…まだ7からだから使いづらいが、将来は主流になるのかな。
| iPhone | 15:29 | comments(0) | trackbacks(0) | pookmark |↑PAGE TOP | このエントリーをはてなブックマークに追加 | このエントリーを含むはてなブックマーク
コメント
コメントする





この記事のトラックバックURL
http://blog.keitai-game.main.jp/trackback/476
トラックバック