Просмотр полной версии : хочу программно мовики клепать ...
надо определить класс со свойствами мовиклипа, что бы в него другие пихать можно было, новые методы к нему плагить и тд
Class = function()
{
}
Class.prototype = new MovieClip();
НО это хреново работает, ничего из вышеперечисленного с ЭТИМ делать нельзя ...
может после назначения мовиклипа классом-предком надо его как-нибудь инициализировать, помогите :( ...
Object.registerClass(); - то же пробовал ...
а можт добалять методы и поля прям к прототипу мувиклипа ?
movieClip.prototype.my=function(x0,y0){
this._x = x0;
this._y = y0;
}
instMC.my(15,500);
Ну я с классами не возился, но можешь сделать функций, аргументом которой является только что созданный мувиклип! создаешь мувиклип с именем запускаешь функцию("имя мувиклипа") а внутри присваиваешь ему свойства! Я просто в прототипах ещё не шарю, но так работать будет!
мне нужен класс, чтобы строчкой cls = new Class(); создавался мовиклип, а не аттачить его из библиотеки ...
2rogopil
нее, брат, так не пойдёт :D ... муторно ...
Знаю! но пока в той области не силен! только разбираюсь!
Nox Noctis
08.09.2002, 23:17
Оригинал написал(а) SphinX
мне нужен класс, чтобы строчкой cls = new Class(); создавался мовиклип, а не аттачить его из библиотеки ...ну и не надо аттачить :) положи просто в таймлайн клип, задав ему линкейдж в библиотеке :)
после объявления класса и последующего Object.registerClass, он станет его представителем без всякого аттача :)
...а скриптом создать клип можно только одним способом:
методом MovieClip.createEmptyMovieClip (см. хелп ;) ) и всё :) ВСИО :)
DeliMIter
09.09.2002, 20:06
А еще можно переписать createEmptyMovieClip, чтоб он еще InitObject брал дополнительным параметром.
2 Delimiter
code, плиз :) ...
DeliMIter
10.09.2002, 22:29
Сохраняешь старый хандлер, переопределяешь новый с дополнительным параметром параметром, при вызове вызываешь наследственный конструктор а потом перекидываешь в готовый объект пропертя инитобжекта.
какой-такой "старый хандлер", лучше бы код написал ...
и как это "пропертя перекинуть" ???
Nox Noctis
12.09.2002, 18:42
да простит меня делимитер :))
(да будет долгой его борода 8))) )
MovieClip.prototype.$cemc = MovieClip.prototype.createEmptyMovieClip;
ASSetPropFlags(MovieClip.prototype, "$cemc", 7);
MovieClip.prototype.createEmptyMovieClip = function(iname, depth, init) {
var href = this.$cemc(iname, depth);
for (var i in init) {
href[i] = init[i];
}
return href;
};
//
this.createEmptyMovieClip("newClip", 1, {_x:100, _y:100, _alpha:50});
newClip.lineStyle(20), newClip.lineTo(.15, 0);
сёр, а откуда берутся такие познания в AS'ах ???
ASSetPropFlags - это вообще, похоже, недокументированная возможность x86'х процессоров :)
Nox, я ОЧЕНЬ плохой человек, я забыл тебя поблагодарить !!!
SANXXXXX
а зачем $ :rolleyes:
Nox Noctis
12.09.2002, 19:30
Оригинал написал(а) SphinX
а зачем $ ...да ни зачем :) просто так... :) чтоб не скучно :)
DeliMIter
12.09.2002, 19:35
2Sphinx
$ ты положишь в конверт в виде толстой пачки и пошлешь нам.
2Nox
Именно так, один к одному за исключением имен и ненужности фигурных скобок в цикле.
Nox Noctis
12.09.2002, 19:59
я ваще-то в курсе, если честно :) насчет цикла...
только я автоформат юзаю - он сам скобки ставит :p
DeliMIter
12.09.2002, 20:23
Только не плачь. Только не на клавиатуру... оо..
А зачем автоформат?
2Nox noctis
а код, который ты предложил почему то работает некорректно: если в объекте кот. перекидываю в новосозданный мовиклип присутствуют свойства созданные addProperty, то они перестают работать.
Мож есть какие соображения ?
2Nox noctis
а код, который ты предложил почему то работает некорректно: если в объекте, который перекидываю в новосозданный мовиклип присутствуют свойства созданные addProperty, то они перестают работать.
// эта ф-ция маленько отличается от твоей
// в неё передаю имя класса, а объект создаётся onthefly
// + мне надо в конструктор параметры передать,
// придумал только этот извращенский способ
MovieClip.prototype.newMCClass = function(className,instanceName,params)
{
var obj = new className();
obj.init.apply(obj,params);
var mc = this.createEmptyMovieClip(instanceName,this.maxDepth);
this.maxDepth++;
for (var i in obj) mc[i] = obj[i];
}
Class = function()
{
this.param = "another param";
this._property = "default value";
}
// когда устанавливаю свойство вижу в выводе "set"
Class.prototype.setp = function(val)
{
trace("set");
this._property = val;
}
// когда беру свойство вижу в выводе "get"
Class.prototype.getp = function()
{
trace("get");
return this._property;
}
Class.prototype.addProperty("property",Class.prototype.getp,Class.prototype.setp);
Class.prototype.init = function(par)
{
trace("construction with param="+par + " and another param=" + this.param);
this.property = "fff";
}
_root.newMCClass(Class,"c",["qwe"]);
// здесь должна вывести set, а не выводит (в конструкторе инициализирую своё свойство)
// а если выполнить это, то всё в порядке ...
// c = new Class();
// c.init("qweqfqqefqwef");
Мож есть какие соображения ?
Nox Noctis
23.09.2002, 15:30
вообще -
я не понял зачем све так хитро
и чего ты хочешь этим добиться :)
есть два замечания:
— "obj.init.apply(obj,params);"
зачем эплай ?.. инит - это же метод...
да еще наследный по классу... там и так с 'this' все в порядке ! :)
(короче, убери эплай - и все заработает резко лучше...
оставь "obj.init(params);")
— ты копируешь свойство, копируешь геттер и сеттер -
но от этого в объекте, В который копируешь,
это свойство не зарегистрируется как геттер\сеттер проперти...
так что при дальнейшем обращении c.property -
это будет обычное свойство без всяких геттеров
млин, классное решение нашёл ...
любуйтесь, narod !!!
//className - имя класса для запихания во внутрь мовика
//с именем instanceName, params - массив параметров
//передаваемый в конструктор Вашего класса
MovieClip.prototype.newMCClass = function (className, instanceName, params) {
var mc = this.createEmptyMovieClip(instanceName, this.maxDepth);
this.maxDepth++;
for (var i in className.prototype) mc[i] = className.prototype[i];
mc.init.apply(mc,params);
}
Class = function () {
this.init();
}
Class.prototype = new Object();
Class.prototype.init = function () {
this.addProperty("prop", Class.prototype.getf, Class.prototype.setf);
this.prop = "[def value]";
trace("construciton");
}
Class.prototype.method = function () {
trace("method");
}
Class.prototype.getf = function () {
trace("get - " + prop1);
return prop1;
}
Class.prototype.setf = function (param) {
trace("set - " + param);
this.prop1 = param;
}
_root.newMCClass(Class, "mc");
это какой угодно класс в мовик запихает и конструктор init вызовет, а если в конструкторе пропертя устанавливаются, то корректно их установит в мовике ...
:cool: :D
Не проще ли использовать это:
MovieClip.prototype.mcExtends = function(superClass) {
if (typeof superClass == "function") {
this.__proto__ = superClass.prototype;
if (typeof this.attachMovie == "undefined") {
// If not a movieclip, reconstruct the link from the class to
// MovieClip.prototype starting from the immediate inherited class
var o = this.__proto__;
// Check for multi-level inheritance
var p = o.__proto__.__proto__;
while (p != null) {
p = p.__proto__;
o = o.__proto__;
};
// Complete the prototype chain by linking back to MovieClip.prototype
o.__proto__ = MovieClip.prototype;
o.__constructor__ = MovieClip;
};
// remove the superclass from arguments and pass only the parameters
arguments.splice(0,1);
superClass.apply(this, arguments);
} else {
trace("mcExtends: Incorrect superClass type or path - "+ typeof superClass);
};
};
ASSetPropFlags(MovieClip.prototype, "mcExtends", 1);
А твой скрипт переписать таким образом:
//className - имя класса для запихания во внутрь мовика
//с именем instanceName, params - массив параметров
//передаваемый в конструктор Вашего класса
MovieClip.prototype.newMCClass = function (className, instanceName, params) {
var mc = this.createEmptyMovieClip(instanceName, this.maxDepth);
mc.mcExtends([className]);
this.maxDepth++;
}
Class = function () {
this.init();
}
. . .
. . .
_root.newMCClass("Class", "mc");
Преимущества следующие:
1) Нет циклов.
2) Доступны все свойства твоего класса, даже если они помечены невидимыми ( ASSetPropFlags(Class.prototype, "...", 1); )
:D А между className и class баальшая разница.
Отсюда и [className] в моей версии твоей функции...
ну Ты чел ....
sanxxx ...
Nox Noctis
30.11.2002, 18:07
2Hirn
мне кажется, или я этот код экстенда уже где-то видел точно в таком исполнении ? :)
(просто любопытство :) )
Izweni thto ne skopirowal eshe i eti strothki: :eek:
// Demo of Virtual Movieclip Class (VMC) for Flash MX
//
// Uses for VMC in Flash MX (in addition to Object.registerClass):
// - Reuse of symbols (a single symbol can be associated with different classes)
// - Dynamic binding of (on-stage) symbols to different classes
// - Separate graphics from external source code (ease of version control)
//
// Last revised: August 31, 2002
//
// Copyright 2001-2002 by Dave Yang / Quantumwave Interactive Inc.
// http://www.quantumwave.com/
//
// The magic behind VMC is mcExtends(). It associates movieclip instances
// with a class. The function extend() is used for inheritance so that
// super() works inside a constructor when using __proto__.
Teper' dumaju u tebja otleglo :cool:
Nox Noctis
02.12.2002, 18:29
да я в сущности и не наезжаю... =))
...просто обычно пишут откуда код взят =)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.