尝试使用 FlashDevelop 将 SWF 转换为 AIR 中的独立 EXE

Attempting to convert SWF to standalone EXE in AIR with FlashDevelop

这个问题已经困扰我一段时间了,我正在尝试从我正在制作的游戏的 SWF 中制作一个独立的 EXE,但在此过程中我遇到了很多麻烦。我希望它是独立的,这意味着没有安装程序,我希望用户能够打开 EXE 并自动开始播放。我正在使用 FlashDevelop 的 AIR AS3 Projector Project 并且已经解决了几乎所有的问题,但最后还是遇到了一个障碍。我已经能够构建 EXE,但在尝试启动时遇到错误,内容如下: "This application requires a version of Adobe AIR which cannot be found." 我已确保我的 AIR 项目和游戏项目都使用 AIR 版本 17,但仍然没有正在工作。

我将在下面提供蝙蝠的代码,希望有人能解决这个问题。

Packager.bat

@echo off

:: Set working dir
cd %~dp0 & cd ..

if not exist %CERT_FILE% goto certificate

:: AIR output
if not exist %AIR_PATH% md %AIR_PATH%
set OUTPUT=%AIR_PATH%\%AIR_NAME%%AIR_TARGET%.air

:: Package
echo.
echo Packaging %AIR_NAME%%AIR_TARGET%.air using certificate %CERT_FILE%...
adt -package -keystore bat\TheLabyrinth.p12 -storetype pkcs12 -target bundle The_Labyrinth application.xml -C bin TheLabyrinth.swf TheLabyrinthGame.swf lib\backgrounds\cobblestone.png lib\backgrounds\frameBackground.png lib\backgrounds\fullscreenCobble.png lib\backgrounds\parchment.png lib\backgrounds\parchmentFrameBackground.png lib\spritesheet.png
call adt -package %OPTIONS% %SIGNING_OPTIONS% %OUTPUT% %APP_XML% %FILE_OR_DIR%
if errorlevel 1 goto failed
goto end

:certificate
echo.
echo Certificate not found: %CERT_FILE%
echo.
echo Troubleshooting: 
echo - generate a default certificate using 'bat\CreateCertificate.bat'
echo.
if %PAUSE_ERRORS%==1 pause
exit

:failed
echo AIR setup creation FAILED.
echo.
echo Troubleshooting: 
echo - verify AIR SDK target version in %APP_XML%
echo.
if %PAUSE_ERRORS%==1 pause
exit

:end
echo.

Application.xml

<?xml version="1.0" encoding="utf-8" ?> 
<application xmlns="http://ns.adobe.com/air/application/17.0">

    <id>TheLabyrinth</id> 
    <versionNumber>1.0</versionNumber> 
    <filename>TheLabyrinth</filename> 

    <name>The Labyrinth</name> 
    <description></description> 
    <copyright></copyright> 

    <initialWindow> 
        <title>The Labyrinth</title> 
        <content>TheLabyrinth.swf</content> 
        <systemChrome>standard</systemChrome> 
        <transparent>false</transparent> 
    <visible>true</visible> 
    <minimizable>true</minimizable> 
    <maximizable>true</maximizable> 
    <resizable>true</resizable> 
</initialWindow> 

<!-- 
More options:
http://livedocs.adobe.com/flex/3/html/File_formats_1.html#1043413
-->
</application>

感谢您对此提供的任何帮助,我已经广泛搜索了答案,但我还没有找到解决办法。

好的,我忘记了这个问题,但我会回来回答它以防其他人偶然发现它。每当使用 FlashDevelop 来创建独立的可执行文件时,我都会在创建新项目时选择 AIR AS3 Projector。这将已经包含您需要使用下面我的文件更改的批处理文件(我还将显示您需要进行的任何独特更改)。从那里开始,我从以前的项目中复制了批处理文件的设置。

首先,我将展示 application.xml,因为它有一些我们想要事先检查的东西。当您在调试或发布模式下启动程序时,设置将自动填充在此 xml 中。这个具体的例子来自我女朋友的一个名为 Charlene 的游戏:

<?xml version="1.0" encoding="utf-8"?>
<application xmlns="http://ns.adobe.com/air/application/21.0">
    <id>Charlene</id>
    <versionNumber>1.0</versionNumber>
    <filename>Charlene</filename>
    <name>Charlene</name>
    <initialWindow>
        <title>Charlene</title>
        <content>Charlene.swf</content>
        <systemChrome>standard</systemChrome>
        <transparent>false</transparent>
        <visible>true</visible>
        <minimizable>true</minimizable>
        <maximizable>false</maximizable>
        <resizable>false</resizable>
        <x>0</x>
        <y>0</y>
        <minSize>800 800</minSize>
    </initialWindow>
    <!-- 
    More options:
    http://livedocs.adobe.com/flex/3/html/File_formats_1.html#1043413
    -->
    <supportedProfiles>extendedDesktop</supportedProfiles>
    <android>
        <manifestAdditions><![CDATA[<manifest android:installLocation="auto" xmlns:android="http://schemas.android.com/apk/res/android" />]]></manifestAdditions>
    </android>
</application>

这里有两点需要注意:application xmlns 版本必须与您正在使用的 AIR 版本相同(这可以通过单击“项目”,然后单击“属性”来查看)。如果这不是同一版本,只需更改 xml 或属性中的版本,否则您的程序将无法编译。

接下来要注意的是supportedProfiles。如果您希望键盘在程序全屏时工作,则需要 extendedDesktop 设置。

现在我们来看看 CreateCertificate.bat。您需要先 运行 这个批处理文件,因为编译器需要一个证书来打包您的程序。这将为您的程序创建一个唯一的密钥,名称为 "YourProgramTitle.p12":

@echo off

:: Set working dir
cd %~dp0 & cd ..

set PAUSE_ERRORS=1
call bat\SetupSDK.bat
call bat\SetupApp.bat

:: Generate
echo.
echo Generating a self-signed certificate...
call adt -certificate -cn %CERT_NAME% 2048-RSA %CERT_FILE% %CERT_PASS%
if errorlevel 1 goto failed

:succeed
echo.
echo Certificate created: %CERT_FILE% with password "%CERT_PASS%"
echo.
if "%CERT_PASS%" == "fd" echo Note: You did not change the default password
echo.
echo HINTS: 
echo - you only need to generate this certificate once,
echo - wait a minute before using this certificate to package your AIR application.
echo.
goto end

:failed
echo.
echo Certificate creation FAILED.
echo.

:end
pause

这里没有特殊设置,继续PackageApp.bat。这是另一批不需要特定更改的批次,此处的设置应该适用于编译您的项目:

@echo off

:: Set working dir
cd %~dp0 & cd ..

set PAUSE_ERRORS=1
call bat\SetupSDK.bat
call bat\SetupApp.bat

set AIR_TARGET=air/Setup.exe
::set AIR_TARGET=-captive-runtime
set OPTIONS=-tsa none
call bat\Packager.bat

pause

下一个是大的,Packager.bat。再次重申,这里没有特殊设置,这个批处理文件应该可以复制过来,不要更改:

@echo off

:: Set working dir
cd %~dp0 & cd ..

if not exist %CERT_FILE% goto certificate

:: AIR output
if not exist %AIR_PATH% md %AIR_PATH%
set OUTPUT=-target bundle %AIR_NAME%

:: Package
echo.
echo Packaging %AIR_NAME%%AIR_TARGET%.air using certificate %CERT_FILE%...
call adt -package %OPTIONS% %SIGNING_OPTIONS% %OUTPUT% %APP_XML% %FILE_OR_DIR%
if errorlevel 1 goto failed
goto end

:certificate
echo.
echo Certificate not found: %CERT_FILE%
echo.
echo Troubleshooting: 
echo - generate a default certificate using 'bat\CreateCertificate.bat'
echo.
if %PAUSE_ERRORS%==1 pause
exit

:failed
echo AIR setup creation FAILED.
echo.
echo Troubleshooting: 
echo - verify AIR SDK target version in %APP_XML%
echo.
if %PAUSE_ERRORS%==1 pause
exit

:end
echo.

接下来是 RunApp.bat。这里没有太多内容,但无论如何我都会包含它:

@echo off

:: Set working dir
cd %~dp0 & cd ..

set PAUSE_ERRORS=1
call bat\SetupSDK.bat
call bat\SetupApp.bat

echo.
echo Starting AIR Debug Launcher...
echo.

adl "%APP_XML%" "%APP_DIR%"
if errorlevel 1 goto error
goto end

:error
pause

:end

如果您希望 cmd 在调试器启动之前显示不同的消息,您实际上可以更改 echo Starting AIR Debug Launcher... 行。

我们要看看 SetupApp.bat。这有一些您必须更改以适合您的程序的参数:

:: Set working dir
cd %~dp0 & cd ..

:user_configuration

:: About AIR application packaging
:: http://livedocs.adobe.com/flex/3/html/help.html?content=CommandLineTools_5.html#1035959
:: http://livedocs.adobe.com/flex/3/html/distributing_apps_4.html#1037515

:: NOTICE: all paths are relative to project root

:: Your certificate information
set CERT_NAME="Charlene"
set CERT_PASS=fd
set CERT_FILE="bat\Charlene.p12"
set SIGNING_OPTIONS=-storetype pkcs12 -keystore %CERT_FILE% -storepass %CERT_PASS%

:: Application descriptor
set APP_XML=application.xml

:: Files to package
set APP_DIR=bin
set FILE_OR_DIR=-C %APP_DIR% .

:: Your application ID (must match <id> of Application descriptor) and remove spaces
for /f "tokens=3 delims=<>" %%a in ('findstr /R /C:"^[  ]*<id>" %APP_XML%') do set APP_ID=%%a
set APP_ID=%APP_ID: =%

:: Output
set AIR_PATH=air
set AIR_NAME=Charlene

:validation
findstr /C:"<id>%APP_ID%</id>" "%APP_XML%" > NUL
if errorlevel 1 goto badid
goto end

:badid
echo.
echo ERROR: 
echo   Application ID in 'bat\SetupApp.bat' (APP_ID) 
echo   does NOT match Application descriptor '%APP_XML%' (id)
echo.
if %PAUSE_ERRORS%==1 pause
exit

:end

此处,set CERT_NAME="Charlene" 行的字符串名称应等于 application.xml 中的 name 参数。 set CERT_FILE="bat\Charlene.p12" 文件名应该与您 运行 创建时 CreateCertification.bat 的名称相同(运行 如果您还没有创建它)。 set AIR_NAME=Charlene 应该再次与 CERT_NAME 同名(假设您希望完成的项目与调试的项目同名)。

最后我们要看看SetupSDK.bat。这其中有一行您必须更改:

:: Set working dir
cd %~dp0 & cd ..

:user_configuration

:: Static path to Flex SDK
set FLEX_SDK=C:\Users\Alec\AppData\Local\FlashDevelop\Apps\flexairsdk.6.0+21.0.0

:: Use FD supplied SDK path if executed from FD
if exist "%FD_CUR_SDK%" set FLEX_SDK=%FD_CUR_SDK%

:validation
if not exist "%FLEX_SDK%\bin" goto flexsdk
goto succeed

:flexsdk
echo.
echo ERROR: incorrect path to Flex SDK in 'bat\SetupSDK.bat'
echo.
echo Looking for: %FLEX_SDK%\bin
echo.
if %PAUSE_ERRORS%==1 pause
exit

:succeed
set PATH=%FLEX_SDK%\bin;%PATH%

set FLEX_SDK 应该有您的 Flex+AIR SDK 的路径。如果您需要知道路径,单击 Project 选项卡,然后单击 Properties,导航到 SDK 选项卡,单击 Manage,单击 Installed Flex SDKs 参数, 单击 InstalledSDK[] Array 右侧的省略号方块,确保您在左侧 Members 侧选择了最新版本的 SDK(或与您的版本相同的版本) application.xml 文件),展开 window,您应该会在 Location 字段下看到路径。

好的,这是一条漫长的道路。测试您的项目以确保您的本地 swf 已更新,然后 运行 PackageApp.bat。如果一切设置正确,应该没有错误,几秒钟后 cmd 将显示 "Press any key to continue",并且项目目录中应该会出现一个包含项目名称的新文件夹。此文件夹应包含另一个名为 Adobe AIR 的文件夹、一个 lib 文件夹、一个 META-INF 文件夹、一个包含项目名称的 exe、一个包含项目名称的 swf,以及一个 mimetype文件。您应该能够 运行 没有问题的 exe。你有它!希望这适用于遇到此问题的其他人。

快速说明:我注意到在打包相对较大的项目时,有时批处理文件不会编译完整的项目。在完全编译之前可能需要多次尝试,但我发现了一个作弊。它需要一个已经存在的、完全编译的项目。您需要做的就是将项目的 swf(通常位于 bin 文件夹中)复制到打包项目的文件夹中。如果您更改了其他文件,您可能还需要复制它们,例如 application.xml(编译后的文件位于 META-INF\AIR 目录),或者 lib 文件夹,如果您在 run-time 期间导入任何内容。这可以让你绕过重新编译!