코로나 네이티브 설정

다음 단계는 네이티브 개발 환경과 코로나 네이티브의 통합을 위한 최적화된 설정을 제공합니다.

1. /Applications/Corona/Native/ 폴더에서 Setup Corona Native를 더블 클릭하면, 프로젝트 템플릿에 필요한 심볼릭 링크가 생성됩니다.

2. 네이티브 iOS 앱을 개발하려면 Mac App Store를 통하거나 직접 다운로드 한 Xcode를 설치해야 합니다. Xcode가 이미 설치되어 있는 경우 최신 버전인지 확인하십시오.

3. iOS 장비에 앱을 설치/테스트 하고 App Store에 게시하려면 Apple Developer 계정이 있어야 합니다. 계정을 설정했으면 Xcode와 통합해야 합니다. 이 과정은 여기에 요약되어 있습니다.

4. iOS 개발 환경이 올바르게 작동하는 경우 MyLife와 같은 기본 iOS 샘플 프로젝트를 구축 할 수 있어야 합니다. 또한 장치에 샘플을 배포하고 실행할 수 있어야 합니다.

프로젝트 템플릿

새 프로젝트는 템플릿 파일을 시작점으로 사용하여 쉽게 만들 수 있습니다. /Applications/Corona/Native/Project Template/App/ 폴더 내부에서 다음 파일/디렉토리가 주요합니다:

Corona – 이 폴더는 main.lua, app 아이콘 등과 같은 파일을 포함하는 고전적인 코로나 프로젝트를 나타냅니다. 기본적으로 ios/App.xcodeproj는 이 폴더(Corona) 내에 있다고 가정합니다.

ios – iOS 관련 코드, 프로젝트 등을 포함합니다.

App.xcodeproj – 이것은 Xcode 내에서 앱을 빌드하고 실행하기 위한 기본 프로젝트입니다. 이 프로젝트 템플릿은 루아 소스와 리소스 파일 (이미지, 오디오 등)을 패키징하는 커스텀 빌드 단계를 포함하기 때문에 Xcode 프로젝트의 시작점으로 사용하는 것이 좋습니다. 또한 향후 프로젝트에서 다시 사용할 수 있는 플러그인으로 네이티브 확장을 구성할 수 있습니다.

AppCoronaDelegate.h / AppCoronaDelegate.mm – 주요 응용 프로그램 시작점이 여기에 있습니다. 이 클래스는 CoronaDelegate 프로토콜을 따르므로 main.lua가 로드되고 실행된 직후에 알림을 받게 됩니다. UIApplicationDelegate 메서드를 추가할 수도 있습니다. 플러그인을 통해 새로운 Lua 라이브러리를 추가하는 것이 좋습니다.

Plugin / – 플러그인의 경우 plugin.library 구현이 이루어 집니다.

PluginLibrary.h / PluginLibrary.mm – 이들은 plugin.library를 구현합니다.

Plugin.xcodeproj – 플러그인의 경우 이것은 애플리케이션에 노출시키고 있는 Lua 라이브러리를 포함하고 있는 메인 프로젝트입니다. 이것은 App.xcodeproj의 종속성이므로 자동으로 생성됩니다. 플러그인을 별도로 빌드하려면 이 프로젝트를 열면 됩니다.

CoronaNative.xcconfig – Corona Native (Corona 및 Lua 헤더 파일, 라이브러리 및 링커 옵션에 대한 경로)에 대한 공통 설치 요소를 포함하는 구성 파일입니다.

CoronaApp.xcconfig – “Download Plugins”대상을 빌드할 때 생성 된 구성 파일. 이 구성에는 build.settings에 지정된 플러그인을 사용하는 데 필요한 정보가 포함될 수 있습니다. 또한 CoronaNative.xcconfig도 포함됩니다.

프로젝트 플로우

다음 단계에서는 iOS 용 /Applications/Corona/Native/Project Template/App/ 프로젝트의 흐름을 간략하게 설명합니다.

1. ios/main.mm – 실행시 MyCoronaDelegate는 CoronaDelegate 인터페이스를 구현하는 클래스로 등록됩니다. 코로나는 이 클래스의 인스턴스를 인스턴스화하고 ‘init’ 상태라고 가정합니다.

2. ios/AppCoronaDelegate.mm – Corona/main.lua가 호출되기 직전에 willLoadMain 메소드가 호출됩니다. 이 시점부터 OpenGL이 설정되고 모든 Corona 프레임 워크를 사용할 수 있습니다.

3. Corona/main.lua – Lua 코드에서 plugin.library는 require()를 통해 로드됩니다. 그러면 코로나 엔진은 luaopen_plugin_library라는 해당 C 함수를 찾아 호출합니다. 이 함수의 이름은 동적이며 require()에 전달 된 원래 라이브러리 이름을 사용하여 구성됩니다. 그 이름을 취하고 luaopen_ 접두사를 추가 한 다음 .을 _로 바꿉니다.

4. ios/Plugin/PluginLibrary.mm – luaopen_plugin_library가 호출되면 PluginLibrary::Open을 호출합니다. 예를 들어 Lua 라이브러리 테이블 생성, show()와 같은 Lua 메소드 등록, 루아 스택.

코로나 네이티브 개발

Lua/C 브리지

루아와 C 코드를 연결하기 위해서 Lua C API가 제공하는 기능을 사용할 것입니다. 이렇게 하면 Lua에서 C로 직접 호출할 수 있는 라이브러리와 함수를 추가 할 수 있습니다.

Lua C API의 모든 함수는 첫 번째 인수로 lua_State 포인터 L을 사용합니다. CoronaRuntime 인스턴스를 통해 적절한 lua_State 변수에 액세스 할 수 있습니다.

루아 C API를 성공적으로 사용하려면 루아 스택을 이해해야 합니다. 이 스택은 함수 호출 스택과 다릅니다. Lua-C 브릿지 전반에 걸친 데이터 정렬을 용이하게 하도록 설계되었습니다. 자세한 내용은 여기를 참조하십시오.

네이티브 APIs

다음은 iOS 용 Corona Native에만 해당됩니다:

CoronaDelegate – 루아 레이어에서 자신의 함수를 추가하고 싶다면 이 프로토콜을 구현해야 합니다. 또한 이 프로토콜 구현을 통해 UIApplicationDelegate 이벤트를 인터셉트 할 수 있습니다.

CoronaRuntime – 코로나 엔진에서 사용하는 루아 상태(state)를 비롯한 주요 객체는 이 프로토콜을 통해 액세스 할 수 있습니다. Corona 엔진을 사용하면 CoronaDelegate를 통해 액세스 할 수 있습니다.

CoronaLuaIOS.h – 루아와 네이티브 Obj-C 코드 사이를 연결하는 데 도움이 되는 추가 함수가 포함되어 있습니다. 이는 CoronaLua.h에서 일련의 교차 플랫폼 기능을 보완하기 위한 것입니다.

Corona C Functions – Corona 엔진이 제공하는 C 함수 모음으로, 이벤트를 디스패치하는 것과 같은 코로나 특유의 패턴에 대해 Lua와 상호 작용할 수 있습니다.

플러그인 사용하기

코로나 네이티브 프로젝트에서 코로나 플러그인을 얻고 포함시키는 방법에 대한 지침은 코로나 기본 플러그인 사용 – iOS 가이드를 참조하십시오.

오리엔테이션 설정

iOS에서 Corona Native를 사용할 때 Corona를 특정 방향으로 제한하려면 프로젝트의 build.settings에서 방향 표를 사용할 수 있습니다. 자세한 내용은 프로젝트 빌드 설정을 참조하십시오.

또는 Info.plist 파일 (템플릿 응용 프로그램의 App-Info.plist)을 편집하고 UISupportedInterfaceOrientations와 유사한 옵션이 있는 CoronaViewSupportedInterfaceOrientations 배열을 추가 할 수 있습니다. 예를 들어 모든 방향을 사용하려면 다음과 같이하십시오.

1
2
3
4
5
6
7
<key>CoronaViewSupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationLandscapeLeft</string>
    <string>UIInterfaceOrientationLandscapeRight</string>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>

런타임(Runtime)으로 이벤트 보내기

Corona의 모든 이벤트는 Lua 테이블입니다. 전역 런타임 객체로 이벤트를 보내기 위해 CoronaLuaRuntimeDispatchEvent()라는 편리한 유틸리티 함수를 CoronaLua.h에 추가했습니다.

다음 루아 코드에서는 “delegate”타입의 커스텀 이벤트를 생성합니다. Corona가 이벤트를 Lua 테이블로 인식하려면 Lua 테이블의 name 속성을 이벤트 유형으로 설정해야 합니다.

1
2
local event = { name="delegate" }
Runtime:dispatchEvent( event )

그런 다음이 호출을 원시 코드로 변환하고 CoronaDelegate의 didLoadMain 메소드에서 이벤트를 보냅니다:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@implementation MyCoronaDelegate
 
- (void)didLoadMain:(id<CoronaRuntime>)runtime
{
    lua_State *L = runtime.L;
 
    // DISPATCH CUSTOM EVENT
    // Create 'delegate' event
    const char kNameKey[] = "name";
    const char kValueKey[] = "delegate";
    lua_newtable( L );
    lua_pushstring( L, kValueKey );     // All events are Lua tables
    lua_setfield( L, -2, kNameKey );    // that have a 'name' property
 
    Corona::Lua::RuntimeDispatchEvent( L, -1 );
}
 
@end

사용자 정의 라이브러리 등록

루아에서 네이티브 C 코드를 래핑하는 라이브러리를 추가하려면 플러그인 가이드네이티브 C 섹션에 설명 된대로 표준 루아 규칙을 따라야 합니다.

커스텀 루아 오류 처리

CoronaLuaSetErrorHandler()를 호출하여 커스텀 루아 에러 핸들러를 등록 할 수 있습니다. 처리기는 Corona의 내부 기본 오류 처리기를 재정의하고 런타임에 Lua 오류가 발생할 때마다 호출됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
static int MyTraceback( lua_State *L )
{
    lua_getfield(L, LUA_GLOBALSINDEX, "debug");
    if (!lua_istable(L, -1)) {
        lua_pop(L, 1);
        return 1;
    }
    lua_getfield(L, -1, "traceback");
    if (!lua_isfunction(L, -1)) {
        lua_pop(L, 2);
        return 1;
    }
    lua_pushvalue(L, 1);  // pass error message
    lua_pushinteger(L, 1);  // skip this function and traceback
    lua_call(L, 2, 1);  // call debug.traceback
 
    // Log result of calling debug.traceback()
    NSLog( @"[LUA ERROR]: %s", lua_tostring( L, -1 ) );
 
    return 1;
}
 
@implementation MyCoronaDelegate
- (void)willLoadMain:(id<CoronaRuntime>)runtime
{
    Corona::Lua::SetErrorHandler( MyTraceback );
}
@end

OpenGL 컨텍스트가 일치하지 않음

OpenGL을 사용하는 타사 그래픽 라이브러리는 자체 OpenGL 컨텍스트를 사용합니다. 그러나 Corona는 주 스레드에서 렌더링을 수행하며 OpenGL 컨텍스트가 변경 될 것으로 예상하지 않습니다. 결과적으로 특정 그래픽 라이브러리를 사용하는 경우 실수로 코로나 렌더링 / 업데이트에 문제를 일으킬 수 있는 OpenGL 컨텍스트가 변경 될 수 있습니다.
코드가 OpenGL을 적절하게 다루는 지 확인하려면 다음과 같이 OpenGL 컨텍스트 변경이 “균형 잡힌(balanced)” 상태인지 확인해야 합니다.

1
2
3
4
5
6
7
8
// 1. Corona context 저장
EAGLContext *context = nil;
context = [EAGLContext currentContext];
 
// 2. third-party library 호출
 
// 3. Corona context 복원
[EAGLContext setCurrentContext:context];

예를 들어, 모달 뷰 컨트롤러를 통해 타사 라이브러리의 인터페이스를 표시하는 경우 presentViewController:animated:completion: call에서 1 단계와 2 단계를 수행 한 다음 dismissViewControllerAnimated:completion: call에서 3 단계를 수행합니다.

디바이스를 위한 빌드

Xcode에서 코로나 네이티브 프로젝트를 빌드하려면 여기 Apple 지침을 따르십시오.