Actionscript 3 FlashDevelopas3项目:添加其他类中不可见的子类;键盘输入不';我不能用视觉移动孩子

Actionscript 3 FlashDevelopas3项目:添加其他类中不可见的子类;键盘输入不';我不能用视觉移动孩子,actionscript-3,Actionscript 3,我正在启动一个新项目,该项目100%在FlashDevelop中作为AS3项目完成。澄清一下,我在任何时候都不会在Adobe Flash中创建FLA;Adobe Flash永远不会被使用 在我的AS3项目的document类中,我需要创建和引用在单独的.as类文件中设置的movieclips。document类将具有EventListener,用于监视键盘按下并在需要时移动movieclips。当movieclip被设置并从document类添加到stage时,通过键盘输入的移动工作正常。然而,

我正在启动一个新项目,该项目100%在FlashDevelop中作为AS3项目完成。澄清一下,我在任何时候都不会在Adobe Flash中创建FLA;Adobe Flash永远不会被使用

在我的AS3项目的document类中,我需要创建和引用在单独的.as类文件中设置的movieclips。document类将具有EventListener,用于监视键盘按下并在需要时移动movieclips。当movieclip被设置并从document类添加到stage时,通过键盘输入的移动工作正常。然而,当movieclip从一个单独的类设置时,我会遇到问题

除了我正在进行的项目外,我还创建了一个示例项目,该项目针对这个堆栈溢出问题运行了三个测试。此示例项目包含三个文件,它们都存储在同一文件夹中:Main.as(文档类)、createSquare.as(创建square MC)和createCircle.as(创建circle MC)

测试#1(蓝色矩形):在Main.com中,我创建了一个名为charRectangle的新MC。在此处定义尺寸、尺寸、颜色等,然后将其添加到舞台。执行函数keyIsDown()时,蓝色矩形在舞台上正确向左或向右移动。这是一次成功的测试

测试#2(绿色方块):现在我测试从单独的类文件创建movieclip。在Main.as中,我创建了一个名为charSquare的新变量,并将其定义为一个新的createSquare()。createSquare.as定义特征并将子级添加到阶段。问题:项目测试时,舞台上看不到绿色广场;但是,跟踪输出显示,左箭头键和右箭头键实际上正在更新charSquare的X位置。我该如何制作这部电影唇秀?我的解决方案是

测试#3(黄色圆圈):我对黄色圆圈的启动方式与对绿色正方形的启动方式相同。我们将这一个命名为charCircle。在Main.as中将变量定义为新的charCircle()时,我将单词“this”传递给createCircle.as中的函数。这又告诉函数createCircle将子对象添加到“This”中,即舞台上的父MC。现在我们可以看到一个可见的形状。问题:跟踪输出显示左右箭头键正在更新X位置,但黄色圆圈不移动。如何移动此电影剪辑

主要目标:我希望避免在Main.as中声明角色形状的所有属性,并将其与其他类文件隔离。在Main.as中,我只想创建一个新变量,将其定义为一个新的createSquare()/createCircle(),然后使用Main.as中的键盘函数来处理移动。后来,我将在第四个测试类keyboardControls.as中保留键盘控件

当我从Adobe Flash中的FLA开始,说明文档类,在舞台上创建MC符号,给它们一个实例名,然后在FlashDevelop中处理AS文件时,我可以解决这些问题。但同样,这个项目要求我省略Adobe Flash/FLA,所以这不是我正在寻找的解决方案。。我需要在FlashDevelop AS3中创建100%动态

谢谢你的一切帮助。下面是三个测试文件的源代码

Main.as

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

    public class Main extends MovieClip {

        private var charRectangle:MovieClip;
        private var charSquare:createSquare;
        private var charCircle:createCircle;

        public function Main() {

            trace("Function: Main() has started.");

            // Create rectangle character right here
            charRectangle = new MovieClip();
            charRectangle.graphics.beginFill(0x0000FF);
            charRectangle.graphics.drawRect(200,20,250,100);
            charRectangle.graphics.endFill();
            stage.addChild(charRectangle);

            // Create square character from class
            charSquare = new createSquare();

            // Create square character from class
            charCircle = new createCircle(this);

            // Event listener for user input
            stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
        }

        private function keyIsDown(e:KeyboardEvent):void {
            // Left arrow key actions
            if (e.keyCode == 37) {
                charRectangle.x -= 5;
                charSquare.x -= 5;
                charCircle.x -= 5;
            }
            // Right arrow key actions
            if (e.keyCode == 39) {
                charRectangle.x += 5;
                charSquare.x += 5;
                charCircle.x += 5;
            }
            trace("charRectangle.x = " + charRectangle.x + ", charSquare.x = " + charSquare.x + ", charCircle.x = " + charCircle.x);
        }

    }

}
package {

    import flash.display.MovieClip;

    public class createSquare extends MovieClip {

        private var square:MovieClip;

        public function createSquare() {

            trace("Function: createSquare() has started.");

            square = new MovieClip();
            square.graphics.beginFill(0xFF0000);
            square.graphics.drawRect(200,140,100,100);
            square.graphics.endFill();
            addChild(square);

        }

    }

}
package {

    import flash.display.MovieClip;

    public class createCircle extends MovieClip {

        private var circle:MovieClip;

        public function createCircle(parentMC:MovieClip) {

            trace("Function: createCircle() has started.");

            circle = new MovieClip();
            circle.graphics.beginFill(0x00FF00);
            circle.graphics.drawCircle(200,350,75);
            circle.graphics.endFill();
            parentMC.addChild(circle);

        }
    }

}
createSquare.as

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

    public class Main extends MovieClip {

        private var charRectangle:MovieClip;
        private var charSquare:createSquare;
        private var charCircle:createCircle;

        public function Main() {

            trace("Function: Main() has started.");

            // Create rectangle character right here
            charRectangle = new MovieClip();
            charRectangle.graphics.beginFill(0x0000FF);
            charRectangle.graphics.drawRect(200,20,250,100);
            charRectangle.graphics.endFill();
            stage.addChild(charRectangle);

            // Create square character from class
            charSquare = new createSquare();

            // Create square character from class
            charCircle = new createCircle(this);

            // Event listener for user input
            stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
        }

        private function keyIsDown(e:KeyboardEvent):void {
            // Left arrow key actions
            if (e.keyCode == 37) {
                charRectangle.x -= 5;
                charSquare.x -= 5;
                charCircle.x -= 5;
            }
            // Right arrow key actions
            if (e.keyCode == 39) {
                charRectangle.x += 5;
                charSquare.x += 5;
                charCircle.x += 5;
            }
            trace("charRectangle.x = " + charRectangle.x + ", charSquare.x = " + charSquare.x + ", charCircle.x = " + charCircle.x);
        }

    }

}
package {

    import flash.display.MovieClip;

    public class createSquare extends MovieClip {

        private var square:MovieClip;

        public function createSquare() {

            trace("Function: createSquare() has started.");

            square = new MovieClip();
            square.graphics.beginFill(0xFF0000);
            square.graphics.drawRect(200,140,100,100);
            square.graphics.endFill();
            addChild(square);

        }

    }

}
package {

    import flash.display.MovieClip;

    public class createCircle extends MovieClip {

        private var circle:MovieClip;

        public function createCircle(parentMC:MovieClip) {

            trace("Function: createCircle() has started.");

            circle = new MovieClip();
            circle.graphics.beginFill(0x00FF00);
            circle.graphics.drawCircle(200,350,75);
            circle.graphics.endFill();
            parentMC.addChild(circle);

        }
    }

}
createCircle.as

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

    public class Main extends MovieClip {

        private var charRectangle:MovieClip;
        private var charSquare:createSquare;
        private var charCircle:createCircle;

        public function Main() {

            trace("Function: Main() has started.");

            // Create rectangle character right here
            charRectangle = new MovieClip();
            charRectangle.graphics.beginFill(0x0000FF);
            charRectangle.graphics.drawRect(200,20,250,100);
            charRectangle.graphics.endFill();
            stage.addChild(charRectangle);

            // Create square character from class
            charSquare = new createSquare();

            // Create square character from class
            charCircle = new createCircle(this);

            // Event listener for user input
            stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
        }

        private function keyIsDown(e:KeyboardEvent):void {
            // Left arrow key actions
            if (e.keyCode == 37) {
                charRectangle.x -= 5;
                charSquare.x -= 5;
                charCircle.x -= 5;
            }
            // Right arrow key actions
            if (e.keyCode == 39) {
                charRectangle.x += 5;
                charSquare.x += 5;
                charCircle.x += 5;
            }
            trace("charRectangle.x = " + charRectangle.x + ", charSquare.x = " + charSquare.x + ", charCircle.x = " + charCircle.x);
        }

    }

}
package {

    import flash.display.MovieClip;

    public class createSquare extends MovieClip {

        private var square:MovieClip;

        public function createSquare() {

            trace("Function: createSquare() has started.");

            square = new MovieClip();
            square.graphics.beginFill(0xFF0000);
            square.graphics.drawRect(200,140,100,100);
            square.graphics.endFill();
            addChild(square);

        }

    }

}
package {

    import flash.display.MovieClip;

    public class createCircle extends MovieClip {

        private var circle:MovieClip;

        public function createCircle(parentMC:MovieClip) {

            trace("Function: createCircle() has started.");

            circle = new MovieClip();
            circle.graphics.beginFill(0x00FF00);
            circle.graphics.drawCircle(200,350,75);
            circle.graphics.endFill();
            parentMC.addChild(circle);

        }
    }

}

我猜您应该更多地使用actionscript中的显示列表,以适应被操纵的显示对象(addChild/removeChild/nesting/等等)

您可以创建
charRectangle
,并将其添加到后台,以便查看。 您可以像这样初始化
charCircle

charCircle = new createCircle(this);
在内部,您将其添加到Main(在构造函数中传递),上面的两个剪辑也会显示出来。您创建的
charSquare
不是这种情况(因此可以在跟踪中看到它),但您不会将其添加到显示列表中。 试试这个:

// Create square character from class
charSquare = new createSquare();
// add it to the display list
addChild(charSquare)
此外,您还提到您希望一次移动所有剪辑,如果您只需将所有3个剪辑嵌套到一个单独的精灵/电影剪辑中即可:

package {
    import flash.display.Sprite;
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    public class Main extends MovieClip {

        private var char:Sprite;

        public function Main() {

            trace("Function: Main() has started.");

            char = new Sprite();
            addChild(char);

            // Create rectangle character right here
            var charRectangle:MovieClip = new MovieClip();
            charRectangle.graphics.beginFill(0x0000FF);
            charRectangle.graphics.drawRect(200,20,250,100);
            charRectangle.graphics.endFill();
            char.addChild(charRectangle);

            // Create square character from class
            var charSquare:MovieClip = new createSquare();
            char.addChild(charSquare);
            // Create square character from class
            charCircle = new createCircle(char);

            // Event listener for user input
            stage.addEventListener(KeyboardEvent.KEY_DOWN,keyIsDown);
        }

        private function keyIsDown(e:KeyboardEvent):void {
            if(e.keyCode == Keyboard.LEFT)  char.x -= 5;
            if(e.keyCode == Keyboard.RIGHT) char.x += 5;
            trace("char position",char.x,char.y);
        }

    }

}
(我还没有测试上面的代码,所以可能有语法错误,但它应该清楚地说明这一点)

另外两个旁注:

  • 是一个动态类,它比更简单的类(如)慢。除非您使用的是时间线(而且您的项目看起来不会),否则我建议您改用Sprite。对于一个简单的项目,它不会对性能产生太大影响,但从长远来看(对于更复杂的项目),节省资源更安全
  • 我想象您的CreateColution和createSquare类将发生变化并变得更复杂,但如果它们保持现在的状态,它们可能会更简单:

    包装{

    import flash.display.Sprite;
    
    public class Square extends Sprite {
    
    
        public function Square() {
    
            trace(this);
    
            graphics.beginFill(0xFF0000);
            graphics.drawRect(200,140,100,100);
            graphics.endFill();
    
        }
    
    }
    
    }

  • 如果不需要在createSquare或createCircle中嵌套元素,可以使用非常基本的,尽管您可能会发现Sprite更灵活。还请注意,我将类命名为Square。以大写字母(如Sprite/MovieClip等)开头类名、以小写字母(如x/alpha等)开头属性和方法、以大写字母开头的常量(如按下键、单击等)等是一种惯例。 按照这种约定,createSquare听起来更像一个函数名,而不是一个类。
    您不必遵循约定,但这可能会使其他人在将来更容易扫描您的代码。主要的想法是保持一致。

    非常好的建议。您的第二块代码在document类中声明为“addChild(charSquare);”,这就是我正在寻找的解决方案。简化Square类的最后一块代码也很有用。关于MC vs Sprite/shapes的性能提示以及命名事物的形式也很有帮助。注意:我不想让所有字符同时移动/使用相同的键。我只是让他们做出反应