2013年11月12日火曜日

Java(JNI)を極力避けて進めたい

はっと気がついて見渡せば
Androidの開発環境については
色々なフレームワークが出ており、
結構様変わりしているなぁと感じます。

僕がちらちら耳にするのは
3Dだと「Unity」、2Dだと「cocos2D」あたりでしょうか。

しかし、そんなフレームワークに頼らず
自分がやりたい機能だけを搭載したい思いから
NDKに手を出して、気がつけば一年を経過していました。
C++自体はじめての経験で模索状態でしたが
結構まともな状態まできてるなぁというのが個人的な感想です。
実際、NDKを使いつつもJNI経由で
Javaの機能を使っているものが多い中
以下の機能についてはNDK(C++)のみで実装できたので
結構な速度が出ています。
未来の移植性を考えても、極力Java(JNI)には頼りたくないのです。

・Assetsへのアクセス
  libzipによるapkファイルの解凍で対応

・文字(日本語含む)の表示
    FreeType2による文字表示

・XMLファイルの解析
  tinyXMLによるXMLの解析

・テクスチャの読み込み
  libPngによる画像ファイルの処理

・OpenGLによる描画
  もちろんOpenGLライブラリ使用


やっぱりこの中で一番てこずったのは文字でしょうか。
英語の表示まではすんなりいったのですが
日本語を表示するまでにはかなり大変でした。
なにせNDKの中にwide文字系の処理が
ぽっこり抜けているので力技で解決した感じです。

次がAssetsですかね・・・
でも、これは最近は検索すると方法は結構
ひっかかるので、前よりは難易度が下がっているかもしれません。

まあ、こういうひとつひとつが悲しみと喜びを繰り返して
実現されていくので、それぞれに思い入れもひとしおです。

それから、まだ実現できていないのがインテントへの読み書きや
音楽の再生等、まだまだ課題は残っています。

技術系の記述をしようかなとか思いましたが
こんな場末のブログなんて誰も読んでないと思いますし
やめときますw
そもそもブログにコメントすら入ったこと無いしねw

2013年11月11日月曜日

クォータービューとの戦い?w

どもども、こんにちわ!

もう、ここの放置っぷりが半端ないですね。
いや~仕事の方が多忙で全然更新する気力がね・・・・

でも、全く何もやってなかった訳ではないですよ。
しっかりやる事はやってました。
少し前のブログにも書いた気がしますが
新しいゲームを3D(OpenGL ES2)でゴリゴリ組んでたんです。
でもやっぱり3Dってだけで重たい・・・
動きはするんですが、やっぱり重たいんです。
すでにJavaは捨ててC++(NDK)でやっているんですけど
それでも3Dはそれなりに重たい。
これだと、どうしても箱庭感から抜け出せないんですね。
確かに3Dの表現力はもの凄いので
2Dでは諦めていたような色んな問題を一気に解決
してくれる訳ですが、その代わりに重いんです。

ああ、結局ここで頭の中に天秤が現れるわけですが

「自分たちがやりたい事って本当に3Dが必要?」

という言葉が頭をよぎったのが運のつき。
もう、頭から離れなくなりまして・・・・
結局、2Dと3Dの間にあたるような
「クォータービュー(英:Isometric view)」を試してみようと
軽い気持ちでやってみた訳です。

はじめに菱形の地面の絵を用意して敷き詰めてみました。
ここはすんなりいったので
「ほお、なんだちょろいなw」とか思っていたんですが
そこに立体感のある物体(というか箱?w)を
配置したあたりから状況が一変
その箱の間を赤い箱が通過するようなプログラムを
組んでいたのですが、どうしても重なりが
上手くいかない部分が出てくるのです。

例えばこれ↓
明らかに下にいるべきブロックが
上にきてますね。

そこでマスに番号を振って
考えてみました。

この図をみてください。
真ん中にいる赤い箱が
9番に向かって移動しているわけです。
その状況を、赤い矢印の順番に描画するわけですが
9番の地面の上に赤い箱がきているこの場合
3番(見えてないけど)の描画の直後に
赤い箱を描いてしまうと9番の地面が
赤い箱を上書きしてしまうのです。

そう、この場合は9番の地面を描いたあとに
10番として赤い箱を描くべきだと考えました。

・・・・・・・・でも、待てよ?

一見すると、これで良さそうですが
(実際、ネットでどこそこ検索すると
そうしろ的な記事も見かけるんですが)
本来、赤い箱の大半は3番の上にいるわけです。
そして、その隣にいる4番の箱
これは赤い箱の手前にいるわけですから
赤い箱の後に描画しなければ
奥行の表現としてはおかしいことになります。


問題1:
3番→赤い箱→4番~9番(ここで赤い箱の上に9番の地面がかぶる)

問題2:
3番~9番→赤い箱(ここで4番の箱の前に赤い箱がかぶる)

もう、これは明らかな矛盾なので
正攻法では解決できないなという結論になりました。

そこで、まず考えたのが描画順
普通のXを加算しながらYを加算のループではなく
独自のルールでの描画順を行うこととしました。

描画順ルール

まず、XとYが同じ場合は
XとYをかけた数値を描画順とします。
次にそこからマイナス方向の座標には
-1ずつした数値として
その順番で描画するようにします。
そうすることで、奥にあるものほど
先に描画をしようという方法です。
(同じ数値の場合はどちらが先でも
まぁ、問題は無いかなといった
軽い考えですが・・・・)

ただ、これだけでも実は十分ではありません。
(試すとわかるが、2:2から3:2へ移動する途中、
1:3にある箱の上に赤い箱が一部がかぶってしまう。)
上述の赤い箱がおかしな動きを
しない為には、もうひとひねり必要です。



今回はめずらしく長々書いて疲れたので
続きは気が向いたら書くことにします・・・(´・ω・`;)