三角ポリゴンの描画ができたので、次はテクスチャの描画に移ります。
テクスチャのデータは assetsフォルダに置いておきます。res/rawに置くという手もありますが、assetsの方がいろいろ融通がききそうなので。
ただ、assetsフォルダからの読み込みにもいくつか手順がありますので、今回はその辺りをやってみます。
assetsの読み込みには幾通りかのやり方があるようなのですが、Android OS 2.3以降で使える AssetManagerを使う方法にしてみます。
BaseActivity.java
public void onSurfaceChanged(GL10 gl, int width, int height)
{
int period = initNative(width, height, getAssets()); // native部初期化
if ( future == null ) { // 定期実行開始
future = executor.scheduleAtFixedRate(new Runnable()
{
@Override
public void run()
{
surface_view.requestRender(); // 描画リクエスト
}
},
0, period, TimeUnit.MILLISECONDS);
}
}
AssetManagerは java側で取得できるので、initNativeで native側に送ります。
SysMain.cpp
asset_manager = AAssetManager_fromJava(env, mgr); // asset読み込みマネージャー
assert(asset_manager != NULL);
それを native側で受け取って、AAssetManagerに変換します。
namespace sys
{
AAssetManager* asset_manager; // asset読み込み用
/****************************************
assetファイル読み込み
引数 name = ファイル名
戻り値 データ
size:データサイズ
****************************************/
void* load_asset(const char* name, u32* size)
{
AAsset* _asset = AAssetManager_open(asset_manager, name, AASSET_MODE_BUFFER);
assert(_asset);
size_t _size = AAsset_getLength(_asset); // ファイルサイズ
void* _buf = malloc(_size); // データバッファ
AAsset_read(_asset, _buf, _size); // データ読み込み
AAsset_close(_asset);
if ( size ) {
*size = (u32)_size;
}
return _buf;
}
}
ファイル読み込み用の関数です。
データバッファを mallocで取っているので、使い終わったら freeで解放してください。
ファイル読み込みのサンプルです。
assetsフォルダには、test.txtというテキスト(終端に'\0'を追加)を置いておきます。
AppMain.cpp
/************
初期化
************/
void init_app(void)
{
u32 _size;
char* _str = (char*)sys::load_asset("test.txt", &_size); // テスト文字列
LOGI("[%s] size:%d", _str, (int)_size);
free(_str);
}
load_assetで文字列データを読み込んで、ログに出力しています。
最後についでなんですが、アプリの定義は native側に持っていこうと、1フレームの間隔は initNativeの戻り値で native側から取得するように変更しました。
プロジェクト一式は
こちらから。
セコメントをする