AS3实现倒计时器报TypeError #1034类型转换错误如何解决
错误产生原因
- 事件类型不匹配是触发报错的直接原因:你监听的是
Event.ENTER_FRAME帧频事件,该事件触发时只会向处理函数传递基础Event类型的实例,但你定义的countTimer处理函数参数声明为TimerEvent类型,Flash运行时无法将通用Event对象强制转换为TimerEvent子类实例,因此抛出#1034类型强制转换失败错误。 - 代码中还存在3处会导致倒计时功能异常的逻辑问题:
- 初始化时间显示时把分、秒的变量赋值写反,会导致初始时间显示错乱
- 秒数借位判断逻辑写反:倒计时是逐秒递减逻辑,秒数减到小于0时才需要向分钟借位,原代码判断
Seconds > 59永远不会触发,会导致秒数减到0之后继续显示负数,分钟数不会正常递减 - 倒计时结束时停止逻辑写的是
timer.stop(),和你当前用timerWatch做帧动画倒计时的实例不匹配,会导致动画停不下来
修复方法
- 修改事件处理函数的参数类型,将
TimerEvent改为匹配ENTER_FRAME事件的Event类型 - 修正初始时分、秒文本的赋值对应关系,初始加载时就做补0处理
- 修正秒数借位判断逻辑:当秒数减到小于0时,将秒数重置为59,同时分钟数减1
- 统一分、秒的补0显示逻辑,避免出现个位数时不补0的显示问题
- 修正停止动画的实例对应关系
修复后的完整参考代码:
var goalTimerScore: int = Math.floor(Math.random() * 101) + 20; var Minutes:Number = Math.floor(Math.random() * 11); var Seconds:Number = Math.floor(Math.random() * 60); // 修正初始赋值对应关系,初始加载即做补0处理 timerMin_txt.text = Minutes < 10 ? "0" + Minutes : String(Minutes); timerSec_txt.text = Seconds < 10 ? "0" + Seconds : String(Seconds); timerWatch.addEventListener(Event.ENTER_FRAME, countTimer); timerWatch.play(); // 修正参数类型为Event,匹配ENTER_FRAME事件的派发类型 function countTimer(e:Event):void { if (timerWatch.currentFrame == 61) { Seconds--; // 修正借位判断:秒数小于0时向分钟借位 if (Seconds < 0) { Seconds = 59; Minutes--; } // 统一处理秒数显示补0 timerSec_txt.text = Seconds < 10 ? "0" + Seconds : String(Seconds); // 统一处理分钟数显示补0 timerMin_txt.text = Minutes < 10 ? "0" + Minutes : String(Minutes); // 判断倒计时结束 if (Minutes == 0 && Seconds == 0) { timerWatch.removeEventListener(Event.ENTER_FRAME, countTimer); timerWatch.stop(); gotoAndPlay("gameover_Hidden3"); return; } } }
注:如果你项目中timer是独立于帧动画的其他定时器实例,可以保留timer.stop()代码,和timerWatch.stop()同时调用即可。
内容的提问来源于stack exchange,提问作者Isaac Yeap Jie Ling
相关产品推荐
相关产品推荐

