使用 Windows 窗体移植旧的 Flash 游戏 - 如何嵌入 Flash Player dll?
Posted
技术标签:
【中文标题】使用 Windows 窗体移植旧的 Flash 游戏 - 如何嵌入 Flash Player dll?【英文标题】:Porting old Flash games using Windows Forms - How to Embed Flash Player dll? 【发布时间】:2020-07-21 18:54:25 【问题描述】:大约十年前,我开发了一些颇受欢迎的 Flash 游戏,最近人们一直要求我将它们移植到 Steam。几天来,我一直在研究如何做到这一点,但感觉就像试图弄清楚如何让 GameBoy 卡带在 iPhone 上运行,而在谷歌上搜索答案就像考古学一样,因为再也没有人谈论 Flash。
Flash 可以构建为捆绑了 Flash Player 的 exe 投影仪,但它将保存的数据存储在脆弱的 cookie 中,因此我需要构建一个可以与其交换数据的包装器,以更可靠地保存数据。我已经设法在 Windows 窗体中构建了一些简单的东西(我的经验有限),但是有两种可能性,每种都有不同的问题:
一个是我在exe win投影机版本的Flash文件中加载为进程:
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 是捆绑在一起的,所以用户应该单独安装它。这是不可接受的。
我找到了一些安装在我的系统上的 Flash Player 的 .dll 文件,但我不知道是否可以将它们捆绑在一起并让 AxShockwaveFlashObjects 使用它们而不是用户安装的文件。这可能是理想的情况。
我知道这是一个晦涩难懂的问题 - 这就是为什么我不得不问的原因,因为 Google 告诉我的信息太少了 - 但我们将不胜感激任何帮助!
【问题讨论】:
【参考方案1】:哟,我已经在 Steam 上发布了 AS2 和 AS3 Flash 游戏。以下是我能立即记住的内容:
最简单的方法是使用 SWFLoader(如果你想使用 AIR 的 Flashplayer,EBF3 使用这个)或 htmlLoader(如果你想使用 web Flashplayer,EBF5 使用这个)制作一个 AS3 Adobe AIR 包装器来加载一个 swf 游戏文件) 并使用 LocalConnection 与之通信。这同样适用于 AS2 和 AS3 swf。 LocalConnection 非常可靠,除非用户的计算机承受很大压力 - 然后连接可能会关闭 - 所以每隔一段时间检查/重新制作它可能是值得的。
我实际上不确定您是否需要网络 Flashplayer,或者 AIR 的 flashplayer 是否足够。无论哪种方式,AIR 的 Flashplayer 都删除了 LOW 和 MEDIUM 舞台质量选项,如果您需要,这可能是使用 Web 的一个很好的理由。
最新版本的 AIR 不会在包中包含 Web Flashplayer(希望用户安装它)。您可以使用旧版本的 AIR(AIR 21 或更早版本,需要盗版 Flash CC2015)来启用“俘获”Flashplayer,或者在新版本中使用这种晦涩难懂的解决方法:
-
从https://get.adobe.com/flashplayer/npapi/安装NPAPI flash player
从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 上疯传后,我得到了 Adobe 程序员的帮助。它的文档记录很差,但是一旦您知道该怎么做,就不会做很多工作。
这是很难完成的事情。
您可以使用 FRESteamWorks() ANE 轻松实现 Steam 成就、排行榜和其他功能。 (https://github.com/Ventero/FRESteamWorks) 您只需将其包含在您的包装源文件中。当您想要解锁成就等时,游戏 swf 应该告诉包装器。
至于游戏的保存数据,懒惰的选择是继续使用 Flash sol 文件。如果它们是由桌面应用程序制作的,它们似乎不太可能被删除。否则,您必须通过 LocalConnection(可能分几个部分,我认为一次限制为 40kb)将数据发送到包装器,然后它可以创建您喜欢的任何格式的文本文件。如果您在安装文件夹中保存文件,则 Steam 云可以自动备份它们,而无需您提供任何额外的代码。
另一件需要注意的事情:如果您的 swf 图形没有更新,Steam Overlay 将冻结。如果您有任何没有动画的时刻,则必须在其中隐藏一些动画,以便叠加层不断正确更新。
如果您想了解更多详情,请与我们联系!
【讨论】:
以上是关于使用 Windows 窗体移植旧的 Flash 游戏 - 如何嵌入 Flash Player dll?的主要内容,如果未能解决你的问题,请参考以下文章
将 Linux 兼容项目从 Windows 移植到 Linux [关闭]
如何给你的手游进行快速测试:Unity5和WebGL移植指南