Adobe Animate用Actionscript3开发填字游戏遇Error#1009报错求助
报错原因
你遇到的Error #1009空对象引用错误是AS3中非常常见的报错,结合你的场景和代码,触发原因是以下两个中的一个或多个:
- ENTER_FRAME事件执行时机早于场景内文本框加载完成:你在进入游戏场景后立刻给stage加了帧频事件,此时场景上的
hypoH、hrsO这类输入文本组件可能还没被Animate渲染完成,直接访问.text属性就会触发空对象报错 - 文本框实例名拼写错误/不存在:代码里引用的某一个文本框的实例名和你Animate舞台上设置的实例名不一致,或者这个文本框根本没放在当前游戏帧的舞台上,访问的时候就是null,触发报错
- 额外提示:你原有代码里octopus的判断逻辑写了
octO2.text == ("0").toString(),这里是数字0不是字母o,如果是要匹配字母o本身逻辑也有误,但这不是触发1009报错的原因。
修复步骤
- 第一步:给entFrame函数加空对象拦截,判断所有要用到的组件都存在再执行逻辑,同时跳转到游戏场景的时候延迟1帧再加帧频事件,保证元素加载完成,修改后的代码如下:
stop(); quitbtn.addEventListener(MouseEvent.CLICK, quitt); function quitt(evt: MouseEvent): void { // 跳转前先移除帧频事件,避免离开场景后事件还在执行访问不存在的对象 if(stage.hasEventListener(Event.ENTER_FRAME)){ stage.removeEventListener(Event.ENTER_FRAME, entFrame); } gotoAndStop("start"); } var hippopotamus: Number = 0; var horse: Number = 0; var eel: Number = 0; var frog: Number = 0; var ant: Number = 0; var turtle: Number = 0; var tiger: Number = 0; var bird: Number = 0; var penguin: Number = 0; var orca: Number = 0; var octopus: Number = 0; var owl: Number = 0; var snail: Number = 0; var duck: Number = 0; var kangaroo: Number = 0; var iguana: Number = 0; var ALLwords:Number = 0; var Total:Number = 0; // 延迟1帧再加帧频事件,保证舞台元素加载完成 setTimeout(addFrameEvent, 10); function addFrameEvent():void{ stage.addEventListener(Event.ENTER_FRAME, entFrame); } function entFrame(evt:Event):void { // 先判断最末尾要用到的incorrectTXT存在,不存在就直接返回不执行 if(!incorrectTXT) return; // 每个判断都先加文本框存在的判断 if (hypoH && hypo1 && hypoP && hypoP2 && hypoO && hypoP3 && hypoO2 && hypoT && hypoA && hypoM && hypoU && hypoS && hypoH.text == "h" && hypo1.text == "i" && hypoP.text == "p" && hypoP2.text == "p" && hypoO.text == "o" && hypoP3.text == "p" && hypoO2.text == "o" && hypoT.text == "t" && hypoA.text == "a" && hypoM.text == "m" && hypoU.text == "u" && hypoS.text == "s") { hippopotamus = 1; trace("hippopotamus"); } if (hrsO && hrsR && hrsS && hrsE && hrsO.text == "o" && hrsR.text == "r" && hrsS.text == "s" && hrsE.text == "e") { horse = 1; trace("horse"); } if (eelE && eel1 && eelE.text == "e" && eel1.text == "l") { eel = 1; trace("eel"); } if (penP && penE && penN && penG && penU && pen1 && penN2 && penP.text == "p" && penE.text == "e" && penN.text == "n" && penG.text == "g" && penU.text == "u" && pen1.text == "i" && penN2.text == "n") { penguin = 1; trace("penguin"); } if (brdB && brdR && brdD && brdB.text == "b" && brdR.text == "r" && brdD.text == "d") { bird = 1; trace("bird"); } if (octO && octC && octT && octO2 && octP && octU && octO.text == "o" && octC.text == "c" && octT.text == "t" && octO2.text == "o" // 这里原来写的是数字0,已改成字母o,如果你确实要匹配数字0就改回去 && octP.text == "p" && octU.text == "u") { octopus = 1; trace("octopus"); } if (orcR && orcC && orcA && orcR.text == "r" && orcC.text == "c" && orcA.text == "a") { orca = 1; trace("orca"); } if (owlO && owlW && owlO.text == "o" && owlW.text == "w") { owl = 1; trace("owl"); } if (nailS && nailA && nail1 && nailL && nailS.text == "s" && nailA.text == "a" && nail1.text == "i" && nailL.text == "l") { snail = 1; trace("snail"); } if (dkD && dkU && dkC && dkK && dkD.text == "d" && dkU.text == "u" && dkC.text == "c" && dkK.text == "k") { duck = 1; trace("duck"); } if (groA && groN && groG && groA2 && groR && groO && groA.text == "a" && groN.text == "n" && groG.text == "g" && groA2.text == "a" && groR.text == "r" && groO.text == "o") { kangaroo = 1; trace("kangaroo"); } if (frgF && frgR && frgG && frgF.text == "f" && frgR.text == "r" && frgG.text == "g") { frog = 1; trace("frog"); } if (ignG && ignU && ignA && ignN && ignG.text == "g" && ignU.text == "u" && ignA.text == "a" && ignN.text == "n") { iguana = 1; trace("iguana"); } if (antA && antN && antA.text == "a" && antN.text == "n") { ant = 1; trace("ant"); } if (trtT && trtU && trtR && trtT2 && trtL && trtT.text == "t" && trtU.text == "u" && trtR.text == "r" && trtT2.text == "t" && trtL.text == "l") { turtle = 1; trace("turtle"); } if (tgr1 && tgrG && tgrE && tgr1.text == "i" && tgrG.text == "g" && tgrE.text == "e") { tiger = 1; trace("tiger"); } ALLwords = hippopotamus + horse + eel + frog + tiger + octopus + penguin + bird + orca + turtle + duck + snail + ant + kangaroo + iguana + owl; Total = 16 - ALLwords; if (Total == 0) { // 游戏结束后记得移除事件,避免重复执行 stage.removeEventListener(Event.ENTER_FRAME, entFrame); trace("Gameover"); } incorrectTXT.text = "you have" + Total + " incorrect words remaining"; }
- 第二步:如果加了拦截之后还是报错,就逐行核对代码里的文本框实例名和你Animate舞台上的实例名,确保大小写、拼写完全一致,所有用到的文本框都放在游戏场景的当前帧上,没有被放在其他图层或者其他帧里。
- 第三步:跳转离开游戏场景的时候一定要先移除ENTER_FRAME事件,不然离开场景后事件还在执行,访问已经不存在的文本框也会触发1009报错,上面的代码里已经在quit按钮的点击事件里加了移除逻辑。
内容的提问来源于stack exchange,提问作者Mohammad Hassani
相关产品推荐
相关产品推荐

