【问题标题】:AS3 creating new instances from blueprintsAS3 从蓝图创建新实例
【发布时间】:2026-01-23 16:40:04
【问题描述】:

我正在学习课程的运作方式,这非常复杂。我需要一个正确创建对象的示例。假设我的库中有一个 MovieClip 蓝图。它可以用作创建许多实例的示例,这些实例的名称可以进一步用作代码中的对象以更改其属性。所以假装我有一个蓝图“AppleBP”。我将它设置为 Apple 类(假设它创建了一个文件 Apple.as?)。我需要一个代码来创建(例如通过按下按钮)一个实例 Apple01,它会出现在屏幕上的随机位置(只是为了知道它与其他位置不同,我知道如何随机化位置)。然后制作 Apple02、Apple03、Apple04 和 Apple05。如果很难将名称设置为“Apple”+ N,则可以坚持使用带有名称的数组,或者至少选择 if(N = 1){//code for Apple01 creation} 然后 N++ 等。

所以现在我尝试了

var Apple01:Apple = new Apple();
Apple01.visible = true; //just in case I can't see it
Apple01.x = 100;
Apple01.y = 100;
TextField01.text = "blahblah"; //to see if code actually works

Apple 不会出现,文本会出现。那么,如果创建一个作为 MovieClip 蓝图的新类还不够,我还缺少什么?以及如何为每个新实例选择新名称,以便它具有变量 String 而不是纯名称? (这样我就可以根据它的顺序将名称更改为文本+数字)

添加:

package  {
import flash.display.Scene;
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.KeyboardEvent;
import flash.events.Event;
import flash.events.*;
import flash.display.*;

public class MyFirstClass extends MovieClip{ 

        //var N:int;
        var n:int;
        var existingApples:int = 0;
        var apples:Array = new Array();     

    public function MyFirstClass():void{
        MakeNewApple();
        MakeNewApple();
        MakeNewApple();
        MakeNewApple();
        MakeNewApple();

        //apple4.x = 5;
        //apple4.y = 5;

        var draggableApple:Apple = apples[0] ;
        draggableApple.addEventListener(MouseEvent.MOUSE_DOWN, draggableApple.onMouseDown) ;
        draggableApple.addEventListener(MouseEvent.MOUSE_UP, draggableApple.onMouseUp) ;
        info01.text = "Did it";
    }
    public function MakeNewApple():void{
        if(existingApples < 5){
        n = existingApples;
        var apple:Apple = new Apple();
        stage.addChild(apple);
        apple.x = (Math.random()*600+100);
        apple.y = (Math.random()*400+100);
        apple.name = "apple" + n;

        apples.push(apple.name);
        existingApples++;
        trace(existingApples);
        trace(apples);
        }
    }
}
}

Apple.as:

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

public class Apple extends MovieClip{

    public function Apple() {

    }

    public function onMouseDown(e:MouseEvent):void{
        this.startDrag();
    }
    public function onMouseUp(e:MouseEvent):void{
        this.stopDrag();

    }
}
}

【问题讨论】:

  • 您需要执行 addChild(Apple01) 才能显示它。因此,首先通过 new Apple() 创建一个实例,然后使用 addChild(Apple01) 将其添加到显示列表(舞台上的对象)。

标签: actionscript-3 class


【解决方案1】:

下面是注释示例:

package 
{
    import flash.display.Scene;
    import flash.display.Sprite;
    import flash.events.MouseEvent;

    public class Main extends Sprite 
    {

        public function Main():void {   

            var apples:Array = new Array() ; // Declare and array
            for (var i:int = 0 ; i < 10 ; i++) { //Let's make 10 apples
                var apple:Apple = new Apple() ; //Create an apple
                apple.x = Math.ceil(Math.random() * stage.stageWidth)  ; //Assign random x
                apple.y = Math.ceil(Math.random() * stage.stageHeight) ; //Assign random y
                stage.addChild(apple) ; //Add it to stage, so we can see them
                apples.push(apple) ; //Push into array
            }
            //EDITED
            var draggableApple:Apple = apples[0] ;
            draggableApple.addEventListener(MouseEvent.MOUSE_DOWN, draggableApple.onMouseDown) ;
            draggableApple.addEventListener(MouseEvent.MOUSE_UP, draggableApple.onMouseUp) ;

        }

    }

}

还有 Apple.as

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

public class Apple extends MovieClip {

    public function Apple() {
        this.graphics.lineStyle(2) ;
        this.graphics.beginFill(0x00FF40) ;
        this.graphics.drawCircle(0, 0, 20) ;
        this.graphics.endFill() ;

        //addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown) ;
        //addEventListener(MouseEvent.MOUSE_UP, onMouseUp) ;
    }

    public function onMouseDown(event:MouseEvent):void {
        this.startDrag() ;
    }

    public function onMouseUp(event:MouseEvent):void {
        this.stopDrag() ;
    }
}
}
  • 此外,所有变量的名称必须以小写字母开头。我的变量
  • 类的名称必须实现 CamelCaseClass
  • 常量名称只包含大写字母和下划线。 MY_CONSTANT

【讨论】:

  • 感谢您的回答。那时我需要 addChild。那么剩下的呢?你画了一个 Sprite,我有一个现有的蓝图(符号)类型 MovieClip AppleBP,我将它设置为 Apple 类。暂时是空的。我的苹果出现了,但我不能对其应用东西,例如不能拖动它。它只是说“苹果”是身份不明的,即使我刚刚创建了它。而且,这很奇怪,因为我刚刚设置了 apple.x 和 apple.y,但它不会看到 apple.addEventListener 和他的函数。
  • 还有关于名字的。那么如何让它使用 10 个不同的名称并将函数应用于其中的任何一个?就像将 addEventListener(MouseEvent.MOUSE_DOWN,drag01) 应用到舞台上的任何 Apple 类实例一样?
  • @SherWood 更新了一些代码。仅使第一个苹果 (apples[0]) 可拖动。这就是您从数组中访问元素并执行所需操作的方式。希望对您有所帮助。
  • 嗯,你知道,它仍然讨厌我。说 addEventListener 行中的苹果是未定义的属性...如果我尝试在函数内部创建数组,它说的也是一样的,所以我必须在类主体中创建数组。你的有用吗?
  • piratepad上写下你的代码,然后把链接贴给我,我去看看:)