Flash测验系统score变量显示异常求助:得分结果数值错误
问题分析与修复方案
核心问题原因
- 变量作用域隐患:虽然你在初始帧声明了
score,但如果后续帧执行时上下文异常,可能导致无法访问到同一个全局变量; - 事件监听器重复绑定:每次进入题目帧都会重新给按钮绑定点击事件,点击一次正确选项时,
score++会被执行多次,导致分数虚高; - 冗余代码干扰:题目帧内多次调用
stop(),虽不直接影响分数,但会造成代码逻辑混乱。
具体修复步骤
1. 确保score为全局可访问变量
将score的声明移到初始帧的最外层,作为主时间轴的全局变量,保证所有帧都能访问到同一个变量:
// 初始帧代码 var score:int = 0; // 放在最外层,全局生效 stop(); mulaitesButton.addEventListener(MouseEvent.CLICK, startbtn3); function startbtn3(event:MouseEvent):void { gotoAndStop(13); }
2. 清理重复绑定的事件监听器
每次绑定新监听器前先移除旧的,点击选项后立即清理当前帧所有监听器,避免重复触发:
// 题目帧代码 stop(); // 绑定前先移除旧监听器,防止重复绑定 optA.removeEventListener(MouseEvent.CLICK, nextq11a); optA.addEventListener(MouseEvent.CLICK, nextq11a); function nextq11a(event:MouseEvent):void { score++; // 跳转前清理当前所有监听器 optA.removeEventListener(MouseEvent.CLICK, nextq11a); optB.removeEventListener(MouseEvent.CLICK, nextq11b); optC.removeEventListener(MouseEvent.CLICK, nextq11c); optD.removeEventListener(MouseEvent.CLICK, nextq11d); gotoAndPlay(14); } optB.removeEventListener(MouseEvent.CLICK, nextq11b); optB.addEventListener(MouseEvent.CLICK, nextq11b); function nextq11b(event:MouseEvent):void { // 同样清理监听器 optA.removeEventListener(MouseEvent.CLICK, nextq11a); optB.removeEventListener(MouseEvent.CLICK, nextq11b); optC.removeEventListener(MouseEvent.CLICK, nextq11c); optD.removeEventListener(MouseEvent.CLICK, nextq11d); gotoAndPlay(14); } optC.removeEventListener(MouseEvent.CLICK, nextq11c); optC.addEventListener(MouseEvent.CLICK, nextq11c); function nextq11c(event:MouseEvent):void { optA.removeEventListener(MouseEvent.CLICK, nextq11a); optB.removeEventListener(MouseEvent.CLICK, nextq11b); optC.removeEventListener(MouseEvent.CLICK, nextq11c); optD.removeEventListener(MouseEvent.CLICK, nextq11d); gotoAndPlay(14); } optD.removeEventListener(MouseEvent.CLICK, nextq11d); optD.addEventListener(MouseEvent.CLICK, nextq11d); function nextq11d(event:MouseEvent):void { optA.removeEventListener(MouseEvent.CLICK, nextq11a); optB.removeEventListener(MouseEvent.CLICK, nextq11b); optC.removeEventListener(MouseEvent.CLICK, nextq11c); optD.removeEventListener(MouseEvent.CLICK, nextq11d); gotoAndPlay(14); }
3. 简化冗余代码
题目帧只需要在开头调用一次stop()即可,移除后续重复的stop()调用,保持代码简洁。
4. 调试验证
可以在score++后添加打印语句,实时确认分数变化:
function nextq11a(event:MouseEvent):void { score++; trace("当前分数:" + score); // 调试用,发布时可删除 // ... 其他代码 }
在结果帧也添加trace(score);,确认最终分数是否和预期一致。
内容的提问来源于stack exchange,提问作者not a channel
相关产品推荐
相关产品推荐

