c# - 使用 Windows 窗体移植旧的 Flash 游戏 - 如何嵌入 Flash Player dll?

标签 c# winforms flash

大约十年前,我开发了一些比较流行的 Flash 游戏,最近有人要求我将它们移植到 Steam。几天来我一直在研究如何做到这一点,但感觉就像是在试图弄清楚如何让 GameBoy 卡带在 iPhone 上工作,谷歌搜索答案就像考古学一样,因为再也没有人谈论 Flash。

Flash 可以构建成捆绑了 Flash Player 的 exe 投影仪,但它会将保存的数据存储在脆弱的 cookie 中,因此我需要构建一个可以与其交换数据的包装器,以更可靠地保存数据。我设法在 Windows 窗体中构建了一些简单的东西(我的经验有限),但是有两种可能性,每种都有不同的问题:

一个是我加载了Flash文件的exe win projector版本作为一个进程:

game = Process.Start ( "MARDEK.exe" );
game.WaitForInputIdle ( );
game.EnableRaisingEvents = true;
game.Exited += ( sender, e ) => { Close ( ); };

这可行,并且不需要用户安装 Flash Player,但我不知道它是否可以与 C# 双向交换数据。

另一种可能性是直接嵌入 swf:

swf = new AxShockwaveFlashObjects.AxShockwaveFlash ( );
Controls.Add ( swf );
swf.Size = new Size ( 720, 528 );
swf.Location = new Point ( 10, 10 );
swf.BringToFront ( );
swf.LoadMovie ( 0, "MARDEK.swf" );

认为然后 swf 可以使用称为 ExternalInterface 的东西与 C# 来回通信。不过,一个大问题是我认为 Flash Player 没有被捆绑,因此用户应该单独安装它。这是 Not Acceptable 。

我发现我的系统上安装了 Flash Player 的一些 .dll 文件,但我不知道是否可以将它们捆绑在一起并让 AxShockwaveFlashObjects 使用它们而不是用户安装的文件。这可能是理想的情况。

我知道这是一个模糊的问题 - 这就是为什么我不得不问,因为谷歌告诉我的很少 - 但我们将不胜感激任何帮助!

最佳答案

哟,我已经在 Steam 上发布了 AS2 和 AS3 Flash 游戏。以下是我能马上记住的内容:

简单的方法是使用 SWFLoader(如果你想使用 AIR 的 Flashplayer,EBF3 使用它)或 HTMLLoader(如果你想使用网络 Flashplayer,EBF5 使用它)制作一个 AS3 Adob​​e AIR 包装器加载 swf 游戏文件) 并使用 LocalConnection 与其通信。这与 AS2 和 AS3 swfs 的工作方式类似。 LocalConnection 非常可靠,除非用户的计算机承受很大压力 - 然后连接可能会关闭 - 因此每隔一段时间检查/重建它可能是值得的。

我实际上不确定您是否需要网络 Flashplayer,或者 AIR 的 flashplayer 是否足够。无论哪种方式,AIR 的 Flashplayer 都删除了 LOW 和 MEDIUM 舞台质量选项,如果您需要此功能,这可能是使用网络播放器的一个很好的理由。

最新版本的 AIR 不会在包中包含网络 Flashplayer(希望用户安装它)。您可以使用旧版本的 AIR(AIR 21 或更早版本,需要盗版 Flash CC2015)来启用“强制”Flashplayer,或者在新版本中使用这个晦涩的解​​决方法:

  1. https://get.adobe.com/flashplayer/npapi/ 安装 NPAPI Flash 播放器
  2. https://adobe.com/devnet/air/air-sdk-download.html 下载最新的 AIRSDK然后删除/重命名这些文件: \runtimes\air-captive\win\Adobe AIR\Versions\1.0\Resources\NPSWF32.dll \runtimes\air-captive\win64\Adobe AIR\Versions\1.0\Resources\NPSWF64.dll

并将它们替换为: C:\Windows\SysWOW64\Macromed\Flash\NPSWF32_32_0_0_192.dll(粘贴到上述位置,并将文件重命名为NPSWF32.dll) 和: C:\Windows\System32\Macromed\Flash\NPSWF64_32_0_0_192.dll(粘贴到上述位置,并将文件重命名为NPSWF64.dll)

基本上,您只是更改一些占位符文件以诱使编译器包含 Flashplayer。如果您在更改文件后发布 AIR 应用程序,用户将不需要安装 Flashplayer。

您自己无法解决这个问题。在我的提示在 Twitter 上疯传后,我得到了 Adob​​e 程序员的帮助。它的文档很少,但是一旦您知道该怎么做,就不需要做很多工作。

这是最难的事情。

您可以使用 FRESteamWorks() ANE 轻松实现 Steam 成就、排行榜和其他功能。 ( https://github.com/Ventero/FRESteamWorks ) 您只需要将其包含在包装器源文件中即可。游戏 swf 应该在您想要解锁成就等时告诉包装器。

至于游戏存档,懒惰的选择是继续使用 Flash sol 文件。如果它们是由桌面应用程序制作的,它们似乎不太可能被删除。否则,您必须通过 LocalConnection(可能分为几个部分,我认为一次限制为 40kb)将数据发送到包装器,然后包装器可以创建您喜欢的任何格式的文本文件。如果您将保存文件放在安装文件夹中,那么 Steam 云可以自动备份它们,而无需您额外输入任何代码。

另一件需要注意的事情:如果您的 swf 图形没有更新,Steam 界面将会卡住。如果您有任何时刻没有动画,则必须在其中隐藏一些动画,以便叠加层保持正确更新。

如果您需要更多详细信息,请与我们联系!

关于c# - 使用 Windows 窗体移植旧的 Flash 游戏 - 如何嵌入 Flash Player dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61116325/

相关文章:

c# - 必须在非泛型静态类中定义扩展方法

c# - 将 ShowDialog 之类的东西添加到自定义用户控件中?

flash - 使用removeChild方法时出现错误

C#调用方法参数空引用异常

flash - Nape vs Box2d(Actionscript 3 物理引擎)

google-chrome - 在 Chrome 中使用 Pepper/PPAPI Flash(通过 Selenium)时如何绕过 "Flash Camera and Microphone Access"弹出窗口?

c# - 使用 WPF 和 MVVM 实现大型设置对话框的方法

c# - 声明变量时 'for' 循环的范围

c# - Azure 网站或 Azure 云服务上的 MVC4 API [错误] : 'System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption'

c# - 如何在 C# 中最小化单个 Windows 应用程序窗体