Comunidad de diseño web y desarrollo en internet online

error 1120 con script con evento sobre un símbolo

Citar            
MensajeEscrito el 21 Abr 2012 11:23 pm
Buenas,

Tengo un problemilla que se me antoja que no es muy complicado pero mi nivel en AS3 es bastante bajo aún.

Tengo una animación con un conjunto de imágenes que se mueven. Cada una de ellas es un símbolo movie clip.
Estoy intentando que cuando el usuario haga click sobre una de las imágenes, pase algo, como por ejemplo que dejen de moverse las imágenes.

Ésto es lo que he hecho en AS3:

Código ActionScript :

mysymbol.addEventListener(MouseEvent.C… fl_MouseOverHandler_2);

function fl_MouseOverHandler_2(event:MouseEvent):…
{
stop();
}



Pero nada ocurre, las animación no se para. Y además me aparece el siguiente error:

Symbol 'mysymbol', Layer 'Actions', Frame 1, Line 2 1120: Access of undefined property mysymbol.

Dicho símbolo está efectivamente en la pantalla y el nombre es correcto (que podrían haber sido los fallos), así que no sé si es que no se puede aplicar dicho script a símbolos en movimiento (creo que tampoco me funciona en estático) o me falta algo. ¿Definir la variable (del símbolo) o algo así (no sé cómo)?

Agradecería cualquier ayuda.
Muchas gracias de antemano.
Saludos

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Abr 2012 01:08 am
Prueba así:

Código ActionScript :

//Si no tienes importada la clase display.MovieClip más arriba importala al principio del script
import flash.display.MovieClip;

mysymbol.addEventListener(MouseEvent.CLICK, detener);

function detener(event:MouseEvent):void {
   //Como ya no vamos a querer detenerlos de nuevo, al menos hasta que los hagamos moverse de nuevo, eliminamos la escucha
   e.target.removeEventListener(MouseEvent.CLICK, detener);
   var elMcObjetivo:MovieClip = event.target as MovieClip;
   elMcObjetivo.stop();
}
Pruébalo y nos cuentas.
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 22 Abr 2012 09:57 am
Buenas de nuevo y muchas gracias,

Pues no hay manera. Además ahora me da también otro error:
Undefined property e

Pero no sé si tengo que sustituir algo de lo que has puesto dentro de la función. También lo he intentado de esa manera, pero nada.
Lo único que se me ocurre a mí, es que igual tengo que hacer algo en la animación del movie clip? Porque por defecto sólo aparece la primera frame, pero como yo quiero que el script funcione durante todos los frames...Lo que pasa es que tengo como 1200 frames .

Gracias, un saludo

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Abr 2012 10:47 am
En efecto, una ida de olla mía, cambia esta línea:

Código ActionScript :

e.target.removeEventListener(MouseEvent.CLICK, detener);
Por esta otra:

Código ActionScript :

event.target.removeEventListener(MouseEvent.CLICK, detener);
Era un error muy facilón de encontrar, la única e que te metí en el código.

A parte, el código te debería funcionar en todos los frames si está colocado en el primer frame de tu película.

Lo otro, es que una vez parado el MovieClip, su escucha MouseEvent.CLICK a la función parar() ya no tiene sentido, pues no puedes volver a pararlo. Si quisieras que el objeto que has parado, por ejemplo se volviera a mover, podrías configurar su MouseEvent.CLICK a una función que se llame iniciar(), y cuando inicie, le vuelves a configurar el listener a parar(), te pongo los ejemplos

Código ActionScript :

mysymbol.addEventListener(MouseEvent.CLICK, detener);

function detener(event:MouseEvent):void {
   //Eliminamos la escucha a detener
   event.target.removeEventListener(MouseEvent.CLICK, detener);
   
   //creamos la escucha a iniciar
   event.target.addEventListener(MouseEvent.CLICK, iniciar);
   
   //Resto de acciones
}

function iniciar(event:MouseEvent):void {
   //Eliminamos la escucha a iniciar
   event.target.removeEventListener(MouseEvent.CLICK, iniciar);
   
   //creamos la escucha a detener
   event.target.addEventListener(MouseEvent.CLICK, detener);
   
   //Resto de acciones
}


Pruébalo y nos comentas,
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 22 Abr 2012 11:34 am
Muchas gracias de nuevo.

Pues me sigue dando el mismo error.
Estoy intentando subir el archivo por si me hicieras el favor de echarle un vistazo.
Pero vamos, se me ha ocurrido que a lo mejor tengo que declarar la variable antes (lo he visto escrito por algún lado), pero no sé cómo hacerlo correctamente.
Se me ocurre hacer ésto:
var mysymbol: Objeto;

Ahora me da error con lo de Objeto:

1046: Type was not found or was not a compile-time constant: Objeto.

Es que no sé cómo tendría que definir la variable. A parte de un Objeto..

Gracias, un saludo.

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Abr 2012 11:49 am
Hola de nuevo.

Bueno, disculpas por mis fallos.
Resulta que poniendo mi script inicial en la Escena principal en lugar de en el símbolo, sí funciona.
Yo lo estaba intentando en el símbolo mismo. y es que no controlo todavía muy bien cómo y cuando manejar el símbolo en lugar de la escena general.

En realidad también lo había intentado previamente en la Escena principal, pero posiblemente al cambiar algo no me funcionaba.

Muchísimas gracias por tus útiles scripts.
Un saludo, y siento no haberme dado cuenta de ésto antes!

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Abr 2012 12:20 pm
De nada hombre, si tienes más problemas nos cuentas.

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 22 Abr 2012 06:52 pm
Hola de nuevo!

Abducted, gracias.
No sabía si empezar un nuevo tema o no, pero el problema que tengo ahora tiene relación con el anterior y está incluido en el mismo.
Además de parar la animación al hacer un click, me gustaría que un objeto (también un movie clip) que está en la librería apareciera en escena.
Entonces, he incluído lo siguiente dentro de la función:

minuevoMC.visible=true;

Pero como me vuelve a aparecer el mensaje de siempre (en esta ocasión para este objeto), he definido también la variable antes:

var minuevoMC;

e incluyo también, por si acaso, el código que me comentaste:


import flash.display.MovieClip;


¡Pero me sigue dando el mismo error!
No sé cual es el problema ahora.

Muchas gracias de antemano y un saludo.

p.s No tengo problema en abrir un nuevo hilo!

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Abr 2012 07:00 pm
La variable miNuevoMc, has de declararla así para que la interprete como un movieClip

Código ActionScript :

var minuevoMC:MovieClip = getChildByName('nombre_del_Mc') as MovieClip

Y después ya puedes trabajar con la variable.

Código ActionScript :

minuevoMC.visible=true

Pruébalo y nos comentas,
un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 22 Abr 2012 07:25 pm
Muchas gracias,

He hecho como dices, Abducted, pero no aparece el objeto en cuestión.
No aparecen errores pero en Output me dice lo siguiente:

TypeError: Error #1009: No se puede acceder a una propiedad o a un método de una referencia a un objeto nulo.
at flashworks_fla::MainTimeline/fl_ClickToGoToWebPage_13()


He probado con diferentes objetos, algunos muy simples, pero es lo mismo.
Gracias, un saludo

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Abr 2012 07:49 pm
Enseña el código que tienes generado pelase.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 22 Abr 2012 08:13 pm
Hola, sí, perdona.
Éste es el código:

import flash.display.MovieClip;
var minuevoMC:MovieClip = getChildByName('minuevoclip') as MovieClip;
mondrian.addEventListener(MouseEvent.CLICK, fl_ClickToGoToWebPage_13);
function fl_ClickToGoToWebPage_13(event:MouseEvent):void
{
minuevoMC.visible=true;
}

También he probado metiendo las primeras líneas dentro de la función.

Gracias

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Abr 2012 08:51 pm
No estarás ocultando el mc que quieres mostar con alpha, en vez de con la propiedad visible ¿no?.

El caso es que yo he hecho el código y me funciona percetamente

Código ActionScript :

import flash.display.MovieClip;

boton.buttonMode = true;
boton.addEventListener(MouseEvent.CLICK, clickPag13);

function clickPag13(event:MouseEvent):void {
   var minuevoMC:MovieClip = getChildByName('minuevoclip') as MovieClip;
   if (minuevoMC.visible == true) {minuevoMC.visible = false}
   else {minuevoMC.visible = true}
}

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 22 Abr 2012 10:11 pm
Buenas de nuevo.

He puesto el código que has escrito, Abducted, y me sigue dando el mismo "error" (no es exàctamente un error sino que aparece en Output), pero no me aparece el movie clip.
Lo que he hecho ha sido substituir 'boton' por el nombre de mi movieclip.

¿No tendré que especificar dónde lo pongo?
Pero bueno, más bien parece que no estuviera definido o algo.

un saludo

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 Abr 2012 10:23 pm
No me has respondido lo importante, ¿de que manera has ocultado el movieClip que quieres mostrar?, la excepción ha de estar en otro trozo de código diferente al que me has puesto, por que ese, tal cual está no da error, descarga de aquí el fla del ejemplo:
FLA

Si estás dispuesto, pega todo el código aquí, o pásame el fla y te ayudo a depurarlo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 23 Abr 2012 09:21 am
Hola,

Sigue sin salir. El código que tengo es exáctamente el mismo que has puesto (cambiando el nombre de los movie clips). Incluso he eliminado todo el código anterior y dejado sólo éste, pero nada.
El movie clip está en "visible". (No había entendido bien la pregunta).
Es como si hubiera que definir el movie clip "boton" antes, a juzgar por el error (no aparece en Errores, sino en Output) ya que lo considera como objeto "nulo".

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Abr 2012 09:26 am
Por cierto, dicho "Error" aparece cuando hago click en el objeto ("boton").

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Abr 2012 11:02 am
Define todos tus movieclips siempre antes de usarlos, por ejemplo:

Código ActionScript :

var boton:MovieClip = getChildByName('nombre del boton') as MovieClip;
boton.addEventListener(MouseEvent.CLICK, clickPag13);


Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 23 Abr 2012 11:42 am
Hola!

Bueno, muchas gracias, como siempre.
Ya he visto el fallo.
He leído mal parte de tu post, Abducted, y creía que el link era para subir mi archivo, no para ver el tuyo.
Ahora que lo he hecho y estudiado he encontrado lo que estaba haciendo mal.
Y es que yo no estaba colocando el movieclip a ver en la pantalla (con la propiedad no visible), sino que simplemente creía que con el código se cogería de la librería directamente (por eso pensé en un momento que a lo mejor hacía falta especificar dónde colocarlo).

Ahora igual tendré que especificar dónde colocarlo, etc. Pero bueno, si tengo algún problema con ello (tengo ya algo de información y con lo que he aprendido aquí estoy más preparado para ello) abriría otro hilo.

¡Muchísimas gracias por toda tu ayuda!

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Abr 2012 12:01 pm
Lo suyo, lo suyo, es sacarlo desde la biblioteca, para instanciar un objeto desde la biblioteca, primero asegúrate que está vinculado a as3. Después instancialo así

Código ActionScript :

//Si nuestro objeto está vinculado a AS3 con el nombre de "boton"
import flash.display.MovieClip;

var miMC:MovieClip = new boton() as MovieClip;
addChild(miMC);

Yo en el ejemplo no lo he hecho por comodidad, por eso se lo he tirado directamente al stage

Espero te sirva,
un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 23 Abr 2012 02:20 pm
gracias!.
Me otorgas cierto nivel en AS3, jeje, pero mi nivel es muy bajo (no tanto en Flash) xd
Lo he podido hacer, así que fenomenal, pero si quiero que al hacer click en el nuevo movie clip éste desaparezca, ¿cómo podría hacerlo?
Sé que es con RemoveChild();
que he comprobado que funciona. Pero funciona sobre símbolos que están en la pantalla desde el ppio. si lo hago sobre el símbolo que aparece tras el click, no sé cómo hacerlo.

Por ejemplo,

Código :

import flash.display.MovieClip;
var bota:MovieClip = new newmovie() as MovieClip;
bota.buttonMode = true;
bota.addEventListener(MouseEvent.CLICK, clickPag14);
function clickPag14(event:MouseEvent):void 
{
  removeChild(bota);
}



no me hace nada. Tampoco me da errores. Lo tengo puesto después del script anterior.
Pero no sé si el hecho de que al principio de la animación dicho objeto no está en pantalla y ésto hace que la manera en que defino la variable no sea correcta. Pero si la defino con getChildByName me da error.
Bueno, muchas gracias, no pregunto ya más.xd.

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Abr 2012 03:11 pm
Bueno, en realidad yo tampoco soy un hacha de AS3, ya habrás visto que cometo más de una ida de olla. Te lo voy a intentar explicar lo mejor que pueda y espero no equivocarme en nada esta vez

Código ActionScript :

import flash.display.MovieClip;
import flash.events.MouseEvent;

var miMC:MovieClip = new bota() as MovieClip;
addChild(miMC);

miMC.addEventListener(MouseEvent.CLICK, eliminar);
 
function eliminar (event:MouseEvent):void {
   var objetivo:MovieClip = event.target as MovieClip;
   objetivo.removeEventListener(MouseEvent.CLICK, eliminar);
   removeChild(objetivo);
}
Bien, si te fijas, ahora estamos definiendo la función eliminar, y le estamos pasándo como parámetro la variable event que contiene el evento del mouse. (En este caso el CLICK sobre miMC).

Código ActionScript :

function eliminar (event:MouseEvent)
Ahora nuestra variable event tiene varios parámetros a los que podemos recurrir, uno de ellos es "target" -> el objetivo del click. (Que en este caso es bota), por lo que recurriremos a este parámetro para eliminar el objeto

Primero almacenamos el mc sobre el que se ha hecho click en una variable

Código ActionScript :

var objetivo:MovieClip = event.target as MovieClip;

Después, antes de eliminar el objeto eliminaremos la escucha para no ir dejando basura

Código ActionScript :

objetivo.removeEventListener(MouseEvent.CLICK, eliminar);

Y por último lo borraremos con removeChild

Código ActionScript :

removeChild(objetivo);
Recurrir a la variable event es bueno, pues al no estar indicandole un mc concreto,te vale para usarlo con cualquier objeto. Con lo que si además de bota creásemos un calcetín, podríamos eliminarlo con la misma función

Código ActionScript :

var miCalcetin:MovieClip = new calcetin() as MovieClip;
miCalcetin.addEventListener(MouseEvent.CLICK, eliminar);
Cuando le hiciéramos click sobre calcetin, el resultado sería igual al anterior, sin necesidad de haber vuelto a definir una función para eliminar calcetin.

Si no me he explicado bien en algún punto me comentas please.
Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 23 Abr 2012 05:43 pm
Gracias,

no me sale. He probado el mismo código con objetos que están en la pantalla desde el ppio y sí que se eliminan (con getchildByName()), pero no con el objeto que aparece al hacer click en otro.
Se me ocurre, bajo mi excaso conocimiento, que a lo mejor el problema está en que el objeto a eliminar al comienzo de la animación no está y sólo aparece con el click sobre otro objeto.

Entonces haciendo algo como lo que me decías en el primer caso de :

Código :

if (minuevoMC.visible == true) {minuevoMC.visible = false}

   else {minuevoMC.visible = true}



Algo así (sólo es una idea):

Código :


if(var elnuecoMC==true)
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
var bote:MovieClip = getChildByName('elnuevoMC') as MovieClip;
bote.buttonMode = true;
bote.addEventListener(MouseEvent.CLICK, eliminar);
function eliminar (event:MouseEvent):void {
   var objetivo:MovieClip = event.target as MovieClip;
   objetivo.removeEventListener(MouseEvent.CLICK, eliminar);
   removeChild(objetivo);
}
else
{

import flash.display.MovieClip;
import flash.events.MouseEvent;
var bota:MovieClip = new elnuevoMC() as MovieClip;
addChild(bota);
bota.addEventListener(MouseEvent.CLICK, eliminar);
function eliminar (event:MouseEvent):void {
   var objetivo:MovieClip = event.target as MovieClip;
   objetivo.removeEventListener(MouseEvent.CLICK, eliminar);
   removeChild(objetivo);
}
}



quiero decir, no sé si hay alguna manera de comprobar si el objeto está ya en pantalla para saber qué tipo de variable es, o cómo la llamamos.
Si utilizo getChildByName(); me da error ya que el símbolo no está al comienzo de la animación (supongo que es por ésto), y llamándola como indicas parece que no funciona ya que cuando se hace click en el símbolo ya está en pantalla (supongo tb que este es el motivo).
Igual se podría crear una variable que aunara ambas posibilidades.
Por ejemplo (sé que es una burrada):

Código :

var miMC:MovieClip = elnuevoMC() OR  getChildByName('elnuevoMC') as MovieClip ;


Pero vamos, no sé si van por ahí los tiros. Yo por buscar soluciones.

Gracias de nuevo. Saludos.

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 23 Abr 2012 06:11 pm
:crap: :crap:
Me parece que no has comprendido nada de lo que te he explicado.

El problema es que tienes fallos demasiado básicos.
Deberías leerte unos tutoriales, antes de seguir intentando hacer tu código, si no, vas a ir dando palos de ciego a cada paso.

Te dejo unos cuantos, revísate la sección de tutos también
Introducción básica a Actionscript 3, clases, tipos de datos
Actionscript 3.0 Parte 2: Botones, eventos, getURL y enlaces
Objetos visibles y contenedores en ActionScript 3
Cómo usar MovieClips en ActionScript 3
Manipulación múltiple de MovieClips en ActionScript 3
Drag and Drop de un MovieClip en Actionscript 3

Un saludo.

Por Abducted

Claber

489 de clabLevel

3 tutoriales

Genero:Masculino  

Mentalidad Renovada

chrome
Citar            
MensajeEscrito el 23 Abr 2012 06:16 pm
ok, thanks.
Saludos

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 Abr 2012 12:30 am
He probado y probado el código, incluso en la animación que pusiste como ejemplo (que es más sencilla) y no funciona.
Al poner addChild ();se muestra el símbolo sin llamarlo, y si no se añade da error.
Seguiré informándome porque no controlo AS3, ni mucho menos, pero vamos que este código no funciona para el caso que yo propongo, si no me equivoco. Mi problema es que no sé cómo corregirlo o adaptarlo pero en ello estamos.
ciao

Por sharinglanguage

21 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 Abr 2012 12:18 pm
Bueno, para demostrar que me lo curro un poco y no dejar el tema así, pongo el siguiente código que funciona perfectamente. El 'problema' es que lo hace con objetos escondidos. Teniendo éstos en la biblioteca es más complicado (lo que estaba intentando hacer).
Lo suyo tb es crear un Array, ya que son varias imágenes.

[code]
import flash.display.MovieClip;
var boto:MovieClip = getChildByName('FirstMC') as MovieClip;
boto.buttonMode = true;
boto.addEventListener(MouseEvent.CLICK, clickPag13);
function clickPag13(event:MouseEvent):void {
var minuevoMC:MovieClip = getChildByName('newMC') as MovieClip;
if (minuevoMC.visible == true) {minuevoMC.visible = false}
else {minuevoMC.visible = true}
}

import flash.display.MovieClip;
var boton:MovieClip = getChildByName('newMC') as MovieClip;
boton.buttonMode = true;
boton.addEventListener(MouseEvent.CLICK, clickPag14);
function clickPag14(event:MouseEvent):void {
var minuevoMC:MovieClip = getChildByName('newMC') as MovieClip;
if (minuevoMC.visible == true) {minuevoMC.visible = false}

}

Por sharinglanguage

21 de clabLevel



 

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.