如何在XAMPP中运行旧ActionScript版Adobe Animate项目并解决运行报错
问题背景
我有一个旧的Adobe Animate项目,想要在末尾添加一个反馈场景,支持用户提交反馈发送邮件。为实现该功能我需要将项目部署在服务器上,因此我选用了XAMPP,将整个项目放在了htdocs文件夹下。当我尝试通过localhost访问时,文件被直接下载而非正常打开。我也尝试将项目发布为HTML格式,通过localhost访问时提示需要Adobe Flash Player,但Adobe已经停止支持Flash Player,我无法下载,尝试了其他替代Flash Player的软件也都无法正常运行项目。
我知道现在的Adobe Animate基于HTML、CSS和JavaScript开发,但现有项目体量很大,我没有时间将所有ActionScript代码改写为JS,希望能找到可以在XAMPP上运行该项目的方法。
相关代码
PHP文件代码
<?php $emailTo = "abcd@gmail.com"; $name = $_POST["name"]; $emailFrom = $_POST["email"]; $message = $_POST["message"]; $subject = "New Message from Yourwebsite!"; if( !empty( $_POST ) ) { $body = "Name: " . $name . "\r\n\r\n"; $body .= "Email: " . $emailFrom . "\r\n\r\n"; $body .= "Message:\r\n" . $message; $body = wordwrap($body, 70); $header = "From: " . $emailFrom . "\r\nReply-To: " . $emailFrom. "\r\n\r\n"; if( mail( $emailTo, $subject, $body, $header ) ) { echo( "result=Successful" ); } else { echo( "result=Unsuccessful" ); } } ?>
ActionScript代码
import fl.managers.StyleManager; StyleManager.setStyle("textFormat", new TextFormat("Verdana", 11, 0x000000)); const SENDING:String = "Sending"; const SENT_SUCCESS:String = "Successful"; const SENT_FAILED:String = "Unsuccessful"; var tmr:Timer; function resetTextFields():void { name_txt.text = ""; email_txt.text = ""; message_txt.text = ""; } function resetContactForm():void { submit_btn.enabled = true; feedback_mc.visible = false; clearErrors(); } function afterTmrWait(evt:TimerEvent):void { tmr.stop(); tmr.removeEventListener(TimerEvent.TIMER, afterTmrWait); resetContactForm(); } function validateEmail(str:String):Boolean { var pattern:RegExp = /(\w|[_.\-])+@((\w|-)+\.)+\w{2,4}+/; var result:Object = pattern.exec(str); if(result == null) { return false; } return true; } function submitForm(evt:MouseEvent):void { clearErrors(); var passChecks:Boolean = true; if(name_txt.text.length < 1) { nameError_mc.visible = true; passChecks = false; } if(!validateEmail(email_txt.text)) { emailError_mc.visible = true; passChecks = false; } if(message_txt.text.length < 1) { messageError_mc.visible = true; passChecks = false; } if(passChecks) { submit_btn.enabled = false; feedback_mc.visible = true; feedback_mc.gotoAndStop(SENDING); var urlVars:URLVariables = new URLVariables(); var urlReq:URLRequest = new URLRequest("send_email.php"); var ldr:URLLoader = new URLLoader(); urlVars.name = name_txt.text; urlVars.email = email_txt.text; urlVars.message = message_txt.text; urlReq.data = urlVars; urlReq.method = URLRequestMethod.POST; ldr.addEventListener(Event.COMPLETE, serverFeedback); ldr.load(urlReq); } } function serverFeedback(evt:Event):void { var ldr:URLLoader = evt.target as URLLoader; var urlVars:URLVariables = new URLVariables(ldr.data); if(urlVars.result == SENT_SUCCESS) { feedback_mc.gotoAndStop(SENT_SUCCESS); resetTextFields(); } else if(urlVars.result == SENT_FAILED) { feedback_mc.gotoAndStop(SENT_FAILED); } tmr = new Timer(3000, 1); tmr.addEventListener(TimerEvent.TIMER, afterTmrWait); tmr.start(); } function clearErrors():void { nameError_mc.visible = false; emailError_mc.visible = false; messageError_mc.visible = false; } submit_btn.addEventListener(MouseEvent.CLICK, submitForm); resetTextFields(); resetContactForm();
报错信息
单独运行该场景时显示正常,但测试完整项目(即便仅包含这一个场景)时无法正常运行,和我使用Ruffle运行时的表现一致。最初我以为是Ruffle不支持我的项目,但现在怀疑问题由这些报错导致:
TypeError: Error #1009: Cannot access a property or method of a null object reference. at fl.controls::TextArea/drawLayout() at fl.controls::TextArea/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::BaseButton/draw() at fl.core::UIComponent/drawNow() at fl.controls::ScrollBar/draw() at fl.controls::UIScrollBar/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::BaseButton/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::LabelButton/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::BaseButton/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::BaseButton/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::BaseButton/draw() at fl.core::UIComponent/drawNow() at fl.controls::ScrollBar/draw() at fl.controls::UIScrollBar/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::BaseButton/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::LabelButton/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::BaseButton/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::BaseButton/draw() at fl.core::UIComponent/callLaterDispatcher() TypeError: Error #2007: Parameter child must be non-null. at flash.display::DisplayObjectContainer/addChildAt() at fl.controls::BaseButton/drawBackground() at fl.controls::LabelButton/draw() at fl.controls::Button/draw() at fl.core::UIComponent/callLaterDispatcher()
解决方案
解决XAMPP访问直接下载文件的问题
- 确认你发布的Flash项目后缀为
.swf,打开xampp/apache/conf/mime.types文件,检查是否存在配置application/x-shockwave-flash swf,如果缺失手动添加后重启Apache即可解决直接下载的问题。 - 不要直接访问SWF文件,你需要在XAMPP上部署一个嵌入SWF的静态HTML页面,在页面中添加SWF嵌入代码即可正常加载。
解决Flash运行环境的问题
- 可以使用旧版内置Flash的浏览器便携版,例如Firefox ESR 84之前的版本、360安全浏览器旧版,不需要额外安装Flash Player即可直接打开嵌入SWF的页面。
- 如果要使用Ruffle运行,当前报错是Ruffle对Flash原生组件库
fl.controls支持不全导致的,你可以把用到的TextArea、Button等FL组件手动导出为基础MovieClip,避免使用官方FL组件库,即可兼容Ruffle运行。
解决当前代码报错的问题
你当前的报错都是Flash UI组件初始化时找不到对应的皮肤子元件导致的,按以下步骤排查:
- 打开Animate项目库,确认
fl.controls相关组件的所有依赖皮肤文件都在库中,没有被误删,如果缺失可以从其他新建的AS3项目中把组件库文件复制到当前项目。 - 你现在的代码中
StyleManager.setStyle是在组件还没初始化完成的时候就执行了,会导致空引用报错,把这行代码移动到场景加载完成的事件回调中执行,不要放在代码第一行。 - 确认你反馈场景上的所有UI实例
name_txt、email_txt、message_txt、submit_btn、feedback_mc以及对应的错误提示元件的实例名拼写完全正确,没有和代码中写的不一致的情况。 - 测试时不要直接测试场景,要测试完整项目,确保场景跳转时所有UI元件都已经被正确实例化后再执行初始化代码,你可以在场景第一帧加个判断,等所有元件加载完成后再执行
resetTextFields和resetContactForm方法。
内容的提问来源于stack exchange,提问作者r2000_na
相关产品推荐
相关产品推荐

