Как вы взаимодействуете со всеми экземплярами класса из отдельного класса?

В последнее время я зашёл в тупик во время программирования, и наконец-то понял, что весь код, который у меня есть, сломан, потому что я не знаю, как взаимодействовать с экземплярами одного класса из другого. Вот суть того, что я пытаюсь сделать:

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

Проблема в том, что если я обращаюсь к одному экземпляру, который находится на холсте, я получаю "доступ к неопределенному свойству targetClip", даже если класс документа может нормально с ним взаимодействовать. Если я нацеливаюсь на файл класса targetClip, я получаю "Неявное приведение значения типа Class к несвязанному типу flash.display:DisplayObject". Это не просто проблема с hitTest, у меня есть эта проблема с другими действиями, поэтому есть некоторый основной синтаксис, который я не могу понять. Пожалуйста, покажи мне, что мне не хватает.

2 ответа

Решение

Я не на 100% отвечаю на ваш вопрос, но я предполагаю, что то, что вы запрашиваете, - это способ вызова hitTestObject из любого одного экземпляра "ClassA" для всех экземпляров "ClassB", верно? Так что что-то вроде объекта Bullet проверяет, попал ли он в объект Player.

Если это действительно вопрос, то нет "глобального списка" всех экземпляров класса (о котором я знаю). Однако это не мешает вам делать это самостоятельно, используя статический вектор экземпляров класса. Будьте осторожны, так как это потребует немного большей очистки вашего кода, чем обычно. Вот краткий пример использования Bullets and Players.

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 для любого экземпляра Bullet проверит совпадение со всеми объектами Player, которые были созданы в данный момент.

Однако это приведет к утечкам памяти, если вы не очистите неиспользуемые проигрыватели, вызвав функцию free(), когда они больше не нужны (поскольку Vector сохраняет ссылку на экземпляр, которая не позволяет сборщику мусора очистить память, не говоря уже о том, что он может вернуть ложные попадания на мертвых игроков). Просто будьте осторожны, если вы используете шаблон, подобный этому, чтобы правильно очистить список, так как он довольно подвержен ошибкам.

Вы должны помнить, что отдельные классы ничего не знают друг о друге. Чтобы получить доступ к переменной (например, в классе A) из другого класса (класса B), вам нужно создать метод getter в классе B:

getVariable () {return variable;}

и вызовите этот метод из класса A, статически (B.getVariable()) или динамически (B bbb = new B(); bbb.getVariable();)

Классы вблизи явных указаний для доступа к информации, хранящейся в других классах

Другие вопросы по тегам