2014年1月7日火曜日

cocos2dxとか

何か作ろうと思ってるけど下準備中、cocos2dxとlua使う予定。
だらだらといろいろ試したことのメモ。


エミュレータと実機つないでるので指定する方法
 adb devices でシリアル確認
 adbコマンドにANDROID_SERIAL=xxxでシリアルを指定する
 adb -s xxxでもいいけど、別のスクリプトとかからadbしてるときに微妙。
 エミュレータ、実機が1台ずつならadb -eとかadb -dでもいい。


cocos2dxのsamples/lua/HelloLuaをいじってみる。


apk内部のassetsにluaファイルを置いておくと
require "ファイル名"で読めるらしい

luaからファイルを作成してみる
    fh = io.open("/data/data/org.cocos2dx.hellolua/files/test.txt", "w")
    fh:write("abcde\n")
    fh:close()

Genymotionで動かすためにx86もビルドするようにする
jni/Application.mk

APP_ABI := x86 armeabi
を追加する。

lua言語慣れてないのでlua+cygwinでとりあえずインタラクティブなやつで試す
make mingw
cd src
lua -i

luaマニュアルを軽く見ておくといい
他の言語知っていれば簡単だと思う
PHPとjavascriptをくっつけてうさんくさい動作を省いたみたいな印象
http://milkpot.sakura.ne.jp/lua/lua51_manual_ja.html

スクリプトの中で作成したスクリプトを読み込んでみる
    fh = io.open("/data/data/org.cocos2dx.hellolua/files/test.lua", "w")
    fh:write("function myadd2(x, y)\n");
    fh:write("    return x + y + 1\n");
    fh:write("end\n");
    fh:close()

    package.path = "/data/data/org.cocos2dx.hellolua/files/?.lua"

    require("test");
    cclog("result2 is " .. myadd2(1, 1))
  スクリプトの中で作成しなくても、 adb pushで/data/data/org.cocos2dx.hellolua/files/におけば、 同じようにrequireできるのでそうすれば それなりに時間かかるAPKビルドを省略できるので結構楽そう。    rootじゃないと権限の問題でfilesにファイルを作成するのがちょっと面倒 adb shell "run-as org.cocos2dx.hellolua sh -c 'echo \"aaa\nbbb\nccc\" > /data/data/org.cocos2dx.hellolua/files/test.txt'" みたいな感じ。 echoに渡す文字列のエスケープがややこしい。 シングルクオートが'\'' ダブルクオートが\\\" adb pushでrun-asみたいのを指定する方法があればいいのだけど。


luaからc++を呼ぶには
tools/tolua++でmakeする
apt-get install tolua++しておく

scripting/lua/cocos2dx_support/LuaCocos2d.cppに作成される


自分で作った関数とかをtoluaするには
http://p-monster.hatenablog.com/entry/2012/12/12/170111
ここを参考にしました。

samples/Lua/HelloLua/tolua_glue/sample.pkgを作成
tolua++5.1 -n sample -o sample_glue.cpp -H sample_glue.h sample.pkg
でsample_glue.cppとsample_glue.hを作成。
同じディレクトリに参考記事のluasample.h, luasample.cppを作成

Android.mkの
LOCAL_SRC_FILESにluasample.cppとsample_glue.cppを追加
LOCAL_C_INCLUDESにtolua_glueとexternal/emscripten/tests/lua/srcを追加

AppDeletete.cppに
#include "lua.hpp"
#include "tolua++.h"
#include "sample_glue.h"
を追加。
applicationDidFinishLaunchingの中で 
lua_State* state = pEngine->getLuaStack()->getLuaState();
tolua_sample_open(state);
すると、以降でGetStringが呼べるようになる。