PDA

Просмотр полной версии : Дуплирование клипов при помощи прототипа


vol
30.11.2001, 13:50
Эх, понесло меня на прототипы! До обидного мало уделяем мы на форуме внимания этой чрезвычайно мощной и удобной штуковине. Сейчас я это докажу.

Все мы рано или поздно начинаем дублировать клипы. Периодически у начинающих возникают вопросы по этой простой операции, да и те, кто понимает – часто переписывают один и тот же код из программы в программу, что-то там меняя, подстраивая…ну, сами знаете.
Так вот, я решил сделать (и сделал-таки) нечто универсальное, позволяющее одной простой операцией дублировать клипы, сожержащие (или не содержащие) кнопки с заголовками, дублировать мувики, находящиеся внутри других, и все это можно проделать, вообще не зная, как и почему эти мувики дублируются. В случае вложенных клипов, правда, нужно будет подбирать его положение, но это не так уж и сложно.

Пишем прототип.

movieClip.prototype.DMC=function(n,x0,y0,dx,dy,captionName,captions){
var name=this._name;
if (name.charAt(name.length-1)=="0"){name=name.substr(0,name.length-1)}
var basename=name;

this._x=x0;
this._y=y0;
this[captionname]=captions[0];
var yt=y0;
var xt=x0;
for (i=1;i<n;i++){
name=basename+i;
yt+=dy;
xt+=dx;
this.duplicateMovieClip(name,i);

_parent[name]._y=yt;
_parent[name]._x=xt;
_parent[name][captionname]=captions[i];
}
}

В заголовке: n- количество дублированных клипов; x0,y0 – начальное положение первого клипа (куда его переместить, вернее); dx,dy – смещения дубликатов по x и y; captionName – имя текстового поля внутри клипа или кнопки; captions – массив с заголовками кнопок.
Помещаем это дело в файл с именем mylib.as.

Помещаем наш мувик с кнопкой и с именем, напр. buttonBall0 куда надо (или куда попало, не важно), а в первом фрейме пишем

#include mylib.as
Обратите внимание: точка с запятой после этого НЕ НУЖНА!

Пишем

caps=new array("dog","cat","bear","beer","cool beer");
это будут наши заголовки.

Наконец,
buttonball0.dmc(5,70,100,10,70,"caption",caps);
stop();

Все!

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

Этот материал с более-менее подробными разъяснениями я попытался выложить в уроках, но что-то, наверное, не заладилось, не знаю. Может, появится когда-нибудь.

А пример для демонстрации я выкладываю. Если кто-нибудь захочет улучшить мой вариант - буду рад посмотреть.

Надеюсь, что этот пример сподвигнет вас на написание иных прототипов. Со временем можно было бы организовать для прототипов отдельный раздел, как это сделано для уроков или исходников.
Мечты…

Stone
30.11.2001, 14:01
Исходник прототипа перегонки в массив слов не даш?

vol
30.11.2001, 14:26
Я не совсем понял, что ты имеешь в виду. У меня есть прототип для перегонки слов из строки в массив:

String.prototype.getWordsArray=function(){
var temp=[];
var begin=0;
var firstSpace=this.indexOf(" ");
var lastSpace=this.lastIndexOf(" ");
for(var i=0;i<this.length;i++){
if(end!=lastSpace){
end=this.indexOf(" ",begin+1)
temp[i]=this.substring(begin,end,end-begin);
begin=this.indexOf(" ",end)+1;
}else{
break;
}
}
temp.push(this.substring(lastSpace+1,this.length));
return temp;
}

В предыдущем примере слова в масив я загнал просто при его объявлении (в первом же фрейме) -
mas=new array("word1","word2",..., "wordn").

Stone
30.11.2001, 15:16
я это и имел в виду.
попробовал сам, что-то не получается. исходник нужен.

Stone
30.11.2001, 15:26
тоесть принципа работы этого не понимаю до конца. повторить не могу, а следовательно и преминять...


вот исходничек бы, чтобы все наглядно было... этому такой параметр, это -то, это- сЁ.

vol
30.11.2001, 15:42
Я, кстати, однажду его уже выкладывал.
Фишка прототипа в том, что он не требует понимания - как он работает. Ты его просто применяешь - и все.

Вот какой был исходник: (естественно, нужен этот самый файл strtowords.as - он есть в приложенном файле)

#include "strtowords.as"

s="Эта строка будет разбита на слова, которые запишутс\xff в массив";

a=new array();

a=s.getWordsArray();

// смотрим, чтобы убедиться - в трейсере
for (i=0;i<a.length;i++){
trace(a[i]);
}
wrd=a[3]; ..а это - в поле.



stop();

Stone
30.11.2001, 16:26
а можно осуществить чтонить типа :
s= LoadVariablesNum ("text.txt", 0);

vol
30.11.2001, 17:24
Ты должен написать
loadVariablesNum("text.txt",0);
а в самом файле уже -
s1=первая строка&s2=вторая строка

Stone
30.11.2001, 17:44
Оператор (побитовый); конвертирует expression1 и expression2 в 32-битные целые числа, и выполняет операцию "булево И" над каждым битом аргумента целого числа. В результате мы имеем новое беззнаковое целое число.

это иписалово которое я нашел по "&". (и ничего не понял :( )

я думал что нужно переменной S присвоить загруженные из текста значения.

vol
30.11.2001, 18:15
Да, нет. Посмотри по поиску загрузку данных из файла. была масса вопросов и ответов по этой теме.

Stone
30.11.2001, 18:50
да данные я загрузить могу....
я не понимаю как присвоит переменной S их значение.

loadVariablesNum ("text.txt", 0); - загрузка на уровень 0 и дальше что?

Stone
30.11.2001, 19:06
#include "strtowords.as"
loadVariablesNum ("text.txt", 0);
s=_lavel0.txt;
a=new array();
a=s.getWordsArray();
for (i=0;i<a.length;i++){
trace(a[i]);
}
wrd=a[3];


stop();

RFMitrio
30.11.2001, 20:35
Прототипы.... Можно вообще создать библиотеку макрофункций-прототипов. Я имею в виду, для собсного пользования очень полезно. И очень удобно!
---
Vol, людей расслабляешь! :) Лентяями делаешь :)

vol
30.11.2001, 21:07
2 stone
Ты все-таки не поискал на форуме. Переменные загружаются в твой комп не сразу. В самом простом варианте нужно пропустить несколько кадров. Более правильный - проверять условие загрузки. Как - поищи на форуме, вариантов много. Простой - я вкладываю, сложный - ищи! Повторюсь, описаний сего - тьма.

2 RFMitro
Да, конечно, расслабуха имеет место. Но мне хотелось бы, чтобы вопрос прототипов у нас действительно почаще поднимался. Может, хоть после этого народ, осознав преимущества, начнет штурмовать и эту высоту? А то за державу обидно: ну, чем мы хуже тех же ребят из were-here.com?
А думать - ничего, научатся. Был бы стимул. И мы сколько ляпались, пока научились...

john
30.11.2001, 21:21
эка... прямо какоето новомодное увлечение...
"прототипы - это модно"
даешь каждому по прототипу.

Stone
30.11.2001, 21:44
2 vol
да я нашел, прочел :)
просто пытаясь узнать одно, я узнаю второе, потом треть и подконец уже не помню накой мне это надо было :)



так дело то вот в чем. мне нужно сделать регистрацию пользователей.
не видели гденить ссходничка , желательно чтобы поменьше ПЕРЛА и тому подобного.

Iv
01.12.2001, 02:17
встрять ...
а почему бы не загнать в массив слова из строки вот так:
txt="вап впаывап а вап sdfg sdfg вап "
arrArray=txt.split(" ")
и всё.. или я чего-то не так понял? :rolleyes:

Baltika
01.12.2001, 13:17
john, самж народ раззадорил.. (http://www.3wgraphics.com/experience/index.htm) ;)

john
01.12.2001, 14:08
2Baltika

да я же просто ... радуюсь :)

Baltika
01.12.2001, 14:12
2john

прототипы рулят!
(во сказал.. :rolleyes: )

RFMitrio
01.12.2001, 15:21
Ах так! :) ;) Тогда вопросы к Джону.
1. как я понимаю при определении ф-ции конструктора не создается никаких объектов?
function constructor_one()
{
this.a = "a"
this.b = "b"
this.method = function()
{
trace("one")
}
}

2. при вызове конструктора, например one = new constructor_one(); в памяти компа создается блок со следующими полями:
1.a содержит символ "а"
2.b содержит символ "b"
3.поле method содержит ссылку на область памяти, где описана функция метода
4. есть некая ссылка на объект prototype ( в данном случае, пустой ). Или ее нет?
Я все правильно понял? Или нет?
А если сделаем:
two = new constructor_one();
Первые 2 поля создаются заново для объекта 2. 3-е поле тоже содержит ту же самую ссылку на ту же функцию. А четвертое? Ссылку на тот же прототип?
constructor_one.prototype.new_param = "new_param";
В этом случае в области, где содержится прототип (общий для всех объектов) появляется описание прототипа.
Я не понимаю такой вещи: если сделать
one.new_param="one_param";
two.new_param="two_param";
где содержатся эти параметры? Заводится в ОЗУ новое поле под пятый параметр?
---
Спасибо заранее за пояснения. Вопросы еще будут :) ;)

john
01.12.2001, 17:57
one.new_param="one_param";
two.new_param="two_param";


да создается новое поле, локально относительно объекта, one, two

если вызвать

delete one.new_param, то поле new_param в объекте one будет удалено, и при вызове one.new_param, будет получено содержание поля прототипа.

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

constructor_one.prototyoe.__proto__ = undefined;

теперь вернусь о поле пртототипа (суперкласса) и создоваемого объекта (субкласса)

если в объекте субклассе есть вызываемое поле (в нашем примере "new_param") то вызывается значение данного поля,
если такого поля нет, то вызываетя суперкласс (прототип) и вызывается одноименно поле, и так далее, вверх и вверх по иерархии, пока у объекта не будет прототипа.

Если на одном из этапов, цепочки наследования создать локальное поле, то можно управлять наследованием...
ну в общем все достаточно просто.

john
01.12.2001, 18:01
"Прототип, по умолчанию, это новосозданный объект",

имеется ввиду, создается при создании функции,
не понимать что для каждого созданного объекта создается свой прототип....
прототип общий для всех объектов созданных одним конструктором, (если конечно умышленно не было подмены, самим программистом)

Baltika
01.12.2001, 19:04
да....мудрено ....
john, а в шестерке что-нить поменялось при работе с прототипами?
и где мона про это почитать поподробнее ??
плз.

john
01.12.2001, 21:50
в шестерке появятся проперти...(properties)

это очень большой этап, (во флэш естествено :) )

это поле, при изменении значения которого можно будет выполнять одну функцию (метод) а при запросе значения выполнять другую функцию (метод)

короче геттеры/сеттеры.

тут есть возмжность создавать поля только для чтения,
если немного поизвращатся то можно создавать приватные поля.

второй большой этап, это доступ к элементам библиотеки, как к классам, через registerClass.
Что позволяет мувиклипы и кнопки объединять в цепочки наследований, и подменять классы уже в процессе, через идентификаторы (linkages) библиотеки.

еще одна большая возможность, так это появление нормальных идентификаторов классов.

для удобства вводится указатель super, на супер класс.

вообще шестерка вся пропитана ООП. Вернее ООС. Не объектно ориентированное программирование, а объектно ориентированный скриптинг. (это кстати термин самой макромедии) Что мне кажется более коректнее. Но ООП - привычнее :)

Baltika
02.12.2001, 11:18
Пасиб, а где про это почитать можно ?
или будет новая статья ? ;)

john
03.12.2001, 02:00
Да негде особенно почитать,
да и статью рано писать, мало что еще добавят (изменят) в релизе.

кстати, забавно шестерка отображает лист объектов.. говорю же что все ооп пропитано,

Variable _level0.$version = "WIN 6,0,0,225"
Variable _level0.cons = [function 'cons'] {
prototype:[object #2, class 'proto'] {
prop:,
prop_get:[function],
prop_set:[function]
}
}
Variable _level0.proto = [function 'proto']
Variable _level0.a = [object #6, class 'proto'] {
prop:"n"
}
Variable _level0.b = [object #7, class 'proto'] {}
Variable _level0.c = [object #8, class 'proto'] {}
Variable _level0.d = [object #9, class 'proto'] {}
Variable _level0.e = [object #10, class 'proto'] {}