【问题标题】:Error when loading swf game while stimulate download but not normally刺激下载时加载swf游戏但不正常时出错
【发布时间】:2015-02-20 04:40:58
【问题描述】:

好的,所以当我运行 loader.swf 时,它可以很好地加载我的 game.swf。但是当我刺激下载时,恰好在 70% 时,我的 game.swf 音乐开始播放,并显示以下错误:

TypeError:错误 #1009:无法访问空对象引用的属性或方法。 在 GAME_fla::MainTimeline/frame11()

还有

错误 #2044:未处理的 IOErrorEvent:。 text=Error #2036:加载从未完成。

正常加载时游戏运行良好。当我在线上传并检查它是否正常工作时,此问题仍然存在。它没有。我的加载器适用于其他 swf 文件。如何解决这个问题?

第 1 层第 11 帧的代码

  import flash.media.SoundChannel;
  var bgmusic2: loverswalk = new loverswalk;
  var bgmusic: spring = new spring;
  var forestmusic: NatureAmbiance = new NatureAmbiance;
  var cafemusic: cafeteria1 = new cafeteria1;


  var shopmusic: pamfluiteloop = new pamfluiteloop;

  var cash: CashRegisterChaChing = new CashRegisterChaChing;
  var beeps: beep = new beep;
  var musicboxsound: BlaclRockShooterMusicBox = new BlaclRockShooterMusicBox;
  var failsound: fail = new fail;
  var stgup: stageup = new stageup;
  var talkbg: talkbag = new talkbag;
  var ca: correct = new correct;
  var myChannel: SoundChannel = new SoundChannel();
  var bg: SoundChannel = new SoundChannel();
  var mb: SoundChannel = new SoundChannel();
  var myChanneltalk: SoundChannel = new SoundChannel();
  var lastpositionbg: Number = 0;
  var moodshop = 0;
  var dilbgrun = 0;
  var alertsound: alert = new alert;

第 2 层,第 20 帧

 var hp: int = 100;
 var day: int = 1;
 var week: int = 1;
 var money: Number = 0;
 var pendants: int = 0;
 var bracelets: int = 0;
 var comics: int = 0;
 var poetrys: int = 0;
 var tshirts: int = 0;
 var named: String = "Driver";
 var age: int = 17;
 var reply: int = 0;

 var dilrun: String = " ";
 var ncpvar: int = -1;
 var ncpvare: int = -1;
 var ncpvarm: int = -1;
 var flavie_stage: int = 0;
 var shannon_stage: int = 0;
 var vivette_stage: int = 0;
 var audrey_stage: int = 0;
 var gabriel_stage: int = 0;
 var toret: int = 0;

 function refresh1(event: Event): void {
   Object(this).bar.hp_text.text = String(hp);
   Object(this).bar.day_text.text = String(day);
   Object(this).bar.week_text.text = String(week);
   Object(this).bar.money_text.text = String(money);
 }



 function bedbtn(event: MouseEvent): void {
   alert_mc.gotoAndStop("Alert");
   alert_mc.alert_mc.alert_text.text = "You slept a night and gained a massive 100 HP. Enjoy!";

   hp = 100;
   day = day + 1;
   if (day == 8) {
     day = 1;
     week = week + 1;
   }

 }

 function woman(event: MouseEvent): void {


   if (event.target == audrey_btn) {
     if (hp >= 30) {
       hp = hp - 30;
       dilrun = "Audrey";
       dial_mc.gotoAndPlay("Dialogue");
     } else {
       alertsound.play();
       alert_mc.gotoAndStop("Alert");
       alert_mc.alert_mc.alert_text.text = "Go get some more HP silly!";
     }

   }
   if (event.target == shannon_btn) {


     if (hp >= 30) {
       hp = hp - 30;
       dilrun = "Shannon";
       dial_mc.gotoAndPlay("Dialogue");
     } else {
       alertsound.play();
       alert_mc.gotoAndStop("Alert");
       alert_mc.alert_mc.alert_text.text = "Go get some more HP silly!";
     }



   }
   if (event.target == vivette_btn) {
     if (hp >= 30) {
       hp = hp - 30;
       dilrun = "Vivette";
       dial_mc.gotoAndPlay("Dialogue");
     } else {
       alertsound.play();
       alert_mc.gotoAndStop("Alert");
       alert_mc.alert_mc.alert_text.text = "Go get some more HP silly!";
     }


   }
   if (event.target == gabriel_btn) {
     if (hp >= 30) {
       hp = hp - 30;
       dilrun = "Gabriel";
       dial_mc.gotoAndPlay("Dialogue");
     } else {
       alertsound.play();
       alert_mc.gotoAndStop("Alert");
       alert_mc.alert_mc.alert_text.text = "Go get some more HP silly!";
     }
   }
   if (event.target == flavie_btn) {
     if (hp >= 30) {
       hp = hp - 30;
       dilrun = "Flavie";
       dial_mc.gotoAndPlay("Dialogue");
     } else {
       alertsound.play();
       alert_mc.gotoAndStop("Alert");
       alert_mc.alert_mc.alert_text.text = "Go get some more HP silly!";
     }

   }
 }

 function NCP(event: MouseEvent): void {
   if (event.target == odile_btn) {

     if (hp >= 10) {
       hp = hp - 10;

       dilrun = "Odile";
       dial_mc.gotoAndPlay("Dialogue");
     } else {
       alertsound.play();
       alert_mc.gotoAndStop("Alert");
       alert_mc.alert_mc.alert_text.text = "You need more HP to talk to Odile.";
     }



   }
   if (event.target == elias_btn) {

     if (hp >= 10) {
       hp = hp - 10;

       dilrun = "Elias";
       dial_mc.gotoAndPlay("Dialogue");
     } else {
       alertsound.play();
       alert_mc.gotoAndStop("Alert");
       alert_mc.alert_mc.alert_text.text = "You need more HP to talk to Elias.";
     }



   }
   if (event.target == mikel_btn) {

     if (hp >= 10) {
       hp = hp - 10;

       dilrun = "Mikel";
       dial_mc.gotoAndPlay("Dialogue");
     } else {
       alertsound.play();
       alert_mc.gotoAndStop("Alert");
       alert_mc.alert_mc.alert_text.text = "You need more HP to talk to Mikel.";
     }



   }
 }

 function buy(event: MouseEvent): void {
   if (event.target == gifts_btn) {
     Object(this).menu_mc.gotoAndStop("Shop");
   }
   if (event.target == buy_food_btn) {
     Object(this).menu_mc.gotoAndStop("Cafe");
   }
 }


 function job(event: MouseEvent): void {
   alertsound.play();
   alert_mc.gotoAndStop("Alert");

   if (event.target == job1_btn) {
     if (hp >= 40) {
       hp = hp - 40;
       money = money + 30;
       alert_mc.alert_mc.alert_text.text = "You earnt 30 for 40 HP";
     } else if (hp < 40) {
       alert_mc.alert_mc.alert_text.text = "You don't have 40 HP to that. Better sleep or eat to gain more HP.";
     }
   }
   if (event.target == job2_btn) {
     if (hp >= 30) {
       hp = hp - 30;
       money = money + 20;
       alert_mc.alert_mc.alert_text.text = "You earnt 20 for 30 HP";
     } else if (hp < 30) {
       alert_mc.alert_mc.alert_text.text = "You don't have 30 HP to that. Better sleep or eat to gain more HP.";
     }
   }
   if (event.target == job3_btn) {
     if (hp >= 20) {
       hp = hp - 20;
       money = money + 10;
       alert_mc.alert_mc.alert_text.text = "You earnt 10 for 20 HP";
     } else if (hp < 20) {
       alert_mc.alert_mc.alert_text.text = "You don't have 20 HP to that. Better sleep or eat to gain more HP.";
     }
   }
 }

如果我添加它们,其他框架将无法访问这些变量。

之前的加载器代码:

var myrequest: URLRequest = new URLRequest("GAME.swf");
var myloader: Loader = new Loader();
myloader.load(myrequest);

myloader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progresshandler);
function progresshandler(myevent: ProgressEvent): void {

  var myprogress: Number = myevent.target.bytesLoaded / myevent.target.bytesTotal;


  bar_mc.scaleX = myprogress;
  percentage_text.text = Math.round(myprogress * 100) + "%";
}

myloader.contentLoaderInfo.addEventListener(Event.COMPLETE, finished);
function finished(myevent: Event): void {

  addChild(myloader);
  removeChild(percentage_text);
  removeChild(bar_mc);
  removeChild(background_mc);
}

加载器代码之后:

var myrequest: URLRequest = new URLRequest("GAME.swf");

import flash.net.URLRequest;
import flash.display.MovieClip;
import flash.events.Event;
var myloader: Loader = new Loader();


myloader.load(myrequest);

function progresshandler(myevent: ProgressEvent): void {

  var myprogress: Number = myevent.target.bytesLoaded / myevent.target.bytesTotal;

  bar_mc.scaleX = myprogress;
  percentage_text.text = Math.round(myprogress * 100) + "%";
}



myloader.contentLoaderInfo.addEventListener(Event.INIT, finished);

myloader.contentLoaderInfo.addEventListener(Event.COMPLETE, completes);


function finished(myevent: Event): void {

  addChild(myloader);
  removeChild(percentage_text);
  removeChild(bar_mc);
  removeChild(background_mc);
}

function completes(myevent: Event): void {


  var loaderInfo: LoaderInfo = myevent.target as LoaderInfo;
  var swf: Object = loaderInfo.content;
  swf.play();

}

【问题讨论】:

    标签: actionscript-3 flash loader


    【解决方案1】:

    也许你应该试试这个活动:ADDED_TO_STAGE。 ADDED_TO_STAGE 事件在对象添加到阶段时触发(非常奇怪的名称和相关性),即执行 addChild 方法时。

    尝试在外部 SWF 的 Main 类中收听此事件,因此,在将相应对象添加到舞台之前不会执行任何代码(现在即使在加载过程中您也可以听到音乐。

    举个例子:

     package 
     {
            import flash.display.Sprite;
            import flash.events.Event;
    
            public class TheMainClassOfYourExternalSWF extends Sprite 
            {
                   public function TheMainClassOfYourExternalSWF() 
                   {
                        addEventListener(Event.ADDED_TO_STAGE, initHandler);
                   }
    
                   private function initHandler(event:Event):void 
                   {
                        removeEventListener(Event.ADDED_TO_STAGE, initHandler);
                        trace('this is the stage:', stage);
                        trace('this is my parent:', this.parent);
                        // here you start to include your logic
                   }
            }
      }
    

    如果您使用 FLA 文件并使用时间线添加代码,您可以尝试:

     addEventListener(Event.ADDED_TO_STAGE, initHandler);
    
     function initHandler(event:Event):void 
     {
             removeEventListener(Event.ADDED_TO_STAGE, initHandler);
             // here you start to include your logic, call your functions, initialise your instances...
     }
    

    【讨论】:

    • 我是初学者,现在正在学习flash。我没有为我的外部 swf 使用主类。我把它编码在它的时间线上。不好吗?如何在没有主类的情况下使用此事件“添加到舞台”?
    • 我编辑了我的答案,添加了一个您可以使用时间轴执行的示例。在时间轴上编码还不错,只是不太容易和灵活。我确实建议您开始学习一些 OOP 并使用类、合适的 IDE 来编写代码等。
    • 我做错了吗?因为我按照你的要求做了,并且有 100 多个错误说场景 1,图层“导航”,第 61 帧,第 4 行 1120:访问未定义的属性 beachmusic。和其他变量...我添加了第 15 帧中的第 1 层和第 20 帧中的第 2 层。他们没有 stop()。
    【解决方案2】:

    在加载外部 swf 时,需要注意两件事。

    首先加载的swf的第一帧在Event.INIT触发时开始播放,而不是在Event.COMPLETE触发时开始播放。事件 init 在第一帧可以播放时触发,而 complete 则在整个 swf 加载时触发。

    第二阶段或根仅在已添加到已添加到阶段的显示列表中时在加载的 swf 中可用。当 Event.INIT 触发时,加载的 swf 没有阶段或根,因此 swf 的第一帧不应有任何对阶段或根的引用。

    如果您的 swf 不使用文档类,那么只需使用 stop() 将您的第一个框架设为空,然后一旦加载并添加到显示列表,让您的 swf 转到您拥有所有代码的第 2 框架。

    【讨论】:

    • 好的,所以我按照你的要求做了。当我将 complete 更改为 init 时,它似乎工作得更好。但是当我做 stop();然后播放();使用完整,一切都出错了。您能否检查一下我添加的额外加载程序代码并告诉我哪里出错了?
    猜你喜欢
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 2013-09-09
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多