Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.06.2007, 19:32
Amra Kimmerian вне форума Посмотреть профиль Отправить личное сообщение для Amra Kimmerian Найти все сообщения от Amra Kimmerian
  № 1  
Ответить с цитированием
Amra Kimmerian

Регистрация: Dec 2006
Адрес: Россия, Пермь
Сообщений: 72
Отправить сообщение для Amra Kimmerian с помощью ICQ
По умолчанию О классах и их образцах

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

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

Старый 19.06.2007, 19:51
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
1. Объявить _anchorPointXdiffMax типом данных как массив вы объявили, но сам массив при этом не создали.
Код:
private function Lighting() {
	_anchorPointXdiffMax = new Array ()
}
2. Вы сам и и ответили, если свойства доступные для всего экземпляра класса, а есть локальные, только для метода. Это вы сами должны определять, исходя из задачи.
3. Опять же, все зависит от задач. Можно расширить класс, а можно сделать обычный класс и передавать туда ссылку на мувиклип. В вашем случаи, на сколько я понял, лучше расширить.
4. Пример в первом пункте.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 19.06.2007, 19:56
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

Старый 19.06.2007, 20:08
Amra Kimmerian вне форума Посмотреть профиль Отправить личное сообщение для Amra Kimmerian Найти все сообщения от Amra Kimmerian
  № 4  
Ответить с цитированием
Amra Kimmerian

Регистрация: Dec 2006
Адрес: Россия, Пермь
Сообщений: 72
Отправить сообщение для Amra Kimmerian с помощью ICQ
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; 19.06.2007 в 21:05.
Старый 20.06.2007, 08:40
Amra Kimmerian вне форума Посмотреть профиль Отправить личное сообщение для Amra Kimmerian Найти все сообщения от Amra Kimmerian
  № 5  
Ответить с цитированием
Amra Kimmerian

Регистрация: Dec 2006
Адрес: Россия, Пермь
Сообщений: 72
Отправить сообщение для Amra Kimmerian с помощью ICQ
Обновил предыдущий пост.

Старый 20.06.2007, 08:58
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Код:
setInterval(this, 'getLightingStep', timeL+pauseL);

Старый 20.06.2007, 09:31
Amra Kimmerian вне форума Посмотреть профиль Отправить личное сообщение для Amra Kimmerian Найти все сообщения от Amra Kimmerian
  № 7  
Ответить с цитированием
Amra Kimmerian

Регистрация: Dec 2006
Адрес: Россия, Пермь
Сообщений: 72
Отправить сообщение для Amra Kimmerian с помощью ICQ
Значит дело было в синтаксисе вызова метода с помощью setInterval.
Обещаю еще внимательнее читать ливдок и постараюсь не забыть удалить setInterval(), при удалении клипа.
Спасибо!

Старый 20.06.2007, 09:32
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
У setInterval два синтаксиса, один из них запускает функцию в заданной области видимости, а второй без неё.

Старый 20.06.2007, 09:43
Kikasso вне форума Посмотреть профиль Отправить личное сообщение для Kikasso Найти все сообщения от Kikasso
  № 9  
Ответить с цитированием
Kikasso
 
Аватар для Kikasso

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 07:39.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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