AS3游戏本地离线排行榜开发:Array与SharedObject使用问题
嘿,我明白你遇到的困惑了——当直接trace数组或SharedObject里的对象时,ActionScript会默认输出[object Object],这是因为它没法直接展示对象的内部属性,只能告诉你这是一个对象实例。咱们一步步来搞定这个离线排行榜的问题:
核心问题分析
你看到[object Object],本质是因为你在打印整个对象/数组,而不是访问对象里的具体字段(比如玩家名称、关卡数)。举个例子:如果highScores数组里存的是{name: "张三", level: 5}这样的对象,直接trace(highScores)就会输出[object Object],但如果你打印highScores[0].name,就能得到具体的字符串。
完整的正确实现示例
我帮你补全并修正代码,确保数据存储和输出都正常:
import flash.net.SharedObject; // 1. 获取本地SharedObject(不存在则自动创建) var HScores:SharedObject = SharedObject.getLocal("HighScoresValues"); // 2. 初始化高分数组:如果SharedObject里还没有存储的数组,先创建空数组 if (HScores.data.highScores == null) { HScores.data.highScores = new Array(); } // 3. 获取用户输入的名称和关卡(建议做非空校验,避免无效数据) var USR_Name:String = PlayerTXT.text.trim(); var USR_Level_Reached:Number = parseInt(LevelTXT.text); // 转成数字方便排序 // 4. 创建新的高分对象,结构清晰方便后续读取 var newScore:Object = { playerName: USR_Name, level: USR_Level_Reached }; // 5. 将新分数添加到数组,然后按关卡数降序排序(可选,根据需求调整) HScores.data.highScores.push(newScore); HScores.data.highScores.sortOn("level", Array.NUMERIC | Array.DESCENDING); // 6. 务必调用flush(),确保数据写入本地存储 HScores.flush(); // 7. 正确输出高分列表:遍历数组,打印每个对象的具体属性 trace("=== 离线高分榜 ==="); for (var i:int = 0; i < HScores.data.highScores.length; i++) { var currentScore:Object = HScores.data.highScores[i]; trace(`${i+1}. ${currentScore.playerName} - 通关关卡:${currentScore.level}`); }
关键注意事项
- 不要直接打印对象/数组:必须访问对象的具体属性(比如
currentScore.playerName)才能得到可读的内容。 - 初始化SharedObject数据:第一次运行时
HScores.data.highScores是null,必须先初始化空数组,避免后续操作报错。 - 调用flush()保存数据:添加或修改数据后,一定要调用
HScores.flush(),否则数据不会写入本地文件,重启游戏后会丢失。 - 数据类型统一:把关卡数转成数字类型,方便后续排序和比较,避免字符串排序的问题(比如"10"会排在"2"前面)。
内容的提问来源于stack exchange,提问作者Sean Carroll
相关产品推荐
相关产品推荐

