Как вы взаимодействуете со всеми экземплярами класса из отдельного класса? - PullRequest
1 голос
/ 25 июля 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Я не на 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 () один раз.они больше не нужны (так как Вектор сохраняет ссылку на экземпляр, которая не позволяет сборщику мусора очистить память, не говоря уже о том, что он может возвращать ложные попадания мертвым игрокам).Просто будьте осторожны, если вы используете шаблон, подобный этому, для правильной очистки списка, поскольку он довольно подвержен ошибкам.

0 голосов
/ 25 июля 2011

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

getVariable () {возвращаемая переменная;}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...