Динамически создавать несколько копий MC - PullRequest
0 голосов
/ 18 января 2011

У меня вопрос по поводу AS 3. Я сделал клип Post-It note, который можно перетаскивать. Я хочу создать целый блокнот или, по крайней мере, смоделировать это. Я подумал, что лучший способ сделать это - добавить еще один Post-It всякий раз, когда запускается startDrag ().

Сначала я попытался создать Post-It с символами, но не думал, что смогу динамически создавать новые таким образом. Затем я создал класс и добавил его на сцену:

... addChild (new PostItNote ());

Но я не смог (или не знаю, как) установить положение x, y на сцене.

У кого-нибудь есть предложения по наилучшему способу достижения того или иного пути вообще?

EDIT:

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;
   }
  }  

   }
}

EDIT:

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

        public function PostItNotes() {
            // constructor code
        }

    }

}

Ответы [ 4 ]

0 голосов
/ 19 января 2011

Проблема в том, что вы устанавливаете PostItNotes как BaseClass вместо самого класса.

Это означает, что вы добавляете на сцену класс, который имеет только логику, а не графические элементы.

Что вам нужно сделать, это вернуться к символу в библиотеке -> щелкните правой кнопкой мыши -> свойства и измените BaseClass на flash.display.MovieClip (или в вашем случае flash.display.Sprite, если вам не нужно временной шкалы) и установите PostItNotes в качестве класса.

РЕДАКТИРОВАТЬ:

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, потому что я думаю, что это то место, к которому оно относится, поскольку перетаскивание действительно касается только самого post-it.

Возможно, вам придется удалить код перетаскивания там, где он был раньше.

Вам нужна помощь в создании нового PostIt?

0 голосов
/ 18 января 2011

Кстати: вы можете комбинировать класс AS3 с Symbol, чтобы вы могли работать с кодом и графикой в ​​одном классе.

Это может быть проще, когда вам приходится иметь дело с PostIt как графическим элементом и всей логикой, написанной на ActionScript.

Таким образом, вы можете обрабатывать все действия перетаскивания внутри самого класса PostIt.

0 голосов
/ 18 января 2011

Относительно этой части вопроса:

Затем я создал класс и добавил его в этап:

... 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 и других свойств до (или после) добавления его на сцену.

0 голосов
/ 18 января 2011

попробуйте создать вектор для хранения ссылок на ваши объекты 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;
...