动作脚本3,如何使类文件将事件处理程序从自身应用到主舞台上的实例或对象?

问题描述 投票:0回答:1

我对ActionScript 3还是很陌生,我一直试图在类文件中执行以下操作。我试图在网上寻找解决方案,但找不到合适的答案,也许是因为我没有在寻找正确的搜索字词等。无论如何,我正在尝试在Adobe Animate CC中的FLA文件“ Campfire.FLA”中制作一个基本的动画,在该文件中,将鼠标向下按在篝火上会使附着在悬浮棒上的一块煤发光并冷却放开鼠标键。在主时间轴上,我可以很好地执行它,但是我想将信息传输到类文件/文档文件中,但无济于事。该代码是我在FLA的主要时间轴第1帧上使用的代码,下面的代码工作得很好:

stop();
/* Instance names:
    Fire = Instance of "FireButton"; simplebutton.
    STween = Instance of "Stick Tween"; MovieClip, simple tween animation the object, "MarshmallowStick" moving.
    Stick = Instance of "Marshmallow Stick"; MovieClip.
    CoalRock = Instance of "Coal"; MovieClip.
*/
Fire.addEventListener(MouseEvent.MOUSE_DOWN, RockHot)
function RockHot(e: MouseEvent): void {
    stopPlayReverse();
    // Causes Coal and Stick to play their animation upon clicking Fire.
    STween.Stick.play();
    STween.Stick.CoalRock.play();

}
Fire.addEventListener(MouseEvent.MOUSE_UP, RockCold)
function RockCold(e: MouseEvent): void {
    STween.Stick.CoalRock.addEventListener(Event.ENTER_FRAME, playReverse, false, 0, true);
    STween.Stick.gotoAndPlay(1);
    // Upon letting go of mouse button, it causes the coal to cool down/ play reverse. Stick resets to Frame 1.

}
function playReverse(e: Event): void {
    if (STween.Stick.CoalRock.currentFrame == 1) {
        stopPlayReverse();
    // If Coal is back on Frame 1, it stops.
    } else {
        STween.Stick.CoalRock.prevFrame();
    // If Coal is not on Frame 1 it continues going reverse where it left off.
    }
}

function stopPlayReverse(): void {
    if (STween.Stick.CoalRock.hasEventListener(Event.ENTER_FRAME)) {
        STween.Stick.CoalRock.removeEventListener(Event.ENTER_FRAME, playReverse);
    // Stops the function playreverse()
    }
}

但是,当尝试将信息迁移到Actionscript文件时,遇到了两个问题。首先,我尝试为上面的每个对象制作一个actionscript 3类文件,但很多信息都是空白的,因为我不知道如何在它们之间传递事件处理程序。 MovieClips的许多信息都没有信息,“ MarshmallowStick”如下:

package  {

    import flash.display.MovieClip;


    public class MarshmallowStick extends MovieClip {


        public function MarshmallowStick() {
               // Empty, no constructor code.
        }
    }

}

对于“ Fire”类文件,我尝试过类似的操作:

package {

    import flash.display.*;
    import flash.events.*;
    import Coal;


    public class FireButton extends SimpleButton {
        public var CoalRock = Coal;
        public function FireButton() {
        Coalrock = new Coal ();
        this.addEventListener(MouseEvent.CLICK, RockHot)
            function RockHot(e: MouseEvent): void {
                CoalRock.play();
                trace("OK");
                trace(CoalRock);
            }
        }
    }
}

但是,经过测试,该文件似乎只是创建了一个名为CoalRock的新对象,与主舞台上的对象无关。因此,单击FireButton只会导致新对象播放。我试图在名为“ Main.as”的文件中制作一个文档类,如下所示:

package {

    import flash.display.*;
    import flash.events.*;


    public class Main extends MovieClip {
        public var Fire: FireButton;
        public var CoalRock: Coal;
        public var Stick: MarshmallowStick;
        public var STween: StickTween;

        public function Main() {
            CoalRock = new Coal();
            Fire = new FireButton();
            Stick = new MarshmallowStick();
/*          
            addChild(Fire);
            addChild(CoalRock);
            addChild(Stick);
            addChild(STween);
*/
// RIP, well it's pretty much the same code as above. Just without the nested symbols/ objects.
            Fire.addEventListener(MouseEvent.MOUSE_DOWN, RockHot)
            function RockHot(e: MouseEvent): void {
                stopPlayReverse();
                //Eye + Emblem glow
                Stick.play();
                CoalRock.play();
                trace("OK");

            }
            Fire.addEventListener(MouseEvent.MOUSE_UP, RockCold)
            function RockCold(e: MouseEvent): void {
                CoalRock.addEventListener(Event.ENTER_FRAME, playReverse, false, 0, true);
                Stick.gotoAndPlay(1);
            }
            function playReverse(e: Event): void {
                if (CoalRock.currentFrame == 1) {
                    stopPlayReverse();
                } else {
                    CoalRock.prevFrame();
                }
            }

            function stopPlayReverse(): void {
                if (CoalRock.hasEventListener(Event.ENTER_FRAME)) {
                    CoalRock.removeEventListener(Event.ENTER_FRAME, playReverse);
                }
            }
        }
    }

}

但是仅证明它仅影响通过addChild()添加的对象;据我测试。但这主要是因为脚本会影响主舞台/场景中已经存在的对象。谢谢,如果你们读过这篇文章,我就快死了。如果要查看其播放方式/假定播放的方式,则可以获取主要时间轴代码,并将其粘贴到包含所提供实例的FLA文件中。再次感谢xD。我不知道Stack如何格式化它。 / /应该是多行注释。

actionscript-3 adobe-animate
1个回答
0
投票

这是一个详尽的问题。

(您(最可能)需要的是某种封建等级制度,以便使对象倾向于自己和自己的直接子生,但不更深,也不完全不向上:

  • 容器→(接口方法)→子→(倾向于自己的子)
  • 容器←(状态事件)←子

[通常,孩子一定不知道其父母,应该与状态事件进行沟通。这样,您可以将这样的孩子放入任何容器中,而不必担心该孩子可能会向上攀升,并期望那里不存在某些父结构。

所以,你的问题。

First。访问主时间轴上已经存在的对象。好吧,唯一的诀窍不是创建new引用,而是获得对现有引用的引用。

package
{
    // Imports.

    public class Main extends MovieClip
    {
        // If you have an instance of MarshmallowStick with the
        // instance name "Stick" on the main timeline,
        // you don't need to do anything else.
        //
        // Default publish settings are to auto-declare
        // the main timeline instance into the
        // appropriately named variable.

        public var Stick:MarshmallowStick;

P.S。自己从Tween中找出Stick

第二。要访问Stick内部的Coal,您需要在对应类中声明一个适当的变量。同样,将播放游戏所需的内容尽可能地靠近它们所操作的对象也很有意义。

package
{
    import flash.events.Event;
    import flash.display.MovieClip;

    public class MarshmallowStick extends MovieClip
    {
        // You don't seem to need a separate class for Coal.
        // Having it as a regular MovieClip will suffice.
        public var Coal:MovieClip;

        // Call this to play animation forward.
        public function playNormal():void
        {
            removeEventListener(Event.ENTER_FRAME, onReverse);

            gotoAndPlay(1);
            Coal.play();
        }

        // Call this to play animation backward.
        public function playReverse():void
        {
            Coal.stop();
            gotoAndPlay(1);

            addEventListener(Event.ENTER_FRAME, onReverse);
        }

        // This method does not need to be seen from the outside
        // so declare it as private rather than public.
        private function onReverse(e:Event):void
        {
            if (Coal.currentFrame > 1)
            {
                Coal.prevFrame();
            }
            else
            {
                playNormal();
            }
        }

        // Call this to stop playing into any direction.
        public function stopPlaying():void
        {
            stop();
            Coal.stop();

            removeEventListener(Event.ENTER_FRAME, onReverse);
        }
    }
}

第三。避免在函数内部声明函数。您可以阅读什么是闭包以及如何在AS3中处理它们,但是暂时(并且可能在可预见的将来)就不需要它们了。

package
{
    // Imports.

    public class Main extends MovieClip
    {
        public var Fire:SimpleButton;
        public var Stick:MarshmallowStick;

        public function Main()
        {
            Fire.addEventListener(MouseEvent.MOUSE_DOWN, makeHot);

            // The rest of the code.
        }

        function makeHot(e:MouseEvent):void
        {
            Stick.playNormal();
            trace("OK");
        }

第四。不要将按钮归类。创建一个简单的无类按钮并订阅它的MouseEvent.CLICKMouseEvent.MOUSE_DOWN事件就足以在某个知道该按钮用途的地方处理所有必要的动作。我已经在上面说了。封建等级制。 Button应该触发一个事件,然后其持有者应该捕获该事件并做出反应。按钮本身不应该知道它在哪里或目的是什么,甚至尝试做事的时间也更少。

© www.soinside.com 2019 - 2024. All rights reserved.