Action Script 3 (AS3) как работает MovieClip (root) .MyVariable?

Я новичок в AS3, пытаюсь изучить его. Пытаюсь создать игру с основной временной шкалой и множеством видеоклипов. У меня есть несколько переменных на основной шкале времени, и я хочу изменять их каждый раз, щелкая каждый разный фрагмент ролика. скажем, у меня есть сценические координаты cx и cy, а затем я нажимаю на Any Movieclip, я хочу изменить эти переменные на координаты, которые есть в мувиклипе. Вот что я сделал:

Основная хронология

import flash.events.MouseEvent;
import fl.motion.Color;
import fl.motion.MotionEvent;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import flash.display.InterpolationMethod;

var cx:int;        //stage coordinate x;
var cy:int;        //stage coordinate y;
var tx:int;        //table coordinate x;
var ty:int;    //table coordinate y;

c1.addEventListener(MouseEvent.CLICK, tracing);
c2.addEventListener(MouseEvent.CLICK, tracing);

function tracing(e:MouseEvent):void {
e.currentTarget.gotoAndPlay(1);
trace(cx,cy,tx,ty);
}

Код мувиклипа c1 (имя символа mc1) в первом кадре:

MovieClip(root).cx=0;
MovieClip(root).cy=0;
MovieClip(root).tx=0;
MovieClip(root).ty=0;

Код мувиклипа c2 (имя символа mc2) в первом кадре:

MovieClip(root).cx=85;
MovieClip(root).cy=85;
MovieClip(root).tx=85;
MovieClip(root).ty=85;

проблема в том, что я всегда получаю значение первого клипа, который я щелкнул. Я как бы нашел решение для этого, но я не думаю, что это должно быть так, в каждом mc1 и mc2 я сделал второй пустой ключевой кадр, и теперь он работает, но я не думаю, что это должно быть так, что я делаю не так, любые способ обойтись без создания большего количества кадров во фрагментах ролика?


person Audrius Butkus    schedule 13.04.2013    source источник


Ответы (1)


На самом деле это звучит неправильно. Я подозреваю, что это потому, что вы переходите к оператору трассировки до того, как дойдете до первого кадра. Однако я бы посоветовал вам отказаться от этого подхода и начать вырабатывать лучшие привычки.

Если дочерние клипы знают об объектах, находящихся выше в иерархии, и работают с ними, это фантастический путь к неустранимой неразберихе. Вместо этого вы должны либо сделать свойства cx, cy, tx, ty доступными для чтения, либо отправить из них событие, из которого можно вывести эти значения.

Вот простой пример того, как вы могли бы этого добиться:

class MainDocument extends MovieClip {
   //presume these are stage instances
   public var c1:MovieClip;
   public var c2:MovieClip;
   public var valueRegistry:Dictionary =  new Dictionary();
   protected var cx:int;
   protected var cy:int;
   protected var tx:int;
   protected var ty:int;
   function MainDocument () {
       super();
       if (c1) {
           valueRegistry[c1] = {cx:0, cy:0, tx:0, ty:0};
           c1.addEventlistener(MouseEvent.CLICK, tracing);
       }
       if (c2) {
           valueRegistry[c2] = {cx:85, cy:85, tx:85, ty:85};
           c2.addEventlistener(MouseEvent.CLICK, tracing);
       }
   }
   protected function tracing(e:MouseEvent):void {
      var mc:MovieClip = e.currentTarget as MovieClip;
      mc.goToAndPlay(1);
      var values:Object = valueRegistry[mc];
      if (values) {
         cx = values[cx];
         cy = values[cy];
         tx = values[tx];
         ty = values[ty];
      }
      trace(cx, cy, tx, ty);
   }

}

Обратите внимание, как теперь вы можете сделать эти mc буквально чем угодно - со своим собственным кодом или без него. Одна оптимизация, которую я предлагаю, заключается в том, что если cx, cy, tx, ty всегда являются одним и тем же значением, нужно использовать только это значение вместо объекта.

person Amy Blankenship    schedule 13.04.2013
comment
У вас есть опечатка во втором выражении if c1.addEventListener должно быть c2.addEventListener. - person Ricardo Souza; 13.04.2013
comment
Спасибо :). Копировать вставить. Но этот код в любом случае не будет работать как типизированный, поскольку он не включает операторы импорта и т. Д. - person Amy Blankenship; 13.04.2013
comment
Спасибо, похоже, я должен начать использовать классы для более крупных проектов, таких как игры. Когда я пытался писать все в основном флеш-таймфрейме, у меня было так много строк, и многие из них были связаны странным образом, что я запутался в собственном коде, поэтому попытался переместить некоторые из них в дочерние фрагменты роликов. Сейчас собираюсь научиться использовать классы в as3, и еще раз спасибо !!! :) - person Audrius Butkus; 14.04.2013