Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   О классах и их образцах (http://www.flasher.ru/forum/showthread.php?t=97360)

Amra Kimmerian 19.06.2007 19:32

О классах и их образцах
 
Здравствуйте. Пора настала и ООП изучать, посмотрел (уже по привычке) FAQ, поиск, на разных сайтах побывал, поскачивал уроки и их поизучал, ну и хелп конечно. Прояснилось для меня мало. Исходники и уже созданные классы - что мертвому припарки, если их не знать самому досканально. Что то вроде "создадим класс Car" - это конечно поначалу интересно, но как то не жизненно ориентированно. Очень уважаю всех, кто пишет уроки, ответы и прочие пособия, но, например, для меня данный урок что то вроде "Вам нужно слетать на Луну? Создадим Ракету!". Мне не надо на Луну. Мне, к примеру, нужно "Сварить кофе". А "Ракета", созданная для этого не хочет его варить. Поэтому все же буду у Вас спрашивать, "как открыть банку, где взять ложку и сколько нужно воды."
Это сравнение, а теперь к фактам. Мне нужно к присоединенному из библиотеки клипу "присоединить" еще один метод. К примеру myClip.getDepth() - это метод класса MovieClip. Мне вот волею судеб понадобилось создать метод getLighting() - который будет рисовать внутри клипа молнию. Математический аппарат для отображения молнии я уже разработал и внедрил его во флэш, получилось очень красиво и довольно динамично. Т.е. как бы так сделать чтобы к любому нужному клипу в нужное время применяю этот метод и по размеру клипа начинает бить разные молнии.
Конечно сразу появилась мысль сделать это посредством класса, точнее расширением класса MovieClip, и тут началось. При создании молнии без класса использовались и setInterval() и массивы и функции.
Начал перегонять в класс все это и (естественно) столкнулся с проблемами. Вот код (я все лишнее и пока здесь не нужное убрал):

Код:

class Lighting extends MovieClip {
    private var _anchorPointXdiffMax:Array;
    private var _myNumber:Number;
    private function Lighting() {
    }
    function getLighting(timeL:Number, pauseL:Number) {
        _myNumber = 10;
        trace(_myNumber)
        _anchorPointXdiffMax[0]=15;
        trace(_anchorPointXdiffMax[0])
    }
}

Использую класс так:
Код:

import Lighting;
stop();
_root.attachMovie("lightingCont", "mc", 1);
var timeL:Number = 2000;
var pauseL:Number = 1000;
mc.getLighting(timeL, pauseL);

Конечно в параметрах Linkage для мувиклипа lightingCont указал класс Lighting.
1. Самый явный вопрос. trace(_myNumber) выдает 10, а trace(_anchorPointXdiffMax[0]) выдает undefined. Ведь инициализация одинаковая, применение тоже, почему так?
2. Если к примеру сторку private var _myNumber:Number; убрать а вместо нее в методе getLighting написать var _myNumber:Number; то тоже выдает 10, в чем же тогда разница? Зачем мне объявлять переменные класса, если их можно объявить внутри метода класса. По моему сложившемуся мнению переменные класса нужны как величины, которые может использовать любой из методов внутри класса. Но вот только сел, а уж с массивами уже не лады.
3. Вытекает из 2. Нужно ли мне вообще использвать расширение класса для обеспечения такой функциональности или это целесообразней сделать вне класса, просто как метод. Можно ли так сделать вообще и если можно то в какую сторону двигаться?
4. У меня пустой конструктор класса. Вероятно для избежания ошибок нужно было как нибудь (не смейтесь пожалуйста :) ) его использовать, но просто переприсваивание переменных... я не понял честно говоря.

Насколько смог, изложил. Помогите пожалуйста.

iNils 19.06.2007 19:51

1. Объявить _anchorPointXdiffMax типом данных как массив вы объявили, но сам массив при этом не создали.
Код:

private function Lighting() {
        _anchorPointXdiffMax = new Array ()
}

2. Вы сам и и ответили, если свойства доступные для всего экземпляра класса, а есть локальные, только для метода. Это вы сами должны определять, исходя из задачи.
3. Опять же, все зависит от задач. Можно расширить класс, а можно сделать обычный класс и передавать туда ссылку на мувиклип. В вашем случаи, на сколько я понял, лучше расширить.
4. Пример в первом пункте.

etc 19.06.2007 19:56

1. А массив в конструкторе создавать уже не надо?
2. Приватные свойства класса класса видные всем методам этого класса;
3. Нужно. Добавить метод — новый класс.
4. В конструкторе необходимо создать массив _anchorPointXdiffMax (ведь он только объявлен, но значения не имеет), плюс желательно вызывать конструктор супер-класса (наследникам MovieClip это некритично, но для других классов — да).

Amra Kimmerian 19.06.2007 20:08

iNils, __etc. Бессменные стражи знаний. Белых пятен на карте классов стало гораздо меньше. Спасибо!

---update---

Код:

class Lighting extends MovieClip {
        private var _anchorPointXdiffMax:Array;
        private function Lighting() {
                _anchorPointXdiffMax = new Array();
        }
        // Методы
        function getLightingStep() {
                trace(_anchorPointXdiffMax[2]);
        }
        function getLighting(timeL:Number, pauseL:Number) {
                _anchorPointXdiffMax[2] = Math.random()*10-5;
                trace(_anchorPointXdiffMax[2]);
                var calculate:Number = setInterval(getLightingStep, timeL+pauseL);
        }
}

в методе getLighting() теперь все видно, а вот в getLightingStep() trace(_anchorPointXdiffMax[2]) выдает опять же undefined. Ведь свойства класса должны быть видны во всех методах класса. Может быть не видно оттого что использую функцию getLightingStep() не как метод мувиклипа, а просто как вызываемую функцию? Как же тогда правильно использовать getLightingStep() чтобы в ней было все видно.

Amra Kimmerian 20.06.2007 08:40

Обновил предыдущий пост.

etc 20.06.2007 08:58

Код:

setInterval(this, 'getLightingStep', timeL+pauseL);

Amra Kimmerian 20.06.2007 09:31

Значит дело было в синтаксисе вызова метода с помощью setInterval.
Обещаю еще внимательнее читать ливдок :umnik2: и постараюсь не забыть удалить setInterval(), при удалении клипа.
Спасибо!

etc 20.06.2007 09:32

У setInterval два синтаксиса, один из них запускает функцию в заданной области видимости, а второй без неё.

Kikasso 20.06.2007 09:43

Цитата:

Сообщение от Amra Kimmerian
постараюсь не забыть удалить setInterval(), при удалении клипа.

Если 8-ка, чтобы не забыть, используйте setTimeout(). Синтаксис тот же, только срабатывает однократно (интервал самоочищается). А если компилятор посмеет заявить, что такой функции нет, читайте тут: http://www.flasher.ru/forum/showthread.php?t=73336


Часовой пояс GMT +4, время: 17:11.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.