PDA

Просмотр полной версии : [AS2] Работа Классов или их видимость или нужно смотреть %))


__i
22.12.2005, 21:19
Проблема такая:

Есть несколько классов extends MovieClip.

Нарисованы к ним клипы, причем они вложены друг в друга - ща на пальцах покажу чтоб было ясно:

Мувик а_мс, его класс А_МС

class A_MC extends MovieClip{
var bmc:B_MC;
function set any(e){
....
bmc.any(e);
....
}
}

в него вложен мувик в_мс, его класс В_МС

class В_MC extends MovieClip{
function any(e){
trace(e);
}
}

теперь если я складываю этот мувик (А_МС) на сцену то все нормально работает, но если я атачу этот мувик функция any не срабатывает!!!

выглядит это где-то так:

this.attachMovieClip('a_mc_linkName','my_a_mc',1);
my_a_mc.any='77'

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

Antares
22.12.2005, 21:39
Скорее всего дело в загрузке кадров во врейме n и попытке заюзать их во фрейме m, где m < n.

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

__i
23.12.2005, 14:01
всего используеться 1 кадр.

теперь что ты подразумеваешь под композицией?. Классы сами создают свои мувики, а не являються наследниками мувиклипа?

MOHCTEP
23.12.2005, 14:04
А если так:
class A_MC extends В_MC{

По идее, мув класс будет наследоваться и так.

Antares
23.12.2005, 14:04
Что-то подобное:

import com.novemberain.visual.IVisualInterface;
import mx.transitions.*;

/**
*
* @author
* @version
**/
class com.novemberain.visual.VisualObject implements IVisualInterface
{
private var __viewport:MovieClip;

function VisualObject( mc:MovieClip )
{
__viewport = mc;
}


/**
*
* @usage
* @return
*/
public function getVisualObject(): Void
{
return __viewport;
}


/**
*
* @usage
* @param x
* @param y
* @return
*/
public function move( x:Number, y:Number ): Void
{
trace('Object ' + __viewport + ', called move to ' + [x, y]);

__viewport._x = x;
__viewport._y = y;
}


/**
*
* @usage
* @param state
* @return
*/
public function changeState( state:String ): Void
{
if(state) __viewport.gotoAndStop(state);
}


/**
*
* @usage
* @param x
* @param y
* @return
*/
public function slideTo( x:Number, y:Number, relative:Boolean, time:Number, callback:Function ): Void
{
if(relative)
{
var xTo:Number = __viewport._x + x;
var yTo:Number = __viewport._y + y;
} else
{
var xTo:Number = x;
var yTo:Number = y;
}

var xTween:Tween = new Tween(__viewport, '_x', Elastic.easeOut, __viewport._x, xTo, time, true );
var yTween:Tween = new Tween(__viewport, '_y', Elastic.easeOut, __viewport._y, yTo, time, true );

if(callback) xTween.onMotionStopped = callback;

xTween.start();
yTween.start();
}

/**
*
* @usage
* @return
*/
public function show( ):Void
{
__viewport._visible = true;
}

/**
*
* @usage
* @return
*/
public function hide( ):Void
{
__viewport._visible = false;
}

}

__i
23.12.2005, 14:43
2 Монстр - класс в_мс не явлдяеться наследником а_мс

Ну хорошо написал ты этот код и что дальше? или намекаешь что все мои мувики теперь должны обрастать таким VisualObject?

как это у меня сделано:

class A_mc extends MovieClip{
var num:TextField;
var b_mc:B_mc;
function set mcName(e)
{
this.num.text='A '+e;
this.b_mc.mcName =this.num.text;
}

}

class B_mc extends MovieClip{
var num:TextField;

function set mcName(e)
{
this.num.text='B '+e;
}

}

в первом кадре 1 фрейма
my_1_mc.mcName = 'legit';

this.attachMovie('a_mc','my_2_mc',2,{_x:200});
this.my_2_mc.mcName='priatta4en ';

тут я аттачу архив с примером - - блин не загружает файл
так объясню - в библиотеке 2 клипа a_mc и b_mc - им установлены соответствующие классы и линкаджнеймы,
b_mc - внутри 1 текстовое поле, имя num и фон.

a_mc - внутри 1 текстовое поле, имя num, фон и мувик b_mc, имя b_mc.

на выходе получаем в для my_1_mc имена и там и там,
для my_2_mc имя только у a_mc, во вложеном кату имени , сеттер не сработал(и методы тоже не работаеют)

как можно это переписать чтоб всегда работало ? и при аттаче и так?

Antares
23.12.2005, 14:51
Я ни на что не намекаю. Я сказал, что считаю нужным. Более того, раз ты продолжаешь говорить "все мои мувики", значит, разницу ты не уловил.

Решать только тебе.

__i
23.12.2005, 15:09
объясни мне, где я неправ и почему нужно делать так как ты, а не как я в чем различие ?

__i
23.12.2005, 15:48
в принципе то есть решение этой проблемы но оно очень корявое!!!!!!
var num:TextField;
var b_mc:B_mc;
function set mcName(e)
{
this.num.text='A '+e;
this.onEnterFrame = function(){
this.b_mc.mcName =this.num.text;
delete this.onEnterFrame;
}
}

Antares
23.12.2005, 16:16
объясни мне, где я неправ и почему нужно делать так как ты, а не как я в чем различие ?
Потому что так я могу добавить какую угодно функциональность, наследую класс. А функциональность визуального объекта всегда будет доступна через обращение к свойству.

Это не значит, что ты не прав. Это значит, что есть "лучшие техники", а есть просто решения.

__i
23.12.2005, 16:26
а можешь объяснить последовательность выполнения кода в моем случаи? как я понимаю это выглядит так:

аттачим мувик А ,"загрузилися" только его класс и ему пофиг в этом кадре какие мувики в него вложены и есть ли у них всои методы?, и только во время перехода на новый кадр (всмысле событие onEnterFrame а не по тайм лайну) он раздупляеться что у вложеных мувиков тоже есть методы определенные классом
и загружает(позволяет использовать) их, причем если это не метод а обычное свойство то все отрабатывате корректно!!! (если написать в._х=33 то все сработает).