你如何从一个单独的类中与一个类的所有实例进行交互?

时间:2011-07-25 01:58:40

标签: flash actionscript-3 actionscript

我最近在编程时遇到了死胡同,我终于实现了所有破坏的代码,因为我不知道如何与另一个类的实例进行交互。以下是我要做的事情的要点:

        if(this.hitTestObject(targetClip)){
           trace("hit!");
           }

问题是,如果我解决画布上的单个实例,我会“访问未定义的属性targetClip”,即使文档类可以很好地与它交互。如果我定位targetClip的类文件,我会得到“类型Class的值的隐式强制到不相关的类型flash.display:DisplayObject”。这也不仅仅是hitTest的一个问题,我对其他动作有这个问题,所以有一些我无法理解的基本语法。请告诉我我缺少的东西。

2 个答案:

答案 0 :(得分:1)

我不是100%的问题,但我会假设您要求的是在“ClassB”的所有实例上从“ClassA”的任何一个实例调用hitTestObject的方法吗?所以像Bullet对象检查它是否击中任何Player对象。

如果确实是这个问题,那么所有类的实例(我都知道)都没有“全局列表”。但是,这并不能阻止您通过使用类实例的静态向量来自己完成。请注意,因为这需要比正常情况更多的清理代码。以下是使用项目符号和玩家的简单示例。

class Bullet extends Sprite //or w/e it is your objects extend
{
    public Bullet()
    {
    }

    public function checkCollisionsWithPlayers() : void
    {
        for(var i : int = 0; i < Player.AllPlayers.length; ++i)
        {
            var player : Player = Player.AllPlayers[i];
            if(this.hitTestObject(player))
            {
                trace("hit!");
            }
        }
    }
}

class Player extends Sprite
{
    static public const AllPlayers : Vector.<Player> = new Vector.<Player>();

    public Player()
    {
        AllPlayers.push(this);
    }

    //remove unused Players from the AllPlayers list
    public function free() : void
    {
        var index : int = AllPlayers.indexOf(this);
        if(index >= 0)
        {
            AllPlayers.splice(index, 1);
        }
    }
}

这允许您拥有所有已创建的玩家的列表。在子弹的任何实例上调用checkCollisionsWithPlayers函数将检查所有当前实例化的Player对象的命中。

但是,如果你不再使用free()函数来调用free()函数,那么这会造成内存泄漏(因为Vector会在不允许垃圾收集器的实例上保留引用)清理记忆,更不用说它可能会给死去的玩家带来虚假命中)。如果你使用像这样的模式来正确清理列表,请小心,因为它很容易出错。

答案 1 :(得分:0)

你需要记住,不同的课程彼此之间并不了解。要从另一个类(B类)访问变量(例如,在A类中),您需要在B类中创建一个'getter'方法:

getVariable(){return variable;}

并从A类调用该方法,静态(B.getVariable())或动态(B bbb = new B(); bbb.getVariable();)

接近明确指示的类,以便访问其他类中保存的信息