0

我有一个随机化皮肤的代码

private var tiles:Array = [
            {"item":"Skin1", "chance":70 },
            {"item":"Skin2", "chance":5 },
            {"item":"Skin3", "chance":10 },
            {"item":"Skin4", "chance":10 },
            {"item":"Skin5", "chance":5 }
        ];


public function pickRandomByChance(options:Array):Object{
            var copy:Array=[];
            for (var i:int = 0; i < options.length; i++) {
                  copy.push( { "item":options[i].item, "chance":options[i].chance } );
            }
            var range:Number = 0;
            for (i = 0; i < copy.length; i++){
                  range += copy[i].chance;
                  if (i > 0)
                  copy[i].chance += copy[i - 1].chance;
            }

            var pick:Number = Math.floor(Math.random() * range);

            for (i = 0; i < copy.length; i++){
                 if (pick <= copy[i].chance)
                 return copy[i];
            }
    return null;
}

我的问题是如何使用 setStyle 将这些皮肤分配给我的一个按钮?

button1.setStyle("skinClass", pickRandomByChance(tiles).item);

我尝试使用上述代码,但出现错误 #1009:无法访问空对象引用的属性或方法。

4

1 回答 1

0

我认为您的函数正在返回 null(当设置它们的样式时,它本质上是调用 null.item)。我没有测试这段代码,我很确定它会起作用。也许试一试。在我看来,它更简单一些。

public function pickRandomByChance(options:Array):Object{
    var weightedArray:Array = [];
    var range:Number = 0;
    for each(var tile:Object in options){
        for(var x = 0; x < tile.chance; x++){
            weightedArray.push(tile);
        }
        range += tile.chance;
    }
    return(weightedArray[Math.floor(Math.random() * range)].item);
}

编辑:现在我查看了您的皮肤阵列,我想我发现了错误。试试不带引号的皮肤名称:

var tiles:Array = [ {"item":Skin1, "chance":70 },
                    {"item":Skin2, "chance":5 },
                    {"item":Skin3, "chance":10 },
                    {"item":Skin4, "chance":10 },
                    {"item":Skin5, "chance":5 } 
                  ];

编辑:请参阅上面修改后的回报,并应用皮肤,如下所示:

button1.setStyle("skinClass", pickRandomByChance(tiles));
于 2012-08-29T00:18:13.957 回答