2012-01-05 80 views
0

所以我有一个箱子在我的图书馆中导出为Box。我曾尝试:如何将有限的物体添加到舞台

package { 

    import flash.display.MovieClip; 
    import flash.events.*; 

    public class Main extends MovieClip { 

     private var _box:Box=new Box ; 
     private var boxAmount:Number=0; 
     private var boxLimit:Number=16; 


     private var _root:Object; 
     public function Main() { 

      addEventListener(Event.ENTER_FRAME, eFrame); 

      addEventListener(MouseEvent.MOUSE_DOWN, mouseclick); 
     } 

     private function eFrame(event:Event):void { 
      if (boxAmount <= boxLimit) { 
       boxAmount++; 
       _box.y=Math.random()*stage.stageHeight; 

       _box.x=Math.random()*stage.stageWidth; 

       addChild(_box); 

      } else if (boxAmount >= boxLimit) { 
       removeEventListener(Event.ENTER_FRAME, eFrame); 
      } else { 
       addEventListener(Event.ENTER_FRAME, eFrame); 
      } 
     } 
    } 
} 

但按计划没有奏效。

我想要做的就是让我的盒子保持在舞台上的随机位置的屏幕上,并在点击时将其删除(但那会晚点)。这段代码是出于某种原因将对象添加到舞台上,然后将其删除并再次添加16次。

感谢

回答

1

我好像你已经创建了一个_box,并重新将它添加到输入框的时间线上。如果您在eFrame函数内部,而不是之前创建一个新的框实例它应该工作,然后你把重新分配到相同的变量名,而不是重复使用一个对象如:

package { 

import flash.display.MovieClip; 
import flash.events.*; 

public class Main extends MovieClip { 


    private var boxAmount:Number=0; 
    private var boxLimit:Number=16; 


    private var _root:Object; 
    public function Main() { 

     addEventListener(Event.ENTER_FRAME, eFrame); 

     addEventListener(MouseEvent.MOUSE_DOWN, mouseclick); 
    } 

    private function eFrame(event:Event):void { 
     if (boxAmount<=boxLimit) { 
      boxAmount++; 

      var _box:Box=new Box ; 

      _box.y=Math.random()*stage.stageHeight; 

      _box.x=Math.random()*stage.stageWidth; 

      addChild(_box); 


     } else if (boxAmount >= boxLimit) { 
      removeEventListener(Event.ENTER_FRAME, eFrame); 
     } else { 
      addEventListener(Event.ENTER_FRAME, eFrame); 





     } 
    } 
} 
} 
+0

谢谢帮助很多 – thor625 2012-01-05 17:14:01

0

你在看什么只是重新定位相同的方块一遍又一遍,因为你永远只创建一个Box实例。您需要创建Box的多个实例并将它们分别添加到舞台中。

package { 

    import flash.display.MovieClip; 
    import flash.events.*; 

    public class Main extends MovieClip { 

     private var boxAmount:Number=0; 
     private var boxLimit:Number=16; 
     private var _root:Object; 

     public function Main() { 
      addEventListener(Event.ENTER_FRAME, eFrame); 
      addEventListener(MouseEvent.MOUSE_DOWN, mouseclick); 
     } 

     private function eFrame(event:Event):void { 
      if (boxAmount<=boxLimit) { 
       boxAmount++; 
       //create a new box instance 
       var _box:Box = new Box(); 
       _box.y=Math.random()*stage.stageHeight; 
       _box.x=Math.random()*stage.stageWidth; 

       addChild(_box); 
      } else { 
       removeEventListener(Event.ENTER_FRAME, eFrame); 
      } 
     } 
    } 
} 
1

在你的代码只曾经创造过一个盒子。您的enterFrame处理程序只是将其分配给一个新的随机位置16次。如果你想要16个盒子,你需要每次在enterFrame函数中创建一个新盒子。

但是你不需要在这里使用ENTER_FRAME事件。您可以使用for loopwhile loop来创建16个框。

下面是一些代码:

package { 

import flash.display.MovieClip; 
import flash.events.*; 

public class Main extends MovieClip { 

    private var boxAmount:Number=0; 
    private var boxLimit:Number=16; 

    public function Main() { 
     addBoxes(); 
    } 

    private function addBoxes():void { 

     while (boxAmount<=boxLimit) { 
      boxAmount++; 

      var box:Box = new Box(); 
      box.y=Math.random()*stage.stageHeight; 
      box.x=Math.random()*stage.stageWidth; 

      addChild(box); 

      // listen for mouse clicks 
      box.addEventListener(MouseEvent.CLICK, onBoxClick); 
     } 
    } 

    private function onBoxClick(e:MouseEvent):void { 
     var clickedBox:Box = e.target as Box; 
     removeChild(clickedBox); 
    } 

} 
} 

我删除了你的enterFrame事件的处理程序,只是做了一个叫addBoxes功能。我正在使用一个while循环来打包这些框。请注意,每次通过循环时,我都会创建一个新框,而不仅仅是重复使用旧框。我还为每个盒子添加一个鼠标点击事件监听器,以便在单击时从舞台上移除它。

你一定想改变一些这个来让它为你的目的工作,但它应该让你朝着正确的方向前进。

0

尽管变量boxAmount暗示,否则,你说你只想要一个盒子。所以,要做到这一点,您只需将以下几行移入构造函数(Main)。

_box.y=Math.random()*stage.stageHeight; 
_box.x=Math.random()*stage.stageWidth; 
addChild(_box); 

然后删除或禁用输入框事件。在这种情况下你不需要它。要检查是否得到了点击箱子,听者连接到盒子本身,而不是它的父:

_box.addEventListener(MouseEvent.MOUSE_DOWN, mouseclick); 

if (boxAmount<=boxLimit) { 
    // ... 
} else if (boxAmount >= boxLimit) { 
    // ... 
} else { 
    // ... 
} 

这部分看起来真的很奇怪。第一个条件涵盖了第二个条件也涵盖的一个案例,它们已经涵盖了所有可能的案例。 boxAmount小于或等于boxLimits或大于它。两次检查平等是令人困惑的。没有必要包含最后的else语句。它实际上具有与下面的代码相同的行为。

if (boxAmount<=boxLimit) { 
    // ... 
} else if (boxAmount > boxLimit) { 
    // ... 
} 
相关问题