AS3实现随机角色与皮肤切换按钮功能报错问题求助
ActionScript3 角色/皮肤切换功能修复方案
问题根因
- 自定义角色类编译错误:类内部直接访问时间轴作用域的
character、characterRandomArray变量,类作用域无法访问时间轴变量,触发1120未定义属性错误 - 数组方法误用:
splice()方法返回值是被删除元素组成的数组,不是单个显示对象实例,直接赋值给单个角色类型变量会触发1034类型转换错误;且splice()会修改原数组,第一次调用后数组元素会被清空,后续无法正常随机 - API逻辑错误:
contains()方法返回布尔值,不能直接和显示对象做相等判断;传入null参数时会触发2007参数非空错误 - 取值逻辑错误:取随机皮肤时错误访问
HaurkaSkin[0].length,HaurkaSkin[0]是单个显示对象实例,不存在length属性
分步修复代码
1. 修复所有自定义角色类
删除类内部非法访问时间轴变量的代码,所有角色类(含Haurka_Wetsuit、Minami_Wetsuit等全部皮肤类)统一按如下结构编写:
package { import flash.display.MovieClip; public class Haurka_Wetsuit extends MovieClip { public function Haurka_Wetsuit() { // 构造函数无需额外逻辑 } } }
其余9个角色皮肤类仅修改类名即可,不要在类内部编写任何访问时间轴变量的代码。
2. 修复变量初始化与角色随机选择逻辑
补充缺失的character变量声明,替换错误的splice随机逻辑,增加舞台元素增删处理:
// 声明全局当前角色变量 var character:DisplayObject; // 原有皮肤实例初始化代码保留 var HaurkaWS: Haurka_Wetsuit = new Haurka_Wetsuit(); var MinamiWS: Minami_Wetsuit = new Minami_Wetsuit(); var MinamiSWS: Minami_ShortWetsuit = new Minami_ShortWetsuit(); var KiraraWS: Kirara_Wetsuit = new Kirara_Wetsuit(); var TowaWS: Towa_Wetsuit = new Towa_Wetsuit(); var HaurkaSS: Haurka_Swimsuit = new Haurka_Swimsuit(); var MinamiSS: Minami_Swimsuit = new Minami_Swimsuit(); var KiraraSS: Kirara_Swimsuit = new Kirara_Swimsuit(); var KiraraBS: Kirara_Bikini = new Kirara_Bikini(); var TowaSS: Towa_Swimsuit = new Towa_Swimsuit(); var characterRandomArray: Array = [HaurkaWS,MinamiWS,KiraraWS,TowaWS]; var HaurkaSkin: Array = [HaurkaWS,HaurkaSS]; var MinamiSkin: Array = [MinamiWS,MinamiSS,MinamiSWS]; var KiraraSkin: Array = [KiraraWS,KiraraSS,KiraraBS]; var TowaSkin: Array = [TowaWS,TowaSS]; character_btn.addEventListener(MouseEvent.CLICK, on_pressCharacter); function on_pressCharacter(e: MouseEvent): void { // 移除舞台上已显示的旧角色 if(contains(character)){ removeChild(character); } // 生成随机索引直接取值,不修改原数组 var randomIndex:int = int(Math.random() * characterRandomArray.length); character = characterRandomArray[randomIndex]; // 添加新角色到舞台,可自行设置x/y坐标调整显示位置 addChild(character); }
3. 修复皮肤切换逻辑
修正contains()的错误判断逻辑,替换错误的皮肤随机规则:
skin_btn.addEventListener(MouseEvent.CLICK, on_pressSkin); function on_pressSkin(e: MouseEvent): void { // 未选中角色时直接返回,避免空值报错 if(!character) return; var targetSkinArray:Array; // 匹配当前角色对应的皮肤数组 if(HaurkaSkin.indexOf(character) != -1){ targetSkinArray = HaurkaSkin; }else if(MinamiSkin.indexOf(character) != -1){ targetSkinArray = MinamiSkin; }else if(KiraraSkin.indexOf(character) != -1){ targetSkinArray = KiraraSkin; }else if(TowaSkin.indexOf(character) != -1){ targetSkinArray = TowaSkin; }else{ return; } // 移除当前显示的旧皮肤 if(contains(character)){ removeChild(character); } // 基于皮肤数组长度生成随机索引,选取新皮肤 var randomSkinIndex:int = int(Math.random() * targetSkinArray.length); character = targetSkinArray[randomSkinIndex]; // 添加新皮肤到舞台,可复用之前的坐标参数保证位置一致 addChild(character); }
修复后验证
- 点击角色随机按钮可重复随机选取4个基础角色,不会出现数组清空、类型转换报错
- 选中角色后点击皮肤切换按钮,可随机切换当前角色的对应皮肤,不会出现空值报错
- 所有编译错误、运行时错误全部消除,功能可正常使用
内容的提问来源于stack exchange,提问作者Isaac Yeap Jie Ling
相关产品推荐
相关产品推荐

