发布于 2016-01-11 09:33:33 | 287 次阅读 | 评论: 0 | 来源: PHPERZ

这里有新鲜出炉的精品教程,程序狗速度看过来!

Cocos2d-x

Cocos2d-x是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C++ Cocos2d-iPhone项目的版本。Cocos2d-X发展的重点是围绕Cocos2d跨平台,Cocos2d-x提供的框架。手机游戏,可以写在C++或者Lua中,使用API是Cocos2d-iPhone完全兼容。Cocos2d-x项目可以很容易地建立和运行在iOS,Android,黑莓Blackberry等操作系统中。



android平台代码和Lua代码的交互均通过C++和Java交互,Lua再和C++交互

C++和Java的交互,可以参考 (*)

下面直接看用法:

lua调用java

lua中使用 luaj.callStaticMethod 来调用java静态方法:

使用场景例如提交统计,提交游戏分数


-- launch app
function JniUtil:callJavaBuyLife()
    local argsJson = nil
    local sigs = "()V"
    local luaj = require "cocos.cocos2d.luaj"
    local className = "org/cocos2dx/lua/AppActivity"
    local ok,ret = luaj.callStaticMethod(className, "pay", {argsJson}, sigs)
    if not ok then
        print("==== luaj error ==== : ", ret)
        return false
    else
        print("==== The JNI return is:", ret)
        return ret
    end
end

在AppActivity中,加入静态方法:

public static void pay() {
    // ...
}

java调用lua

cocos2d-x提供了Cocos2dxLuaJavaBridge带有如下方法可以使用:

public static native int callLuaFunctionWithString(int luaFunctionId, String value);  // 调用局部Lua-Function
public static native int callLuaGlobalFunctionWithString(String luaFunctionName, String value); // 调用全局Lua-Function
public static native int retainLuaFunction(int luaFunctionId); // retain一次Lua-Function
public static native int releaseLuaFunction(int luaFunctionId); // release掉Lua-Function

使用场景:例如我们在支付SDK中购买完了钻石后回调到游戏中

下面提供callLuaGlobalFunctionWithString用法:

function G_CallbackFromJava(msg)
    if msg == "success" then
        -- ...
    end
end

Java中对这个全局函数直接调用他,如果G_CallbackFromJava里要涉及图形计算,需要启用OpenGL线程:

sInstance.runOnGLThread(new Runnable() {
    @Override
    public void run() {
        Cocos2dxLuaJavaBridge.callLuaGlobalFunctionWithString("G_CallbackFromJava", "success");
    }
});

添加import语句:

import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;

下面提供callLuaFunctionWithString用法:

function JniUtil:callJavaCallbackLua(func)
    local luaj = require "cocos.cocos2d.luaj"
    local className = "org/cocos2dx/lua/AppActivity"
    local args = { "callbacklua", func }
    local sigs = "(Ljava/lang/String;I)V"
    local ok = luaj.callStaticMethod(className,"callbackLua",args,sigs)
    if not ok then
        print("============= call callback error")
    else
        print("------------- call callback success")
    end
end

某启用充值的地方,预先注册局部函数


local function onBack(msg)
    self:resumeGame() 
end
JniUtil:getInstance():callJavaCallbackLua(onBack)

Java中可以直接回调这个函数,也可以先保存下来这个注册的Lua局部函数,一般都是保存下来,等待启用SDK充值逻辑走完后再回调

static int luaFuncCallback = 0;
public static void callbackLua(final String tipInfo,final int luaFunc){
  // 根据需要,看是否要retainLuaFunction
  luaFuncCallback = luaFunc;
  // tipInfo为Lua里传来的“callbacklua”这里没用
}

Java中充值后回调函数中调用游戏里的lua逻辑

sInstance.runOnGLThread(new Runnable() {
  @Override
  public void run() {
    Cocos2dxLuaJavaBridge.callLuaFunctionWithString(luaFuncCallback, "success");
    Cocos2dxLuaJavaBridge.releaseLuaFunction(luaFuncCallback);
  }
});


最新网友评论  共有(0)条评论 发布评论 返回顶部

Copyright © 2007-2017 PHPERZ.COM All Rights Reserved   冀ICP备14009818号  版权声明  广告服务