![]() |
|
||||||||||
|
|||||
|
Здравствуйте. Пора настала и ООП изучать, посмотрел (уже по привычке) 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);
1. Самый явный вопрос. trace(_myNumber) выдает 10, а trace(_anchorPointXdiffMax[0]) выдает undefined. Ведь инициализация одинаковая, применение тоже, почему так? 2. Если к примеру сторку private var _myNumber:Number; убрать а вместо нее в методе getLighting написать var _myNumber:Number; то тоже выдает 10, в чем же тогда разница? Зачем мне объявлять переменные класса, если их можно объявить внутри метода класса. По моему сложившемуся мнению переменные класса нужны как величины, которые может использовать любой из методов внутри класса. Но вот только сел, а уж с массивами уже не лады. 3. Вытекает из 2. Нужно ли мне вообще использвать расширение класса для обеспечения такой функциональности или это целесообразней сделать вне класса, просто как метод. Можно ли так сделать вообще и если можно то в какую сторону двигаться? 4. У меня пустой конструктор класса. Вероятно для избежания ошибок нужно было как нибудь (не смейтесь пожалуйста ) его использовать, но просто переприсваивание переменных... я не понял честно говоря.Насколько смог, изложил. Помогите пожалуйста. |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
1. Объявить _anchorPointXdiffMax типом данных как массив вы объявили, но сам массив при этом не создали.
2. Вы сам и и ответили, если свойства доступные для всего экземпляра класса, а есть локальные, только для метода. Это вы сами должны определять, исходя из задачи. 3. Опять же, все зависит от задач. Можно расширить класс, а можно сделать обычный класс и передавать туда ссылку на мувиклип. В вашем случаи, на сколько я понял, лучше расширить. 4. Пример в первом пункте. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
1. А массив в конструкторе создавать уже не надо?
2. Приватные свойства класса класса видные всем методам этого класса; 3. Нужно. Добавить метод — новый класс. 4. В конструкторе необходимо создать массив _anchorPointXdiffMax (ведь он только объявлен, но значения не имеет), плюс желательно вызывать конструктор супер-класса (наследникам MovieClip это некритично, но для других классов — да). |
|
|||||
|
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);
}
}
Последний раз редактировалось Amra Kimmerian; 19.06.2007 в 21:05. |
|
|||||
|
Обновил предыдущий пост.
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
|
|
|||||
|
Значит дело было в синтаксисе вызова метода с помощью setInterval.
Обещаю еще внимательнее читать ливдок и постараюсь не забыть удалить setInterval(), при удалении клипа.Спасибо! |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
У setInterval два синтаксиса, один из них запускает функцию в заданной области видимости, а второй без неё.
|
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 07:39. |
|
|
« Предыдущая тема | Следующая тема » |
|
|