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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.04.2009, 02:15
джонатан вне форума Посмотреть профиль Отправить личное сообщение для джонатан Найти все сообщения от джонатан
  № 1  
Ответить с цитированием
джонатан
 
Аватар для джонатан

Регистрация: Jan 2007
Адрес: Минск
Сообщений: 781
Отправить сообщение для джонатан с помощью Skype™
По умолчанию Перехожу на классы. Помогите разобраться.

Здравствуйте товарищи! Давненько я сдесь не задавал вопросов, но вот теперь настал час, когда я немогу обойтись без вашей помощи. Решил перейти на классы, чтобы в слудующем несколько упростить усвоение AS3 но пока не оставаться без денег, и что-то делать. Так сказать решил пойти по двум тропам одновременно. Началось все более менее неплохо, написал свой первый в жизни класс, простенький, но всеравно было приятно, от того, что закончился первый эксперимент успешно. Это был обычный классик, который программно рисует квадраты Потом я написал второй классик, который программно рисует рамки. Далее я решил написать третий классик, но тут успех обошел меня стороной. Вот собственно решил попрасить вашей помощи. В свое время именно тут мне помогли осовить AS2 за, что я всем очень благодарен. Собственно перейду к вопросу.
Третий класс, который у меня не получился, это так сказать, мини-прелоадер.


com/flashgangsta/Preloader.as
Код AS1/AS2:
class com.flashgangsta.Preloader {
	public static function loading(mc:MovieClip, func:Function):Void {
		trace("banan");
		if(mc.getBytesLoaded() == mc.getBytesTotal()) {
			delete mc.onEnterFrame;
			func();
		} else {
			trace("loaded: " + (mc.getBytesLoaded() / mc.getBytesTotal() * 100) + "%");
		}
	}
}
index.fla

Код AS1/AS2:
stop();
 
function MyFunc():Void {
	trace("lisa");
}
 
this.onEnterFrame = function() {
	Preloader.loading(this, MyFunc);
}
Думаю объяснять тут ненужно, чего я хотел добиться. Единственное, что скажу, так это-то, что — неработает

Помогите пожалуйста, подскажите в чем я ошибся.
Благодарю за внимание.
__________________
Убейте меня!

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
А что не работает то?
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

Регистрация: Jan 2007
Адрес: Минск
Сообщений: 781
Отправить сообщение для джонатан с помощью Skype™
Черт возьми )) действительно все работает

Както не привычно просто что пока ненажмешь ctrl+s компилится старый сейв класса. Ну да ладно, с этим проехали, я тупица ) Чтобы тема не пропадала даром, расскажите мне пожалуйста что есть

private
public
static
dynamic
а также package

Если не трудно конечно. Спасибо

И еще! Чуть не забыл. Возможно ли мне непосредственно в самом классе, вставить onEnterFrame? Ну типа вот так:

Код:
class com.flashgangsta.Preloader {
	public static function loading(mc:MovieClip, func:Function):Void {
		mc.onEnterFrame = function() {
			if(mc.getBytesLoaded() == mc.getBytesTotal()) {
				delete mc.onEnterFrame;
				func();
			} else {
				trace("loaded: " + (mc.getBytesLoaded() / mc.getBytesTotal() * 100) + "%");
			}
		}
	}
}
Чтобы в fla просто вызваьб метод loading класса Preloader:
Код AS1/AS2:
Preloader.loading(this, MyFunc);
__________________
Убейте меня!


Последний раз редактировалось джонатан; 26.04.2009 в 03:16.
Старый 26.04.2009, 03:53
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Я бы посоветовал использовать интервал - с onEnterFrame клипа, в который грузишь, могут происходить разные чудеса)))
И назови методы нормально, что еще за лоадинг))) viewLoading, displayLoading, controlLoading, convoyLoading, escortLoading))))) И не func, а completeHandler - у тебя же почти событие тут происходит))) Мирового массштаба)) Удачи тебе, отличное начинание))
__________________
Reality.getBounds(this);

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
1. private/public - ключевое слово метода, свойства или класса, определяют уровень доступа. public - доступен для любого вызывающего объекта. private только внутри класса или подкласса, то есть, если вы задали свойству private, то любой другой класс не наследуемый от данного, не получит доступа к свойству.
Коли вы собираетесь переходить на AS3, то скажу, что там подобных ключевых слов больше - internal/private/public/protected, но private здесь не дает доступа из подклассов, аналог для private из AS2 это protected. Про остальные прочитайте в хелпе, ссылка в моей подписи есть.

2. static - говорит о том, что свойство или метод принадлежит классу, а не экземплярам класса. Поэтому обращение идет через имя класса. Пример класс Math, у него все методы и свойства static. Методы и свойства класса не наследуются.

3. dynamic - ключевое слово класса, говорит о том, что свойства могут быть не описаны и добавляться в процессе выполнения. В противном случаи, они должны быть описаны с помощью var.

4. package - пакет. Служит для разделения классов на группу и помогает устранить конфликты между классами с одинаковыми названиями. Пример: вы создали флешку с классом Main, которая грузит в себя чужую флешку. Но так получилось, что в ней тоже есть класс с таким же именем. Возникает конфликт. Использую пакет, вы этого избегаете. А как избежать создания пакетов с одинаковым именем? Принято называть пакет по имени вашего домена. У меня пакеты начинаются с ru.inils, а потом указываю имя проекта или направления. Например ru.inils.utils, ru.inils.homepage.utils или ru.inils.ims.utils. Но самого имени пакете мало, должна быть соответствующая файловая структура. То есть, каждой слово пакета, это название каталога. В случае с com.flashgangsta.Preloader должен быть каталог com, в нем каталог flashgangsta, а в нем файл Preloader.as с классом.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 26.04.2009, 04:19
Vektor вне форума Посмотреть профиль Отправить личное сообщение для Vektor Найти все сообщения от Vektor
  № 6  
Ответить с цитированием
Vektor
 
Аватар для Vektor

Регистрация: May 2008
Адрес: Новокузнецк
Сообщений: 219
Записей в блоге: 1
private:Видемый только в классе;
public: Метод доступен любому классу; (лучше, использовать get and set для переменых);
static: Доступен непосредственно из класса, а не из экземпляра класса
пример:Math.round();
package: Пакеты являются важной частью работы с классами, потомучто они позволяют предотвратить конфликты имен классов.
Примерно как, в одну папку, не засунешь две разные фото с одним названием.
dynamic:Определяет, что образцы класса могут обладать динамическими свойствами, добавленными во времени выполнения. Если Вы используете динамический атрибут на классе, Вы можете добавить свойства к образцам того класса во времени выполнения. Классы, которые не отмечены как динамические, считают запечатанными, что означает, что свойства не могут быть добавлены к образцам класса.
А лучше, читай хелп;
В АС3 есть хорошие ссылки на pdf. файлы.
__________________
Книги и желание лучшие учителя.


Последний раз редактировалось Vektor; 26.04.2009 в 04:23.
Старый 26.04.2009, 15:42
джонатан вне форума Посмотреть профиль Отправить личное сообщение для джонатан Найти все сообщения от джонатан
  № 7  
Ответить с цитированием
джонатан
 
Аватар для джонатан

Регистрация: Jan 2007
Адрес: Минск
Сообщений: 781
Отправить сообщение для джонатан с помощью Skype™
Всем огромное спасибо!
Вот еще один вопросик у меня. Значит так. Добавил я в свой класс переменную «loaded», и непонятно она как-то отображается совсем. Взгляните плиз:

Код AS1/AS2:
class com.flashgangsta.Preloader {
	public static var loaded:Boolean = false;
	public function listenLoading(target:MovieClip, completeHandler:Function):Void {
		target.onEnterFrame = function() {
			if(target.getBytesLoaded() == target.getBytesTotal()) {
				delete target.onEnterFrame;
				completeHandler();
				loaded = true;
				trace(target + " loading is complete");
			} else {
				trace("loaded: " + Math.round((target.getBytesLoaded() / target.getBytesTotal() * 100)) + "%");
			}
			trace(loaded);
		}
	}
}
Я сразу придую ей значение false и меняю на true только по завершению загрузки, но trace, при симуляции загрузки, выводит что загрузка идет, а переменная равна true; если я уберу строку loaded = true; из условия, тогда выводится false. Как так? Почему она становится тру, не смотря на то что условие не выполняется?
Если же я обявлю переменную без static
Код AS1/AS2:
public var loaded:Boolean = false;
То trace() и вовсе выводит undefined


Всем огромное спасибо за внимание.
__________________
Убейте меня!


Последний раз редактировалось джонатан; 26.04.2009 в 15:46.
Старый 26.04.2009, 15:49
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 8  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А куда ты static дел?))))

Добавлено через 5 минут
Сам подумай, если это у тебя написано в теле обработчика события onEnterFrame клипа target, то чье свойство ты выводишь?

Добавлено через 12 минут
Вообще, плохая практика из своего класса нагружать внешние объекты новыми свойствами и тем более методами, а уж тем более - переписывать их родные (как onEnterFrame в данном случае). Это чревато такими багами, которые замучаешься потом искать, да и просто нарушает "этику" класса. Надо постараться сделать класс независимым везде где это возможно. В данном случае тебе нужен просто таймер для периодического опроса, и трогать для этого таргет-клип не надо. Надо завести интервал и опрашивать по нему. Никогда не лезь во внутреннее устройство чужих экземпляров без насущной необходимости.
__________________
Reality.getBounds(this);

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

Регистрация: Jan 2007
Адрес: Минск
Сообщений: 781
Отправить сообщение для джонатан с помощью Skype™
Статик я убрал чтобы не писать из фла весь путь к классу, а создать экземпляр класса.

Код:
import com.flashgangsta.*;

var preloader:Preloader = new Preloader();

function StartProgramm():Void {
	trace("Ы");
}

stop();
preloader.listenLoading(this, StartProgramm);
Понял. Сенкс. Я вот как решил беду:

Код AS1/AS2:
class com.flashgangsta.Preloader {
 
	public static var loaded:Boolean;
 
	public static function setLoadComplete(value:Boolean):Void {
		loaded = value;
	}
 
	public function getLoadComplete():Boolean {
		return loaded;
	}
 
	public function listenLoading(target:MovieClip, completeHandler:Function):Void {
		setLoadComplete(false);
		target.onEnterFrame = function() {
			if(target.getBytesLoaded() == target.getBytesTotal()) {
				setLoadComplete(true);
				delete target.onEnterFrame;
				completeHandler();
				trace(target + " loading is complete");
			} else trace(target + "loaded: " + Math.round((target.getBytesLoaded() / target.getBytesTotal() * 100)) + "%");
		}
	}
}
Интересно, правильное решение я предпринял? Может есть какие-то иные варианты?

Wolsh По последнему добавлению, ьольшой сенкс. Нарушать «этику» не хочу, сейчас же перепишу

Переписал:

Код AS1/AS2:
class com.flashgangsta.Preloader {
 
	public static var loaded:Boolean;
	public static var loadListener:Number;
	public static var listenInterval:Number = 250;
	public static var handler:Function;
	public static var trg:MovieClip;
 
	public static function setLoadComplete(value:Boolean):Void {
		loaded = value;
	}
 
	public function getLoadComplete():Boolean {
		return loaded;
	}
 
	public static function listenLoading():Void {
		setLoadComplete(false);
		if(trg.getBytesLoaded() == trg.getBytesTotal()) {
			setLoadComplete(true);
			clearInterval(loadListener);
			handler();
			trace(trg + " loading is complete");
		} else trace(trg + " loaded: " + Math.round((trg.getBytesLoaded() / trg.getBytesTotal() * 100)) + "%");
	}
 
	public function start(target:MovieClip, completeHandler:Function):Void {
		handler = completeHandler;
		trg = target;
		loadListener = setInterval(listenLoading, listenInterval);
	}
}
__________________
Убейте меня!


Последний раз редактировалось джонатан; 26.04.2009 в 22:37.
Старый 26.04.2009, 22:49
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
К пятому варианту пора бы определиться, будет у тебя статик или будет экземпляр))) А то уже вообще трудно сообразить, что тут за арабская вязь))) Зачем тебе эти хитрые методы сетЛоадКомплит и гетЛоадКомплит? Да к тому же паблик - ты собираешься снаружи командовать, что клип загрузился?))))
Код:
class com.flashgangsta.Preloader {
 
    public static var loadComplete:Boolean = false;
    private static var _loadListener:Number;
    private static var _listenInterval:Number = 30;
 
    private static function listenLoading(target:MovieClip, completeHandler:Function):Void {
        loadComplete = target.getBytesLoaded() == target.getBytesTotal();
        if(loadComplete) {
            clearInterval(_loadListener);
            completeHandler();
            trace(target + " loading is complete");
        } else trace(target + "loaded: " + Math.round((target.getBytesLoaded() / target.getBytesTotal() * 100)) + "%");
    }
 
    public static function start(target:MovieClip, completeHandler:Function):Void {
        _loadListener = setInterval(listenLoading, _listenInterval, target, completeHandler);
    }
}
Код:
import com.flashgangsta.Preloader;
stop();
function StartProgramm():Void {
    trace(Preloader.loadComplete ? "Ыыы!" : "упс...");
}
Preloader.start(this, StartProgramm);
__________________
Reality.getBounds(this);


Последний раз редактировалось Wolsh; 26.04.2009 в 22:54.
Создать новую тему Ответ Часовой пояс GMT +4, время: 23:59.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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