0

我正在开始一个在 FlashDevelop 中 100% 完成的新项目,它是一个 AS3 项目。澄清一下,我在任何时候都不会在 Adob​​e Flash 中创建 FLA。永远不会使用 Adob​​e Flash。

在我的 AS3 项目的文档类中,我需要创建和引用在单独的 .as 类文件中设置的影片剪辑。文档类将具有事件监听器,用于监视键盘按下并在需要时移动影片剪辑。当影片剪辑被设置并从文档类添加到舞台时,通过键盘输入的移动工作正常。但是,当从单独的类设置影片剪辑时,我遇到了问题。

除了我正在处理的项目之外,我还创建了一个示例项目,为这个 Stack Overflow 问题运行三个测试。该示例项目包含三个文件,它们都存储在同一文件夹中:Main.as(文档类)、createSquare.as(创建方形 MC)和 createCircle.as(创建圆形 MC)。

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

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

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

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

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

感谢您的任何帮助。三个测试文件的源代码如下。

主文件

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);
        }

    }

}

createSquare.as

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);

        }

    }

}

创建圈子.as

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);

        }
    }

}
4

1 回答 1

1

我猜你应该更多地使用 actionscript 中的显示列表来习惯操纵显示对象(addChild/removeChild/nesting/etc.)

您创建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 个剪辑嵌套到单独的 Sprite/MovieClip 中,您可以这样做:

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);
        }

    }

}

(我没有测试过上面的代码,所以可能有语法错误,但它应该清楚地说明这个想法)。

另外两个旁注:

  1. MovieClip是一个动态类,它比像Sprite这样的简单类要慢。除非您使用的是时间线(并且您的项目看起来不像),否则我建议您改用 Sprite。对于一个简单的项目,它不会对性能产生太大影响,但从长远来看(对于更复杂的项目),节省资源会更安全。
  2. 我想你的 createCircle 和 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 中嵌套元素,您可以使用非常基本的Shape ,尽管您可能会发现 Sprite 更灵活。另请注意,我已将类命名为 Square。类名以大写字母开头(例如 Sprite/MovieClip/etc.)、属性和方法以小写字母开头(例如 x/alpha/etc.)、常量全部大写(例如 KEY_DOWN、CLICK、等等)等等。按照这个约定,createSquare 听起来更像是一个函数名,而不是一个类。您没有义务遵守约定,但它可能会让其他人在未来更容易轻松地扫描您的代码。主要思想是保持一致。

于 2012-09-21T10:55:28.770 回答