CoronaCards — Windows Phone 8

Lua/.NET 通信

通过 Corona 运行时事件在 Lua 环境和 .NET(C# 或 Visual Basic)或 C++/CX 组件环境之间执行内部互操作通信。当 CoronaPanel XAML 控件加载 Corona 项目时,它会引发一个“已加载”事件,提供 CoronaRuntimeEnvironment 类的新实例。此实例表示项目的已加载 Lua 环境,使用此对象,可以在 Lua 中侦听并派发 Corona 运行时事件。

C# 至 Lua

以下示例说明了 C# 请求 Lua 将两个数字相加并将结果返回到 C#。通过让 C# 向 Lua 派发一个名为 “requestingSum” 的事件,该事件带有两个数字属性,就可以实现这一点。Lua 侦听器会接收到此事件,然后将和返回到 C#。

// [C#]

/// <summary>Constructor. Initializes member variables and the user interface.</summary>
public MainPage()
{
    // Initialize this page's components that were set up via the UI designer.
    InitializeComponents();

    // Set up Corona to automatically start up when the control's Loaded event has been raised.
    fCoronaPanel.AutoLaunchEnabled = true;

    // Add a Corona event handler which detects when the Corona project has been started.
    fCoronaPanel.Runtime.Started += OnCoronaRuntimeStarted;
}

/// <summary>Called when the Corona runtime has started and finished loaded the "main.lua" file.</summary>
/// <param name="sender">The CoronaRuntime object that raised this event.</param>
/// <param name="e">Event arguments providing the CoronaRuntimeEnvironment that has been started.</param>
private void OnCoronaRuntimeStarted(object sender, CoronaLabs.Corona.WinRT.CoronaRuntimeEventArgs e)
{
    // Create a custom Corona event named "requestingSum" with the following properties.
    // This will be converted into a Lua "event" table once dispatched by Corona.
    var eventProperties = CoronaLabs.Corona.WinRT.CoronaLuaEventProperties.CreateWithName("requestingSum");
    eventProperties.Set("x", 5);
    eventProperties.Set("y", 10);
    eventProperties.Set("message", "Hello. Can you add these 2 numbers please?");

    // Dispatch the event to Lua.
    var eventArgs = new CoronaLabs.Corona.WinRT.CoronaLuaEventArgs(eventProperties);
    var result = e.CoronaRuntimeEnvironment.DispatchEvent(eventArgs);

    // Check if a number was returned from the Lua listener.
    var boxedNumber = result.ReturnedValue as CoronaLabs.Corona.WinRT.CoronaBoxedNumber;
    if (boxedNumber != null)
    {
        // A number was returned from Lua. Fetch it.
        double sum = boxedNumber.Value;
    }
}
-- [Lua]

-- Called when a Corona event named "requestingSum" has been dispatched
local function onRequestingSum( event )
    -- Print event property "message" to Visual Studio's Output Panel
    print( event.message )

    -- Sum event properties "x" and "y" and return the result back to C#
    return event.x + event.y
end

-- Set up the above function to be called when an event named "requestingSum" has been dispatched
Runtime:addEventListener( "requestingSum", onRequestingSum )

Lua 至 C#

以下示例说明了 Lua 请求 C# 通过派发 “requestingMessageBox” 事件显示本机消息框。当 Corona 运行时加载时,应用程序的 C# 端会设置 Corona 事件侦听器 - 这是添加 Corona 运行时事件侦听器的最佳时机,因为“已加载”事件在执行 main.lua 之前在 C# 中引发。

// [C#]

/// <summary>Constructor. Initializes member variables and the user interface.</summary>
public MainPage()
{
    // Initialize this page's components that were set up via the UI designer.
    InitializeComponents();

    // Set up Corona to automatically start up when the control's Loaded event has been raised.
    fCoronaPanel.AutoLaunchEnabled = true;

    // Add a Corona event handler which detects when the Corona project has been loaded, but not started yet.
    fCoronaPanel.Runtime.Loaded += OnCoronaRuntimeLoaded;
}

/// <summary>
///  Called when a new CoronaRuntimeEnvironment has been created/loaded,
///  but before the "main.lua" has been executed.
/// </summary>
/// <param name="sender">The CoronaRuntime object that raised this event.</param>
/// <param name="e">Event arguments providing the CoronaRuntimeEnvironment that has been created/loaded.</param>
private void OnCoronaRuntimeLoaded(object sender, CoronaLabs.Corona.WinRT.CoronaRuntimeEventArgs e)
{
    // Set up C# method OnRequestingMessageBox() to be invoked when Corona runtime event
    // "requestingMessageBox" has been dispatched.
    e.CoronaRuntimeEnvironment.AddEventListener("requestingMessageBox", OnRequestingMessageBox);
}

/// <summary>Called when Corona runtime event "requestingMessageBox" has been dispatched.</summary>
/// <param name="sender">The CoronaRuntimeEnvironment that dispatched the event.</param>
/// <param name="e">Provides the Lua event table's fields/properties.</param>
private CoronaLabs.Corona.WinRT.ICoronaBoxedData OnRequestingMessageBox(
    CoronaLabs.Corona.WinRT.CoronaRuntimeEnvironment sender,
    CoronaLabs.Corona.WinRT.CoronaLuaEventArgs e)
{
    // Fetch the "event.message" property.
    var boxedMessage = e.Properties.Get("message") as CoronaLabs.Corona.WinRT.CoronaBoxedString;
    if (boxedMessage == null)
    {
        // A "message" property was not provided or it was not of type string.
        // Return an error message to Lua describing what went wrong.
        return CoronaLabs.Corona.WinRT.CoronaBoxedString.From("'event.message' is a required field.");
    }

    // Display a native message box with the given string.
    System.Windows.MessageBox.Show(boxedMessage.ToString());

    // Return a success message to Lua.
    return CoronaLabs.Corona.WinRT.CoronaBoxedString.From("Message box was displayed successfully!");
}
-- [Lua]

-- Dispatch an event named "requestingMessageBox" to be received by C#
local requestingMessageBoxEvent =
{
    name = "requestingMessageBox",
    message = "Hello World!"
}
local result = Runtime:dispatchEvent( requestingMessageBoxEvent )

-- Print the message returned by C#
print( tostring(result) )

类框架

此处可以找到 Corona .NET/C++/CX 类框架的文档 在此处