动态实例化MC的多个副本

时间:2011-01-18 16:29:01

标签: flash actionscript instantiation

我有一个问题:AS 3.我制作了一个可拖动的便利贴电影剪辑。我想创建一整个音符,或至少模拟这个。我认为最好的方法是在触发startDrag()时添加另一个Post-It。

我首先尝试用符号创建Post-It但不认为我可以用这种方式动态创建新的。然后我创建了一个类并将其添加到舞台上:

... addChild(new PostItNote());

但我无法(或不知道如何)在舞台上设置x,y位置。

任何人都有关于实现这个目标的最佳方式的建议,甚至完全是另一种方式?

编辑:

package  {

 import flash.display.MovieClip;
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 import flash.events.Event;
 import flash.text.TextField;
 import flash.media.Sound;
 import flash.media.SoundChannel;
 import flash.text.TextFormat;

 public class CoinHitTest extends MovieClip {

  var count:Number = 0;
  var total_count:TextField;
  var hitting:Boolean = false;
  var coinSnd:Sound = new coin_drop();
  var myMoney:TextFormat = new TextFormat();
  var noteStack:Vector.<PostItNotes> = new Vector.<PostItNotes>();

public function CoinHitTest(){
    for(var $i:int = 0; $i <5;$i++)
{
    var newPostIt:PostItNotes = new PostItNotes();
    this.addChild(newPostIt);
    this.noteStack.push(newPostIt);
}
// constructor code
   coin.addEventListener(MouseEvent.MOUSE_DOWN, __handleCoinDown);
   coin.addEventListener(MouseEvent.MOUSE_UP, __handleCoinUp);

   total_count = new TextField();
   total_count.x = 795.20;
   total_count.y = 506.15;
   total_count.mouseEnabled = false;

   myMoney.size = 28;
   total_count.defaultTextFormat = myMoney;
   total_count.text = String("$" + count);
   addChild(total_count);
  }

  private function __handleCoinDown($evt:MouseEvent):void {

   coin.startDrag(true);
     coin.scaleX = 1.5;
     coin.scaleY = 1.5;
   addEventListener(Event.ENTER_FRAME, __checkHit);
  }

  private function __handleCoinUp($evt:MouseEvent):void {
   coin.stopDrag();
     coin.scaleX = 1;
     coin.scaleY = 1;
   removeEventListener(Event.ENTER_FRAME, __checkHit);
  }

  private function __checkHit($evt:Event):void {
    if (this.coffee.hitTestPoint(coin.x,coin.y, false)) 
    { 
        // do our in-circle check
        if((coffee.x - coin.x) * 2 + (coffee.y - coin.y) * 2 <= (coffee.width/2 + coin.width/2) * 2)
        {
            stopDrag();
            coin.scaleX = 1;
     coin.scaleY = 1;
            removeChild(coin);
            coin.x = 116;
     coin.y = 380.1;
      addChild(coin);

        }
    }
    else
    {
        trace("Didn't Hit Mug");
    } 
   if (this.coin.hitTestObject(target)) {
     if (!hitting) {
         coinSnd.play();
     count++;
       total_count.text = String("$" + count);
       coin.stopDrag();

     removeChild(coin);
     hitting = !hitting;

     coin.x = 116;
     coin.y = 380.1;
      addChild(coin);
     coin.scaleX = 1;
     coin.scaleY = 1;

}
   } else {
    hitting = false;
   }
  }  

   }
}

编辑:

package  {
    import flash.display.MovieClip;
public class PostItNotes extends Sprite{

        public function PostItNotes() {
            // constructor code
        }

    }

}

4 个答案:

答案 0 :(得分:0)

尝试创建一个向量来保存对PostItNote对象的引用......

这样的事情:

var noteStack:Vector.<PostItNote> = new Vector.<PostItNote>();
for(var $i:int = 0; $i <5;$i++)
{
    var newPostIt:PostItNote = new PostItNote();
    this.addChild(newPostIt);
    this.noteStack.push(newPostIt);
}

然后,只要您希望能够修改PostItNote的属性(x / y / z /其他),就可以引用向量中的元素

this.noteStack[0].x = 24;

答案 1 :(得分:0)

顺便说一句:您可以将AS3类与Symbol结合使用,以便您可以在同一个类中使用代码和图形。

当你必须将PostIt作为图形元素和用ActionScript编写的所有逻辑处理时,这可能会更容易。

这样你就可以处理PostIt类本身的所有拖动动作。

答案 2 :(得分:0)

关于这部分问题:

  

然后我创建了一个类并将其添加到   阶段:

     

... addChild(new PostItNote());

     

但我无法(或不知道   如何)设置x,y位置   阶段。

设置你添加的新对象的x和y的最基本和最常用的方法可能就是做这样的事情:

var newPostIt:PostItNote = new PostItNote();
newPostIt.x = 100;
newPostIt.y = 200;
addChild(newPostIt);

换句话说,要保持对您创建的新对象的引用,而不是执行addChild(new PostItNote()),并在之前(或之后)设置x和y以及其他属性,将其添加到舞台。 / p>

答案 3 :(得分:0)

问题是你将PostItNotes设置为BaseClass而不是Class本身。

这意味着你添加到舞台的是一个只有逻辑而不是图形元素的类。

您需要做的是返回库中的符号 - &gt;右键单击 - &gt;属性并将BaseClass更改为flash.display.MovieClip(如果您不需要时间轴,则更改为flash.display.Sprite)并将PostItNotes设置为Class。

编辑:

package  {

    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class PostItNotes extends Sprite {

        public function PostItNotes() {
            super();

            addEventListener(MouseEvent.MOUSE_DOWN, onStartDrag);
        }

        protected function onStartDrag (event:MouseEvent):void {

            stage.addEventListener(MouseEvent.MOUSE_UP, onStopDrag);
            startDrag(false);

        }

        protected function onStopDrag (event:MouseEvent):void {

            stage.removeEventListener(MouseEvent.MOUSE_UP, onStopDrag);
            stopDrag();

        }
    }
}

我将拖动动作添加到你的PostItNotes类中,因为我认为这是它所属的位置,因为拖动实际上只涉及它本身。

您可能需要删除以前使用过的拖动代码。

您是否也需要有关创建新PostIt的帮助?