Arrays Actionscript 3事件监听器、hittestobject和自定义对象数组

Arrays Actionscript 3事件监听器、hittestobject和自定义对象数组,arrays,actionscript-3,target,Arrays,Actionscript 3,Target,另一个一年级的学生在这里被困得死去活来。我必须使用FlashCS作为我的编码环境。而且很糟糕。因此,我将尝试一些构造良好且清晰的问题。有: public var object: symbol1; public var objectarray: Array = new Array(); 在我看来。然后是一个函数,它使用计时器生成一个新对象并将其推送到阵列上: object = new symbol1; objectarray.push(object) 但是当Itrace()数组的.length

另一个一年级的学生在这里被困得死去活来。我必须使用FlashCS作为我的编码环境。而且很糟糕。因此,我将尝试一些构造良好且清晰的问题。有:

public var object: symbol1;
public var objectarray: Array = new Array();
在我看来。然后是一个函数,它使用计时器生成一个新对象并将其推送到阵列上:

object = new symbol1;
objectarray.push(object)
但是当Itrace()数组的.length时,它会在输出中的每个计时器周期显示两个数组长度数字。例如:

1233

这是我的第一个谜团。为什么两个不是一个?因为我无法调用包含跟踪()的函数两次。此外,我认为我需要能够在objectarray退出舞台时将我的对象从中移除,但是如果我在函数中这样使用objectarray.pop()似乎不起作用:

if (object.y == stage.stageHeight)
objectarray.pop()
正如在中一样,我尝试在.pop()之前和之后使用trace()数组.length
,但它只是在每个计时器周期内不断增加一个。 另一个更大的问题是,我想知道是否允许您将通常放在任何类的主函数正下方的.addEventListeners放入语句循环中。就像我的

class extends Main {
class function() {
for (var i:Number = 0; i < objectarray.length; i++){
objectarray[i].addEventListener(Event.ENTER_FRAME, collision);}}
所以我搜索并最终添加了一个

var clip:MovieClip = MovieClip(e.target);
在函数的第一行,但后来它不起作用了,我意识到我不明白它要做什么,发生了什么,这个角色的语法是什么。 非常感谢你。 编辑/更新:添加更多我的代码,尽管我讨厌像这样复制粘贴代码。这是一个符号类,当另一个类的对象击中它时,它将发生变化

 public class Head extends Main {

        public function Head(){
            this.stop();
            for (var i:Number = 0; i < nicesnowflakearray.length; i++){
                nicesnowflakearray[i].addEventListener(Event.ENTER_FRAME, snowhit);
            }
        }

        public function snowhit(event:Event) : void {
            if (this.hitTestObject(nicesnowflake)){ 
//I changed this line to (e.currentTarget.hitTestObject(nicesnowflake)) as Atriace suggested, but nothing changed, and I just don't understand why my version wouldn't work.
                trace("hit");
            }
        }
为什么是两个,不是一个? 任何时候扩展另一个类,它都会隐式调用父类的构造函数。我们知道这是一个非常方便的方法。这就是为什么你的跟踪语句会加倍。技术上

.pop() 从该数组中删除最后一个元素,但是,我认为如果任意对象离开舞台,你不可能忘记它将是最后一个元素。因此,你想要什么

事件侦听器 我没有理解你的困惑,所以我将尝试重写我认为你试图做的事情

package {
    import flash.display.MovieClip;

    public class Main extends MovieClip {
        private var objectarray:Array = []; // Note, I haven't populated it with anything, I'm assuming you have.
        private var theWall:MovieClip = new MovieClip(); // I haven't added this to the stage, or given it shape. You need to for hitTestObject to work.

        public function Main() {
            // This is your constructor.
            for (var i:Number = 0; i < objectarray.length; i++) {
                objectarray[i].addEventListener(Event.ENTER_FRAME, collision);
            }
        }

        private function collision(e:Event):void {
            if (e.currentTarget.hitTestObject(theWall)) {
                trace('hit');
            }
        }
    }
}
包{
导入flash.display.MovieClip;
公共类Main扩展了MovieClip{
private-var-objectarray:Array=[];//注意,我没有用任何东西填充它,我假设您已经填充了。
private var theWall:MovieClip=new MovieClip();//我还没有将它添加到舞台上,也没有赋予它一定的形状。要让hitTestObject工作,您需要这样做。
公共功能Main(){
//这是您的构造函数。
for(变量i:Number=0;i

需要注意的是,您可能想看一本指南,了解它是否给您带来了问题。

非常感谢您的回答,但我想我只是不明白,如果我可以使用我在flash中从图形创建的类来使用
hittestobject()
。如果它出现在屏幕上,不是会自动添加到舞台上吗?或者我也必须在代码中添加它才能工作吗?把你的类想象成一个容器(就像任何其他MovieClip一样)。如果您向其添加内容,然后将该类添加到舞台,则它是可见的。但是,即使将子元素作为类的父元素,如果该类不在舞台上,它也不可见。我会看一看你修改过的代码(快吃午饭了)。所有这些信息和建议让我忙了一段时间。虽然我不得不去上班,但现在我有了一些更精确的问题。希望你还在那里。首先,在我的**child**类中将**super()**调用放入一个不可能的语句并没有改变任何事情。我现在唯一的代码是
public class Head扩展Main{public function Head(){if(false){super();}}this.stop();}}}}}}}`我需要它作为一个单独的类,因为它与角色分开设置动画。除非我对FlashCS6一无所知,这是完全可能的。还有一件事就是填充数组。两个问题仍然存在,因为我似乎无法摆脱子类中的隐式实例化,但如果我摆脱了函数中的实例化,那么子类中甚至不会有任何可复制的内容。但是,当我跟踪()动态对象数组nicesnowflake数组的.length时,它只执行跟踪()两次,而不执行nicesnowflake数组.push(nicesnowflake)如果构造函数复制了代码,为什么它只向数组添加一次,而跟踪两次?
public class Main extends MovieClip {
        public var nicesnowflake: fallingsnow;
        var nicesnowflakespawntimer: Timer = new Timer(1000);
        public var nicesnowflakearray: Array = new Array(); 
        public function Main() {
            nicesnowflakespawntimer.addEventListener(TimerEvent.TIMER, nicesnowflakespawn);
            nicesnowflakespawntimer.start();
        }

        public function nicesnowflakespawn(event:TimerEvent) : void {
            nicesnowflake = new fallingsnow;
            nicesnowflake.x = Math.random()* stage.stageWidth;
            nicesnowflake.y = - stage.stageHeight + 100;
            nicesnowflakearray.push(nicesnowflake);
            stage.addChild(nicesnowflake);
            trace(nicesnowflakearray.length);
        }
if (object.y == stage.stageHeight) {
    objectarray.splice(objectarray.indexOf(object), 1)
}
package {
    import flash.display.MovieClip;

    public class Main extends MovieClip {
        private var objectarray:Array = []; // Note, I haven't populated it with anything, I'm assuming you have.
        private var theWall:MovieClip = new MovieClip(); // I haven't added this to the stage, or given it shape. You need to for hitTestObject to work.

        public function Main() {
            // This is your constructor.
            for (var i:Number = 0; i < objectarray.length; i++) {
                objectarray[i].addEventListener(Event.ENTER_FRAME, collision);
            }
        }

        private function collision(e:Event):void {
            if (e.currentTarget.hitTestObject(theWall)) {
                trace('hit');
            }
        }
    }
}