【问题标题】:AS3 : AddChild based on Array ValueAS3:基于数组值的 AddChild
【发布时间】:2012-05-11 11:13:29
【问题描述】:

假设我有一个数组,数组中的每一项都有对应的库项。

我想做类似的事情:

var rando = Math.round(Math.random()*3)
var myArray = new Array ["ball", "wall", "fall"]
var i:myArray[rando] = myArray[rando] new myArray[rando]()
addChild(i)

但是,这行不通。秘诀是什么?

谢谢,

维克多·雨果

【问题讨论】:

  • “这行不通” - 究竟如何?错误或意外行为?
  • 首先,您要对随机变量进行取整,而不是四舍五入。 var rando = Math.floor(Math.random()*3);
  • 仔细看看你在做什么 - 你希望 addChild("ball") 工作吗?
  • 如果上一行是 i:ball = ball new ball(),我希望 addChild(i) 能够工作

标签: arrays actionscript-3 addchild


【解决方案1】:

将您的 arrary 行更改为:

 var myArray = new Array [ball, wall, fall];

这应该可行。 :)

【讨论】:

    【解决方案2】:

    很惊讶这里没有人提到getDefinitionByName()

    这里有一些完整的代码可以让您的示例正常工作:

    var myArray = ["ball", "wall", "fall"];
    
    /**
     * Creates a random instance based on an input array containing class names as Strings.
     * @param The input array containing aforementioned Strings.
     * @return The newly created instance.
     */
    function createRandom(typeArray:Array):*
    {
        // Select random String from typeArray.
        var selection:String = typeArray[ int(Math.random() * typeArray.length) ];
    
        // Create instance of relevant class.
        var Type:Class = getDefinitionByName(selection) as Class;
    
        // Return created instance.
        return new Type();
    }
    
    
    // Randomly create and add instance.
    var instance:DisplayObject = createRandom(myArray);
    addChild(instance);
    

    【讨论】:

      【解决方案3】:

      Marty Wallace 因引导我走上 getDefinitionByName() 的道路而备受赞誉。他发布的例子很好,但这个例子正是我想要的。

      http://www.emanueleferonato.com/2011/03/31/understanding-as3-getdefinitionbyname-for-all-eval-maniacs/

      【讨论】:

      • 真的很惊讶没有一个答案涵盖这个。
      • 我已经添加了一个完整的答案;你熟悉accepting an answer吗? :)
      【解决方案4】:

      只是猜测您有限的信息,但试一试。

      private function myFunction():void{
          var rando = Math.round(Math.random()*3);
          var myArray= new Array ["ball", "wall", "fall"];
      
      }
      private function generateItem(item:String):void{
          switch(item){
              case "ball" : generateBall(); break;
              case "wall" : generateWall(); break;
              case "fall" : generateFall(); break;
      }
      
      private function generateBall():void{
      //code to generate ball
      addChild(ball);
      }
      
      private function generateFall():void{
      //code to generate fall
      addChild(fall);
      }
      
      private function generateWall():void{
      //code to generate wall
      addChild(wall);
      }
      

      【讨论】:

        【解决方案5】:

        好的,这有很多问题。

        一个很大的 var i:myArray[rando] = myArray[rando] new myArray[rando]() 不太清楚你想在这里做什么。

        无论如何,我将假设 ball、wall 和 fall 是您在库中拥有的 MovieClips 的实例名称。我想你会想要这样的东西

         var rando:int = Math.floor(Math.random()*3); //As the comments point out this should give you a random 
        //int between 0 and 2, arrays are 0 indexed so this is what we want if we have 3 items
        

        现在对于您的数组,您当前正在将字符串放入其中。 Flash 不知道什么是“球”等。

        试试这样的

        var myArray:Array = new Array [new ball(), new wall(), new fall()]; //this creates a new instance of your library object and stores it in your array
        

        现在将其中之一添加到您的舞台:

        addChild(myArray[rando]); //this uses the random number to pull one of the items out of your array
        

        你试图用var i:myArray[rando] 做的事情没有任何意义。没有 myArray[rando] 的类型,这个槽应该有一个 MovieClip

        【讨论】:

          【解决方案6】:

          如果您只有几个选择,使用 switch-case 会更容易。

          switch (rando) {
             case 0:
                 i = new ball();
                 break;
             case 1:
                 i = new wall();
                 break;
             case 2:
                 i = new fall();
                 break;
          }
          addChild(i);
          

          我建议您将变量i 定义为MovieClip,在这种情况下,它可以实例化为球、墙、跌落。

          鉴于球、墙和坠落都在导出到 actionscript 的库中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多