급 Cocos2d-x의 처리를 Android와 iOS로 나누기 Lua와 Java/Objective-C간에 함수를 호출한다

목차



1 소개
2 Android와 iOS의 경우 처리를 분리
3 Lua에서 Java 또는 Objective-C API를 호출합니다.
4 Java 또는 Objective-C에서 Lua의 함수 호출
5 향후 예정

소개



본 기사는, cocos2d-x 및 Cocos Code IDE를 도입해, Android나 iPhone의 실기 단말로 움직인 사람으로, Android, iOS등의 플랫폼마다 처리를 나누고 싶은 사람을 위한, 각서입니다. 예를 들어 3rd 파티 랭킹 서비스와 결합하면 Android와 iOS에서 API가 다르며 Lua에서 직접 액세스 할 수없는 경우에 유용합니다.

Android 및 iOS에서 Lua 처리를 분기



GameScene.lua
...             
                if cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_ANDROID then
                    -- Androidの場合の処理をここに書く

                elseif cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_IPHONE or 
                    cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_IPAD then
                    -- iOS(iPhone、iPad)の場合の処理をここに書く

                end
...

Lua에서 Java 또는 Objective-C API를 호출합니다.



Cocos Code IDE

GameScene.lua
... 
                -- 
                self.point = 100

                -- Androidの場合
                if cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_ANDROID then
                    -- Lua->Javaブリッジのライブラリを読み込む
                    local luaj = require "src/cocos/cocos2d/luaj"
                    -- 呼び出す対象のJava関数が記述されているクラスを設定
                    local className = "org/cocos2dx/lua/AppActivity"
                    -- 対象のJava関数へ渡す引数データを設定
                    local args ={ self.point }
                    -- 呼び出すJava関数名を指定して、(I)整数型引数、V戻り値なしで呼び出す
                    luaj.callStaticMethod(className, "setScoreJava", args, '(I)V')

                -- iOS(iPhone、iPad)の場合
                elseif cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_IPHONE or 
                    cc.Application:getInstance():getTargetPlatform() == cc.PLATFORM_OS_IPAD then
                    -- Lua->Objective-Cブリッジのライブラリを読み込む                    
                    local luaoc = require "src/cocos/cocos2d/luaoc"
                    -- 対象のObjC関数へ渡す引数データを設定
                    local args = { score = self.point }
                    -- 呼び出すObjC関数名を指定して呼び出す
                    luaoc.callStaticMethod("AppController", "setScoreObjC", args ) 
                end
...

(Lua →) Android Java



AppActivity.java
...
import org.cocos2dx.lib.Cocos2dxLuaJavaBridge;
...
public class AppActivity extends Cocos2dxActivity{
...
    public static void setScoreJava(final int type) {
             //call 3rd party Ranking API here, but do not forget runOnUiThread IF running into UI thread 
    }
}

(Lua →) iOS ObjC

AppController.h
...
// Cocos2dxからコールされる関数
+ (void)setScoreObjC:(NSDictionary *)dict;
...

AppController.mm
...
+ (void)setScoreObjC:(NSDictionary *)dict{
    if ([dict objectForKey:@"score"])
    {
        int input = [[dict objectForKey:@"score"] intValue];
        //call 3rd party Ranking API here
    }
}
...

Java 또는 Objective-C에서 Lua 함수를 호출합니다.



Cocos Code IDE

GameScene.lua
...
    -- Java/ObjCからカスタムイベントを使って呼び出される
    local listener = cc.EventListenerCustom:create("callLuaFunc",
        function(event)
            ...
        end)
    local eventDispatcher = layer:getEventDispatcher()
    eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layer)
...

-- Javaから呼び出されるグローバルなLua関数
function callLuaFunc(param)
    local evt = cc.EventCustom:new("callLuaFunc")
    cc.Director:getInstance():getEventDispatcher():dispatchEvent(evt)
end

return GameScene

Android Java(→Lua)

AppActivity.java
// Java->Lua
Cocos2dxLuaJavaBridge.callLuaGlobalFunctionWithString("callLuaFunc", "callLuaFunc");

iOS ObjC(→Lua)

AppController.mm
// ObjC->Lua
cocos2d::Director::getInstance()->getEventDispatcher()->dispatchCustomEvent("callLuaFunc");

향후 예정



미니 게임에서 사용할 수 있는 초기화, 게임 시작, 게임 오버, 재개 등 상태 변화의 구현에 대해 설명합니다.

좋은 웹페이지 즐겨찾기