AS3中如何从数组字符串值实例化类对象?
嘿,我明白你想做什么——想用数组里的字符串直接当类实例的名字,在循环里批量创建对象对吧?AS3里确实不能直接把字符串转成变量名,但我们可以用一个对象容器来实现类似的效果,而且这也是更规范的做法。
首先,你原代码里有个小语法错误:xPos =+ xPos + ...应该是xPos += ...(+=才是累加操作,=+是把变量设成后面值的正数,完全不是你想要的),还有yPos得先初始化一下。
下面是修改后的完整代码,假设你的自定义类叫Tile(如果不是的话替换成你实际的类名):
// 导入你的自定义类,根据实际包路径调整 import your.package.Tile; var tiles2:Array = ["e1", "e2", "e3"]; // 这里填你完整的数组元素 var tileInstances:Object = {}; // 这个对象用来存所有实例,数组里的字符串就是它的属性名 // 初始化位置和尺寸参数,根据你的实际需求调整 var xPos:Number = 18; var yPos:Number = 0; var objWidth:Number = 60; var objHeight:Number = 60; var horGap:Number = 12; var verGap:Number = 12; var maxGridWidth:Number = 400; for (var i:int = 0; i < tiles2.length; i++) { // 用数组里的字符串作为键,创建并存储实例 tileInstances[tiles2[i]] = new Tile(); // 设置实例的位置 tileInstances[tiles2[i]].x = xPos; tileInstances[tiles2[i]].y = yPos; // 把实例添加到舞台(如果需要显示的话) addChild(tileInstances[tiles2[i]]); // 计算下一个实例的X坐标 xPos += objWidth + horGap; // 如果超出最大宽度,就换行重置X,累加Y if (xPos + objWidth > maxGridWidth) { xPos = 18; yPos += objHeight + verGap; } } // 之后要访问某个实例的话,直接用容器加键就行 // 比如访问e1:tileInstances["e1"] 或者 tileInstances.e1 trace("e1的Y坐标:" + tileInstances.e1.y);
为什么这么做呢?因为AS3不允许在非动态类的作用域里动态创建变量名(全局作用域这么做也不推荐,容易搞乱变量),用对象容器的话,既可以通过数组里的字符串快速找到对应的实例,又能把所有实例统一管理,不会污染全局命名空间。
另外,原代码里的位置判断逻辑有点绕,我改成了更直观的:每次累加X后,检查加上实例宽度会不会超过最大网格宽度,是的话就换行,这样逻辑更清晰。
内容的提问来源于stack exchange,提问作者Nelson Sule
相关产品推荐
相关产品推荐

