Hola a todos,
>>Xavi,
>>me estas siendo de gran ayuda, he adaptado tu c�digo a la
>>base de mi idea original. La base por que por ahora mueve el
>>cabezal fotograma a fotograma. Una ves que me expliques un
>>par de detalles implementar� las ecuaciones de Robert Penner
>>para cambiar la aceleraci�n de reproducci�n. Bueno este es el
>>c�digo con dos m�todos , avanzar y retroceder: <code>
>>
>>_global.controlCabecera = function(contenedor) {
>> this.ref_mc =
>>contenedor.createEmptyMovieClip("controlCabecera_MC",999);
>> this.ref_mc.contenedor = contenedor;
>> this.ref_mc.controlador = this;
>> this.contenedor = contenedor;
>>}
>>
>>controlCabecera.prototype = new Object();
>>
>>controlCabecera.prototype.retroceder = function() {
>>this.ref_mc.onEnterFrame =function(){ var current =
>>parseInt(this.contenedor._currentframe);
>> if(current>1) {
>> this.contenedor.prevFrame();
>> }else{
>> this.controlador.__end.call(this);
>> }
>>}
>>}
>>
>>controlCabecera.prototype.avanzar = function() {
>> var total = parseInt(this.contenedor._totalframes);
>> this.ref_mc.onEnterFrame =function(){
>> var current = parseInt(this.contenedor._currentframe);
>> if(current<total) {
>> this.contenedor.nextFrame();
>> }else{
>> this.controlador.__end.call(this);//aqu� llamas al m�todo
>>que detiene el onEnterFRame, pero para que utilizas el
>>'.call(this)' } } }
>>
>>controlCabecera.prototype.__end = function() {
>> delete this.onEnterFrame;
>>this.controlador.onStop.call(this.contenedor);//aqu� tampoco
>>entiendo por que pones esta frace, se supone que si detienes
>>el onEnterFrame el cabezal tambi�n se detiene //� no?. }
>>
>>
>></code>
>>Me parece que esta forma de manejar el c�digo es la mas
>>coherente , 1� declaramos una funci�n en global para acceder
>>a ella de cualquier parte, luego la prototipamos como un
>>nuevo objeto (controlCabecera.prototype = new
>>Object();) y a partir de este momento controlCabecera es un
>>objeto al cual le podemos a�adir m�todos, como avanzar() y
>>retroceder().
Exactamente, esa es la idea de lo programaci�n orientada a objetos:
encapsular a cada objeto para que tenga un funcionamiento independiente
del resto de objetos pero que tenga sistemas para comunicarse con el resto
del mundo. Y siendo puritanos controlCabecera, desde el momento que
'prototipamos' se convierte en una clase que podemos instanciar. Esas
instancias ser�n ya los objetos :P
>>Tengo otra duda , � no ser�a mas censillo
>>declarar el 'delete this.onEnterFrame;' dentro de los m�todos
>>avanzar y retroceder. En este caso � para que otro m�todo ?.
Esta pregunta y los comentarios que has puesto en el c�digo son todo lo
mismo... Primero comento el razonamiento que sigo a la hora de decidir qu�
m�todos tienen mis clases y en este caso pq met� un m�todo encargado de
hacer el delete this.onEnterFrame. F�jate que, si no existiera dicho
m�todo, tanto en el m�todo avanzar como retroceder tendr�a que haber un
delte this.onEnterFrame (y el callback a onStop). Cree un m�todo nuevo
para no duplicar c�digo y asignar funcionalidades de forma m�s espec�fica.
F�jate que de esta forma podr�amos a�adir otros m�todos distintos a
avanzar o retroceder como gotoEnd o gotoHome, etc. Si no utiliz�ramos el
m�todo __end a�n estar�amos duplicando m�s c�digo. Por otra parte eso
facilita el mantenimiento. Si quisi�ramos a�adir esta clase, al tener
repartidas las responsabilidades en distintos m�todos, ser�a f�cilmente
adaptable permitiendo herencia.
Ahora lo otro, pq utilizo call y pq utilizo this. F�jate que la clase es
un Object y que como tal no tiene definidos ni onEnterFrame ni ninguna
mandanga relacionada con los clips de pel�cula. Para solventar eso al
instanciar la clase, esta crea un clip de pel�cula donde se defina
(par�metro del constructor). En ese punto el objeto conrolCabecera
simplmente almacena una referencia a ese clip de pel�cula y nos sirve para
interactuar con �l.
De esta forma los m�todos que tiene controlCabecera se tienen que aplicar
sobre el clip de pel�cula y no sobre el Object en s�. El clip de pel�cula
contiene un referencia (almacenada en la var 'controlador') al objeto
ControlCabecera.
Por todo este rollo el que nos permite controlar realmente el movimiento
es el clip de pel�cula y no el Object. Al igual que no tiene sentido
aplicar un onterFrame a un Object, tampoco tiene sentido aplicar un delete
this.onEnterFrame a ese mismo Object. Para solucionar esa incoherencia, el
clip de pel�cula (en el que s� tiene sentido el onEnterFrame) ejecuta los
m�todos de ControlCabecera como si fueran suyos sin que lo sean (con el
call()). Esto nos permite encapsular o hacer totalmente transparente el
uso de la clase sin tenernos que preocupar de si hay por ah� un MC
escondido o no.
Por todo esto, cuando queremos borrar el onEnterFrame tenemos que hacer:
<code>
this.controlador.__end.call(this);
</code>
Esta linea de c�digo se est� ejecutando en el �mbito del movie Clip (this
apunta al MC y no al Object). Con this.controlador accedo al objeto. Y
utilizo call para que esa llamada se ejecute en el �mbito del MC y no del
object (sin� delete this.onEnterFrame carece de sentido).
>>Bueno espero no aburriros demasiado con este tema pero creo
>>que mis dudas pueden ser �tiles a mas de uno. Gracias de ante
>>mano a toda la comunidad de esta lista, de la cual estoy
>>orgulloso de pertenecer.
Pues eso, que espero que te haya podido aclarar algo un poquito...
Saludos a todos
Xavi Beumala
<!-------------------------------
Lista ASNativos:
subscripciones/desubscripciones
http://www.sidedev.net/asnativos
-------------------------------->