CoronaCards — Windows Phone 8

移植已有 Corona 项目

重要事项

在移植已有 Corona 项目之前,请确保它使用了 Windows Phone 8 的 CoronaCards 支持 的功能。

复制项目文件

  1. 在 Visual Studio 中,查看解决方案资源管理器面板。
  2. 展开项目的资产Corona 树。
  3. 打开Windows 资源管理器,浏览到 Corona 项目的根文件夹,然后选择所有文件。
  4. 将文件拖放到 Visual Studio 中的资产Corona 树内。
  5. 突出显示Corona 树内的所有 Corona 文件。
  6. 属性面板中,对于生成操作,在下拉菜单中选择内容

备注
  • 如果您将 Corona 文件拖放到 Visual Studio 的项目中,它还将复制这些文件到您的 C# 项目目录中。
  • 不需要包含任何非 MicrosoftWindows Phone 开发的资产。例如,您可以省略 build.settings 文件、iOS/Android 应用图标、启动图像以及不属于 Windows Phone 平台的其他项目。
  • 将您文件的生成操作设置为内容配置 Visual Studio,以便将这些文件添加到编译的 Windows Phone .xap 捆绑包中。这是 Visual Studio 无法识别的文件扩展名的必要条件,例如 .ttf.json 和其他文件类型。

添加应用图标

诸如 Icon.pngIcon-hdpi.png 等 Corona 图标图像文件在 Windows Phone 中不支持,并将被忽略。因此,您应该从 Visual Studio 项目的 Assets\Corona 目录中省略这些文件。

要在 Windows Phone 中包含应用程序图标,请创建一个名为 ApplicationIcon.png 的 100×100 像素的 PNG 图像文件。当您在 Visual Studio 中创建一个新的 Windows Phone 项目时,项目中的 Assets 目录中将自动生成一个默认的 ApplicationIcon.png。您应该用自定义图像编辑或替换此文件。与 iOS 或 Android 不同,Windows Phone 不支持不同分辨率的多个应用程序图标文件 — 操作系统将简单地缩放主图标。

Windows Phone 还可以为您的应用程序在开始屏幕上显示一个磁贴。当您在 Visual Studio 中创建一个新的 Windows Phone 项目时,项目的 Assets\Tiles 目录下将自动创建默认磁贴图像。有关磁贴支持的更多详细信息,请参阅 Microsoft 文档

设置应用方向

对于 iOS 和 Android 项目,您通常通过 build.settings 文件指示支持的方向。此文件在 Windows Phone 上不支持并且会被忽略。因此,您应该从 Visual Studio 项目的 Assets\Corona 目录中省略此文件。

若要设置 Windows Phone 应用程序的方向,请按照以下步骤操作

  1. 在 Visual Studio 中,查看解决方案资源管理器面板。
  2. 双击 MainPage.xaml 文件。
  3. 在 XML 编辑器中,单击 <phone:PhoneApplicationPage> 标记的 SupportedOrientation 属性。
  4. 查看属性面板,然后单击SupportedOrientations下拉框。
  5. 选择纵向横向纵向或横向

识别平台

在 Lua 中,可以使用以下代码检查应用程序是否在 Windows Phone 上运行

if ( system.getInfo("platformName") == "WinPhone" ) then
    -- This app is running on Windows Phone
end

Back 键支持

Windows Phone 拥有一个“返回”键,就像 Android 设备一样。按此键将退出应用程序,因此您需要重写此键,并在自己的 Corona 场景中实现向后导航,然后再允许应用程序退出。

local function onKeyEvent( event )
    -- If the 'back' key was pressed on Android or Windows Phone, prevent it from backing out of your app
    local platformName = system.getInfo( "platformName" )
    if ( platformName == "Android" ) or ( platformName == "WinPhone" ) then
        if ( event.keyName == "back" ) then
            -- Navigate back one scene or display an 'Are you sure you want to exit' alert
            return true
        end
    end

    -- Return false to indicate that this app is *not* overriding the received key.
    -- This lets the operating system execute its default handling of this key.
    return false
end

-- Add the key event listener
Runtime:addEventListener( "key", onKeyEvent )

呼叫/通知中断

Windows Phone 操作系统在接收到来电时不会自动暂停您的应用程序。相反,当发生电话时,Windows Phone 会在应用程序上覆盖一个通知,但应用程序将继续运行。因此,Microsoft 允许开发人员决定应用程序是否应在电话期间暂停。但是,游戏在电话期间应该暂停,并且如果不暂停,Microsoft 将拒绝您的游戏进入 Windows Phone 商店。

在操作系统引发 .NET Obscured 事件时,您可以检测到电话中断。但是,请注意,当收到通知时,此事件也会引发。目前,没有办法区分这两种事件,但您可以以类似的方式处理它们,因为 Windows Phone 通知会阻碍屏幕的很大一部分,并且在这两种情况下都应该暂停游戏。

若要在此事件中暂停应用程序,请执行以下操作

  1. 在 Visual Studio 中,查看解决方案资源管理器面板。
  2. 双击树中的 MainPage.xaml 文件下方的 MainPage.xaml.cs 文件。
  3. 按如下方式编辑代码
// [C#]

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        // Initialize this page's components that were set up via the UI designer.
        InitializeComponent();

        // Set up Corona to automatically start up when the control's Loaded event has been raised.
        // Note: By default, Corona will run the "main.lua" file in the "Assets\Corona" directory.
        //       You can change the defaults via the CoronaPanel's AutoLaunchSettings property.
        fCoronaPanel.AutoLaunchEnabled = true;

        // Set up the CoronaPanel control to render fullscreen via the DrawingSurfaceBackgroundGrid control.
        // This significantly improves the frame rate and is the only means of achieving 60 FPS.
        fCoronaPanel.BackgroundRenderingEnabled = true;
        fDrawingSurfaceBackgroundGrid.SetBackgroundContentProvider(fCoronaPanel.BackgroundContentProvider);
        fDrawingSurfaceBackgroundGrid.SetBackgroundManipulationHandler(fCoronaPanel.BackgroundManipulationHandler);

        // Add application event handlers.
        App.RootFrame.Obscured += OnAppObscured;
        App.RootFrame.Unobscured += OnAppUnobscured;
    }

    private void OnAppObscured(object sender, ObscuredEventArgs e)
    {
        if (e.IsLocked == false)
        {
            fCoronaPanel.Runtime.Suspend();
        }
    }

    private void OnAppUnobscured(object sender, EventArgs e)
    {
        fCoronaPanel.Runtime.Resume();
    }
}
注意

您可以通过 Windows Phone 模拟器模拟电话或通知中断。这样可以轻松测试并验证上述解决方案是否正常运行。

优化文本性能

通过 display.newText()display.newEmbossedText() 生成的文本,以及 widgets 中的文本渲染,这是一个在 Windows Phone 上速度慢且昂贵的操作。此性能问题是由操作系统的原生文本渲染 API 引起的,并且无法通过 Corona Labs 进一步优化。

针对此性能问题的解决方法之一是使用“位图”字体。这意味着要设置一个 imageSheet,其中包含所有必需的字母/字符,然后通过 display.newImage()display.newImageRect() 对象渲染文本。这将极大地提高您的应用程序的文本渲染性能,因为所有字符都将被预加载.

可以考虑以下第三方位图字体库

请注意,位图字体库最适合用于受您应用程序控制的文本。这意味着不应该将其用于从 Facebook、Twitter 或其他外部源获取的文本字符串,因为该文本可能包含未包含在您的 imageSheet 中的特殊字符。在这种情况下,使用 display.newText() 是可以接受的,因为文本不太可能频繁更新/更改。

最后,关于小部件,仅当小部件包含文本(例如插入到的文本)时,才会出现性能损失 tableView 行。在此时插入文本时,您应该预加载display.newText() 生成的文本或使用位图字体。

使用嵌入字体

如果 Corona 项目包含 .ttf.otf 字体文件,且希望通过 display.newText() 或类似函数使用它,则必须使用以下字体命名约定,这是 Corona 用于加载嵌入字体的一种标准 Windows Phone XAML 字体命名标准。

local fontName = "<MyFontNamePlusExtension>#<My Font Family Name>"

例如,如果将名为 Times.ttfTimes New Roman 字体文件复制到项目的 Assets\Corona 文件夹,则它可能会以以下方式显示

local myText = display.newText( "My Text", 0, 0, "Times.ttf#Times New Roman", 8 )

在 Windows 中,你可以通过双击 .ttf.otf 文件来确定其字体系列名称。这将显示一个窗口,其中在标题栏或 字体名称: 字段旁边显示了字体系列名称。

请注意,Windows Phone 可能拒绝加载某些字体文件,并改用系统字体。如果操作系统拒绝加载你提供的特定字体,则需要使用其他字体文件,或使用位图字体库生成位图字体。

音频支持

对于 Windows Phone 上的音频播放,CoronaCards 支持以下音频文件格式

  • .ogg(Ogg Vorbis)
  • .wav(16 位未压缩)

Windows Phone 8 版的 CoronaCards 不支持 音频 录制 功能。

应用内购买

Windows Phone 8 版的 CoronaCards 不支持 store API,因此不具有直接应用内购买 (IAP) 支持。不过,你可以自己通过 Lua/.NET 通信 来实现 IAP,请在此处查看示例代码 here

实现缺少的功能

如果你的应用需要 Windows Phone 8 版 CoronaCards 中不支持的其他功能,则你可以自己用 .NET 来实现这些功能。如需详细了解,请继续阅读 Lua/.NET 通信 指南。