【问题标题】:Unable to change variable on Main Timeline using value from Symbol Timeline无法使用符号时间轴中的值更改主时间轴上的变量
【发布时间】:2018-10-05 01:22:51
【问题描述】:

我是编码新手,很难找到答案。

基本上,我正在尝试使用 ActionScript 3 在 Flash CS5.5 中制作一个装扮游戏。当前的问题是我正在尝试使颜色在不同的衣服上保持一致(例如:如果你有一个蓝色T恤,然后换成裙子,裙子应该是蓝色的。如果你把裙子的颜色改成红色,再换回T恤,那么T恤现在应该是红色的。)

我正在使用我在 Photoshop 中创建的资源,并且我将所有资源都放在了 Movie Clip 符号中(所以所有的 T 恤都在 Symbol T 恤里面,所有的衣服都在 Symbol Dress 里面,等等) ;最重要的是,我将所有相同颜色的衣服放在它们各自符号的相同关键帧编号中(所有红色衣服都在关键帧 1 中,所有蓝色衣服都在关键帧 2 中,等等)。

我要做的是每当玩家单击颜色按钮时为符号时间轴中的变量分配一个数字,然后在主时间轴中读取变量,将该变量存储在主时间轴中的另一个变量中所以即使符号发生变化,它也会持续存在,然后让另一个符号读取主时间线上的变量,以应用到一个告诉它去哪里的函数。

我目前的问题是,我无法让主时间线上的变量读取符号上的变量,因此无法更新。

代码如下:

//MAIN SCENE SCRIPT

//STOP EVERYTHING FROM STARTING
stop();

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//DECLARE COLOR VARIABLE IN MAIN TIMELINE AND ASSIGN VALUE FROM SQUARE 
SYMBOL
var color = square.KeyColor;
//MOVE COLOR VARIABLE TO PERMANENT VARIABLE
var KeepColor:int = color;

// change color variable IF THE VALUE IS NOT 1
function ChangeColor () : void
{
  if(KeepColor != 1)
    {
      if (square.KeyColor != 1)
      {
        KeepColor = square.KeyColor;
        trace("color set to square value" )
      }

      else if (pentagon.KeyColor != 1)
      {
        KeepColor = pentagon.KeyColor;
        trace("color set to pentagon value")
      }

      else
      {
        trace ("there is an error")
        //break;
      }

    }
}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//CALL FUNCTION TO GO TO SQUARE SYMBOL AT THE CLICK OF BUTTON 1
btn1.addEventListener(MouseEvent.CLICK, printNumber);

//FUNCTION TO GO TO SQUARE SYMBOL
function printNumber(event:MouseEvent):void
{

    //GO TO FIRST KEYFRAME IN MAIN TIMELINE AND STOP
    gotoAndStop(1)
    //ASSIGN KEYCOLOR VALUE
    square.KeyColor = color;
    //PRINT COLOR CODE
    trace("color is  " + color);

}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//CALL FUNCTION TO GO TO PENTAGON SYMBOL AT THE CLICK OF BUTTON 2
btn2.addEventListener(MouseEvent.CLICK, printNumber2);

//FUNCTION TO GO TO PENTAGON SYMBOL
function printNumber2(event:MouseEvent):void
{

    //GO TO FIRST KEYFRAME IN MAIN TIMELINE AND STOP
    gotoAndStop(2)
    //PRINT COLOR CODE INSIDE OF THE PENTAGON SYMBOL
    trace("color is " + color);

}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//CHECK THAT THE COLOR CODE IN TH MAIN TIMELINE IS THE SAME AS THE COLOR 
FROM THE SQUARE 

//PRINT THE CODE AT THE CLICK OF THIS BUTTON
btnK.addEventListener(MouseEvent.CLICK, checkOtherKey);

//DECLARE FUNCTION TO PRINT KeepColor VARIABLE
function checkOtherKey(event:MouseEvent):void
{
trace("the current color is " + KeepColor);
}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//SQUARE SYMBOL SCRIPT

//STOP EVERYTHING FROM STARTING
stop();

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//DECLARE KEYFRAME CODE FOR COLOR
var KeyColor:int = 1;

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//CALL FUNCTION TO GO TO COLOR 1 AT THE CLICK OF BUTTON 1
btn1.addEventListener(MouseEvent.CLICK, Keynumber);

//DECLARE FUNCTION  FOR CHANGING KEYFRAME
function Keynumber(event:MouseEvent):void
{

    //GO TO FIRST KEYFRAME IN SQUARE TIMELINE AND STOP
    gotoAndStop(1);
    //SET COLOR CODE TO 1
    KeyColor = 1;
    //PRINT COLOR CODE OF FIRST COLOR
    trace("SQUARE" + KeyColor);
    //change root color number
    MovieClip(root).color = KeyColor;

}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//CALL FUNCTION TO GO TO COLOR 2 AT THE CLICK OF BUTTON 2
btn2.addEventListener(MouseEvent.CLICK, Keynumber2);

//DECLARE FUNCTION  FOR CHANGING KEYFRAME
function Keynumber2(event:MouseEvent):void
{
    //GO TO FIRST KEYFRAME IN SQUARE TIMELINE AND STOP
    gotoAndStop(2);
    //SET COLOR CODE TO 2
    KeyColor = 2;
    //PRINT COLOR CODE OF SECOND COLOR
    trace("SQUARE" + KeyColor);
    MovieClip(root).color = KeyColor;

}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

 // PENTAGON SYMBOL SCRIPT


//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//STOP EVERYTHING FROM STARTING
stop()

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//DECLARE KEYFRAME CODE FOR COLOR
var KeyColor:int;

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//CALL FUNCTION TO GO TO COLOR 1 AT THE CLICK OF BUTTON 1
btn1.addEventListener(MouseEvent.CLICK, Keynumber);

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//DECLARE FUNCTION  FOR CHANGING KEYFRAME
function Keynumber(event:MouseEvent):void
{
    //GO TO FIRST KEYFRAME IN PENTAGON TIMELINE AND STOP
    gotoAndStop(1);
    //SET COLOR CODE TO 1
    KeyColor = 1;
    //PRINT COLOR CODE OF FIRST COLOR
    trace ("PENTAGON" + KeyColor);

}

//-----------------------------------------------------------------------
//-----------------------------------------------------------------------

//CALL FUNCTION TO GO TO COLOR 2 AT THE CLICK OF BUTTON 2
btn2.addEventListener(MouseEvent.CLICK, Keynumber2);

//DECLARE FUNCTION  FOR CHANGING KEYFRAME
function Keynumber2(event:MouseEvent):void
{
    //GO TO SECOND KEYFRAME IN PENTAGON TIMELINE AND STOP
    gotoAndStop(2);
    //SET COLOR CODE TO 2
    KeyColor = 2;
    //PRINT COLOR CODE OF SECOND COLOR
    trace("PENTAGON" + KeyColor);

}

感谢您的帮助!

【问题讨论】:

    标签: actionscript-3 flash flash-builder flash-cs5


    【解决方案1】:

    您可以通过使用影片剪辑的.currentFrame 属性保存每种布料的帧号,在更改颜色时始终更新它,并在更改布料时使用它。

    //Reference to the current shirt or dress:
    var shirt:MovieClip = basicShirt; //update this when you change shirt to dress etc
    
    //Variables for colors (frames)
    var shirtColor:int = 1;
    
    //Changing shirt color:
    shirtColorButton.addEventListener(MouseEvent.CLICK, changeShirtColor);
    
    function changeShirtColor(evt:MouseEvent):void{
        //Other handy property for you might be .totalFrames:
        if(shirt.currentFrame < shirt.totalFrames){
            shirtColor++;
        }else{
            shirtColor = 1;
        }
        shirt.gotoAndStop(shirtColor);
    }
    

    因此,现在如果您将衬衫换成连衣裙,您只需从舞台上取下衬衫,将连衣裙添加到舞台上,然后:

    //function that creates the shirt:
    shirt = basicDress;
    shirt.gotoAndStop(shirtColor);
    

    如果您真的需要颜色名称,您可以使用框架标签,或者将颜色名称存储到数组中,因为顺序始终相同,例如:

    var colorNames:Array = ["Blue","Red","Green"];
    ...
    trace("Shirt color is "+colorNames[shirtColor - 1]);
    

    【讨论】:

    • 感谢您的帮助!但是我将代码的哪些部分放在符号内,哪些放在主时间线上?还是全部都在主时间线上?
    • 您可以在主时间线上处理所有这些。在 Mc 时间线中,您不需要超过 stop();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多