动作脚本3(AS3)MovieClip(root).MyVariable如何工作?

时间:2013-04-13 13:09:50

标签: actionscript-3 flash animation flash-cs6

我是AS3的新手,试图学习它。尝试创建游戏,主要时间线和许多动画片段。我在主时间轴中有一些变量,我想通过点击每个不同的动画片段来改变它们。比方说,我有舞台坐标cx和cy,然后我点击任何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 movieclip(符号名称mc1)代码:

MovieClip(root).cx=0;
MovieClip(root).cy=0;
MovieClip(root).tx=0;
MovieClip(root).ty=0;
第一帧上的

c2 movieclip(符号名称mc2)代码:

MovieClip(root).cx=85;
MovieClip(root).cy=85;
MovieClip(root).tx=85;
MovieClip(root).ty=85;
问:我总是得到我点击的第一个动画片段的价值。 我有点找到解决方案,但我不认为它应该是这样的,在每个mc1和mc2我做了第二个空关键帧,现在它的工作,但我不认为它应该像这样,我做错了什么,任何没有在动画片段中创建更多帧的方法吗?

1 个答案:

答案 0 :(得分:0)

实际上听起来不对。我怀疑是因为你在到达第一帧之前进入了trace语句。但是,我鼓励你现在放弃这种方法,开始养成更好的习惯。

让儿童片段知道并操作更高层次的物体是一个奇妙的捷径 - 一个难以维护的混乱。相反,您应该使其上可用的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总是与仅使用该值而不是Object的值相同。