Actionscript 3 eventlisteners,hittestobject和自定义对象数组

时间:2014-01-14 13:47:55

标签: arrays actionscript-3 target

另一个拼命地困住一年级学生。我必须使用FlashCS作为我的编码环境。它很糟糕。所以我会尝试一些构造良好且清晰的问题。有:

public var object: symbol1;
public var objectarray: Array = new Array();

在我的主要。然后是一个函数,它使用一个计时器并生成一个新对象并将其推送到数组上:

object = new symbol1;
objectarray.push(object)

但是当我 trace()数组的 .length 时,它会在输出中的每个定时器周期显示两个数组的数组长度。如:

  

1 1 2 2 3 3

等。这是我的第一个谜。为什么两个不是一个?因为我无法两次调用包含 trace()的函数。此外,我认为我需要能够从 objectarray 中删除对象,当它离开舞台时, objectarray.pop()如果我在函数中使用它似乎不起作用:

if (object.y == stage.stageHeight)
objectarray.pop()

正如我在 .pop()之前和之后尝试 trace() array.length 一样,但它一直在上升每个计时器周期一个。 另一个更大的问题是我想知道你是否允许将你通常放在任何类的main函数下的 .addEventListeners 放到一个语句循环中。就像在我有

class extends Main {
class function() {
for (var i:Number = 0; i < objectarray.length; i++){
objectarray[i].addEventListener(Event.ENTER_FRAME, collision);}}

然后,如果允许的话,程序似乎似乎没有进入同一类的碰撞功能。

function collision (event:Event) : void{
if (this.hitTestObject(object)){
trace('hit');}}

所以我搜索并最终添加了

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

这是产生应该击中Head对象的对象的类:

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

1 个答案:

答案 0 :(得分:1)

为什么是两个,而不是一个?

无论何时扩展另一个类,它都会隐式调用父类&#39;构造函数。我们知道这是super(),并且非常方便。这就是您在跟踪声明中获得双打的原因。从技术上讲,you can choose not to call super()

.pop()

It should删除该数组中的最后一个元素,但是,我认为如果一个任意对象离开舞台,你就无法保证它是最后一个元素。你想要splice()

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

值得注意的是,如果它向您提供问题,您可能需要查看hitTestObject()指南。