Просмотр полной версии : Дуплирование клипов при помощи прототипа
Эх, понесло меня на прототипы! До обидного мало уделяем мы на форуме внимания этой чрезвычайно мощной и удобной штуковине. Сейчас я это докажу.
Все мы рано или поздно начинаем дублировать клипы. Периодически у начинающих возникают вопросы по этой простой операции, да и те, кто понимает – часто переписывают один и тот же код из программы в программу, что-то там меняя, подстраивая…ну, сами знаете.
Так вот, я решил сделать (и сделал-таки) нечто универсальное, позволяющее одной простой операцией дублировать клипы, сожержащие (или не содержащие) кнопки с заголовками, дублировать мувики, находящиеся внутри других, и все это можно проделать, вообще не зная, как и почему эти мувики дублируются. В случае вложенных клипов, правда, нужно будет подбирать его положение, но это не так уж и сложно.
Пишем прототип.
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();
Все!
Вы можете вообще ничего не знать о том, как дублируются клипы и как работает прототип, он будет работать и без вашего понимания, с любыми именами и заголовками.
Этот материал с более-менее подробными разъяснениями я попытался выложить в уроках, но что-то, наверное, не заладилось, не знаю. Может, появится когда-нибудь.
А пример для демонстрации я выкладываю. Если кто-нибудь захочет улучшить мой вариант - буду рад посмотреть.
Надеюсь, что этот пример сподвигнет вас на написание иных прототипов. Со временем можно было бы организовать для прототипов отдельный раздел, как это сделано для уроков или исходников.
Мечты…
Исходник прототипа перегонки в массив слов не даш?
Я не совсем понял, что ты имеешь в виду. У меня есть прототип для перегонки слов из строки в массив:
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").
я это и имел в виду.
попробовал сам, что-то не получается. исходник нужен.
тоесть принципа работы этого не понимаю до конца. повторить не могу, а следовательно и преминять...
вот исходничек бы, чтобы все наглядно было... этому такой параметр, это -то, это- сЁ.
Я, кстати, однажду его уже выкладывал.
Фишка прототипа в том, что он не требует понимания - как он работает. Ты его просто применяешь - и все.
Вот какой был исходник: (естественно, нужен этот самый файл 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();
а можно осуществить чтонить типа :
s= LoadVariablesNum ("text.txt", 0);
Ты должен написать
loadVariablesNum("text.txt",0);
а в самом файле уже -
s1=первая строка&s2=вторая строка
Оператор (побитовый); конвертирует expression1 и expression2 в 32-битные целые числа, и выполняет операцию "булево И" над каждым битом аргумента целого числа. В результате мы имеем новое беззнаковое целое число.
это иписалово которое я нашел по "&". (и ничего не понял :( )
я думал что нужно переменной S присвоить загруженные из текста значения.
Да, нет. Посмотри по поиску загрузку данных из файла. была масса вопросов и ответов по этой теме.
да данные я загрузить могу....
я не понимаю как присвоит переменной S их значение.
loadVariablesNum ("text.txt", 0); - загрузка на уровень 0 и дальше что?
#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, людей расслабляешь! :) Лентяями делаешь :)
2 stone
Ты все-таки не поискал на форуме. Переменные загружаются в твой комп не сразу. В самом простом варианте нужно пропустить несколько кадров. Более правильный - проверять условие загрузки. Как - поищи на форуме, вариантов много. Простой - я вкладываю, сложный - ищи! Повторюсь, описаний сего - тьма.
2 RFMitro
Да, конечно, расслабуха имеет место. Но мне хотелось бы, чтобы вопрос прототипов у нас действительно почаще поднимался. Может, хоть после этого народ, осознав преимущества, начнет штурмовать и эту высоту? А то за державу обидно: ну, чем мы хуже тех же ребят из were-here.com?
А думать - ничего, научатся. Был бы стимул. И мы сколько ляпались, пока научились...
эка... прямо какоето новомодное увлечение...
"прототипы - это модно"
даешь каждому по прототипу.
2 vol
да я нашел, прочел :)
просто пытаясь узнать одно, я узнаю второе, потом треть и подконец уже не помню накой мне это надо было :)
так дело то вот в чем. мне нужно сделать регистрацию пользователей.
не видели гденить ссходничка , желательно чтобы поменьше ПЕРЛА и тому подобного.
встрять ...
а почему бы не загнать в массив слова из строки вот так:
txt="вап впаывап а вап sdfg sdfg вап "
arrArray=txt.split(" ")
и всё.. или я чего-то не так понял? :rolleyes:
john, самж народ раззадорил.. (http://www.3wgraphics.com/experience/index.htm) ;)
2Baltika
да я же просто ... радуюсь :)
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";
где содержатся эти параметры? Заводится в ОЗУ новое поле под пятый параметр?
---
Спасибо заранее за пояснения. Вопросы еще будут :) ;)
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, а в шестерке что-нить поменялось при работе с прототипами?
и где мона про это почитать поподробнее ??
плз.
в шестерке появятся проперти...(properties)
это очень большой этап, (во флэш естествено :) )
это поле, при изменении значения которого можно будет выполнять одну функцию (метод) а при запросе значения выполнять другую функцию (метод)
короче геттеры/сеттеры.
тут есть возмжность создавать поля только для чтения,
если немного поизвращатся то можно создавать приватные поля.
второй большой этап, это доступ к элементам библиотеки, как к классам, через registerClass.
Что позволяет мувиклипы и кнопки объединять в цепочки наследований, и подменять классы уже в процессе, через идентификаторы (linkages) библиотеки.
еще одна большая возможность, так это появление нормальных идентификаторов классов.
для удобства вводится указатель super, на супер класс.
вообще шестерка вся пропитана ООП. Вернее ООС. Не объектно ориентированное программирование, а объектно ориентированный скриптинг. (это кстати термин самой макромедии) Что мне кажется более коректнее. Но ООП - привычнее :)
Пасиб, а где про это почитать можно ?
или будет новая статья ? ;)
Да негде особенно почитать,
да и статью рано писать, мало что еще добавят (изменят) в релизе.
кстати, забавно шестерка отображает лист объектов.. говорю же что все ооп пропитано,
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'] {}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.