Предоставление каждому объекту, который имеет один и тот же класс, свои собственные индивидуальные переменные, которые не будут влиять на другие переменные.

Добрый вечер/утро.

Это вопрос, связанный с играми.

Я столкнулся с проблемой, когда у меня есть три объекта (три гоблина), данные которых относятся к одному и тому же классу.

Эти три объекта находятся в массиве, и данные типизированы для этого класса и инициализированы как массив.

    private var goblin1:Goblin = new Goblin();
    private var goblin2:Goblin = new Goblin();
    private var goblin3:Goblin = new Goblin();

Таким образом, указанные выше переменные были затем помещены в массив.

    private var aGoblinArray = new Array(container.goblin1, container.goblin2, container.goblin3);

Поместив объекты в массив, я перебрал всех своих гоблинов.

    for (var i:int = 0; i < aGoblinArray.length; i++)
    {
        var goblin:Goblin = aGoblinArray[i];
    }

теперь у меня есть hitTest в цикле for, а hitTest:

                if (goblin.hitTestPoint(_character.x + 100, _character.y - 45, true))
                {
                    goblinCanMove = false; 
                    trace("lance hits");
                    //hitOnce
                    if (!hitOnce)
                    {
                        hitOnce = true;
                        trace("take on damage");
                    }
                    goblin.moveBack();
                    goblin.minusHealth();
                }

Это означает, что если этот игрок ударит любого из гоблинов, он выполнит эту функцию.

Как всегда в классе гоблинов.

    public static var goblinLife; int;

    goblinLife = 2;//put in main constructor 

    public function minusHealth():void 
    {
        goblinLife --;
        checkDeath();
    }

    private function checkDeath():void 
    {
        if (goblinLife == 0)
        {
            parent.removeChild(this);
        }
    }

проблема в том, что если я ударю гоблина1, то жизнь гоблина будет = 1. Это означает, что у всех остальных гоблинов (гоблина 2 и 3) будет 1 жизнь. Так как они принадлежат к одному классу.

если goblin1 умирает, он удаляется, и var goblinLife будет = 0; Теперь я могу сбросить его обратно на 2, но это решит половину проблемы.

Мой вопрос в том, есть ли способ, как я могу убедиться, что у каждого гоблина есть собственная индивидуальная система жизни. Заранее спасибо.


person Moynul    schedule 10.04.2014    source источник
comment
Почему вы устанавливаете goblinLife как статическую переменную?   -  person Pan    schedule 10.04.2014
comment
это требует памяти, я поменяю это на частный вар, извините, Пан   -  person Moynul    schedule 10.04.2014
comment
@Pan уже касался этого, но причиной проблемы является тот факт, что ваш goblinLife является статическим. Отбросьте статическое ключевое слово.   -  person Marty    schedule 10.04.2014


Ответы (1)


Большое спасибо Пан и Марти!

Статический означает, что его можно изменить из любого класса и любой функции.

Частный означает, что он будет защищен для каждого отдельного гоблина.

От изменения

    public static var goblinLife; int;

to

    private var goblinLife; int;

это означает, что у каждого отдельного гоблина будет своя собственная переменная, которую не может изменить ни один другой класс или объект того же класса.

Спасибо Пан и Мартин. Думаю, мне нужно прочитать AS3 101: краткий совет — когда использовать статические свойства и Methods и другие книги по программированию!

person Moynul    schedule 10.04.2014
comment
Это почти верно. Вы все еще можете иметь свою переменную как public без статики и private со статикой. Вы хотите сказать, что static прикрепит свойство к классу, тогда как отсутствие статики прикрепит это свойство к экземпляру класса. - person Marty; 10.04.2014
comment
@Marty, да, спасибо :) Теперь я понимаю, static говорит о классе и тех экземплярах, которые разделяют класс. - person Moynul; 10.04.2014