Comunidad de diseño web y desarrollo en internet online

referencia a un MovieClip existente en el stage :(

Citar            
MensajeEscrito el 17 Jun 2009 11:56 pm
Gente, estoy asiendo un juego de plataformas sencillo.. les dejo mi codigo.. y el error

esta es la clase del personaje principal.

Código ActionScript :

package {
   import flash.display.MovieClip;
   import flash.events.Event;
   public class Personaje extends MovieClip {
      //Variables.
      public var velLateral:Number=3;
      public var friccion:Number=0.8;
      public var friccionAire:Number=0.8;
      public var gravedad:Number=-3;
      public var tiempoSalto:Number=4;
      public var salto:Number=30/tiempoSalto;
      public var velMaxima:Number=20;

      public var puntoIzq:Number=-15;
      public var puntoDer:Number=15;
      public var puntoBajo:Number=25;
      public var puntoArriba:Number=-25;

      public var dx:Number;
      public var dy:Number;
      public var vel:Number;
      public var saltando:Boolean;
      public var empezoSalto:Number;
      
      //Constructor.
      public function Personaje():void {
         trace("personaje creado");
         addEventListener(Event.ENTER_FRAME,aplicarMovimiento);
      }

      function inicializarPersonaje():void {
         if (this.dx!=0) {
            this.dx=0;
            this.dy=0;
            this.saltando=true;
            this.empezoSalto=0;
         }
         this.friccion=friccion;
         this.vel=velLateral;
         this.salto=salto;
      }
      
      public function aplicarMovimiento(evt:Event):void{
      var mc:MovieClip = evt.currentTarget as MovieClip;
      mc.x+=mc.dx;
      mc.dx*=mc.friccion;
   
      if(mc.dx>velMaxima){
         mc.dx=velMaxima;
      }else if(mc.dx<-velMaxima){
      mc.dx=-velMaxima;
      }
   
      mc.y+=mc.dy;
   
      if(!mcSuelo.hitTestPoint(mc.x,mc.y+puntoBajo+1,true)){
      mc.saltando = true;
      }
   
      if(mc.saltando){
      mc.suelo = 0;
      mc.dy-=gravedad;
      if(mc.dy>salto*tiempoSalto){
         mc.dy = salto*tiempoSalto;
      }
   }
   
   checarColisiones(this);
   
   }
      public function checarColisiones(mc:MovieClip):void {
         //pega abajo
         while (mcSuelo.hitTestPoint(mc.x,mc.y+mc.puntoBajo,true)) {
            mc.saltando=false;
            mc.y--;
            mc.dy=0;
         }
         //pega arriba
         while (mcSuelo.hitTestPoint(mc.x,mc.y+mc.puntoArriba,true)) {
            mc.y++;
            mc.dy=Math.abs(mc.dy);
         }



         //pega izq
         while (mcSuelo.hitTestPoint(mc.x+mc.puntoIzq+1,mc.y,true)) {
            mc.x++;
            mc.dx=0;
         }
         while (mcSuelo.hitTestPoint(mc.x+mc.puntoIzq+1,mc.y+mc.puntoBajo/2,true)) {
            mc.x++;
            mc.dx=0;
         }

         //pega der
         while (mcSuelo.hitTestPoint(mc.x+mc.puntoDer-1,mc.y,true)) {
            mc.x--;
            mc.dx=0;
         }
         while (mcSuelo.hitTestPoint(mc.x+mc.puntoDer-1,mc.y+mc.puntoBajo/2,true)) {
            mc.x--;
            mc.dx=0;
         }
      }

   


   }
}


EL erro es el siguiente


Accseso a una propiedad mcSuelo no definida origen : while (mcSuelo.hitTestPoint(mc.x+mc.puntoDer-1,mc.y,true)) {


resulta.. q mcSuelo.. es un movieClip q esta en el stage con ese nombre de instancia... ya probe escribiendo

origen : while (parent.mcSuelo.hitTestPoint(mc.x+mc.puntoDer-1,mc.y,true)) {


pero el error es el mismo Auxiiiilio :cry: :P
y
Gracias de antemano

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 18 Jun 2009 12:32 am
no tengo mucha idea de as3 de momento asi que lo mismo no te sirve de nada mi consejo, o es una tonteria.. pero voy a arriesgarme:

probaste a exportar mcSuelo poniendole mcSuelo como nombre de clase?

Por riolcrt

5 de clabLevel



 

chrome
Citar            
MensajeEscrito el 18 Jun 2009 05:13 am
mmm... la verdad no, pero en ese caso me estaria refiriendo a la Clase, no a la instancia..

voy a probar y t aviso como fue!.. aver q sale gracias :wink:

Por feresr

70 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Jun 2009 06:39 am
Son varias cosas
1.-Efectivamente DEBE ser "parent.mcSuelo", puesto que mcSuelo es un MC que pertenece a la película principal
Claro, que Flash tiene un problema cuando escribimos "parent". Flash, lo único que sabe de parent es que es un "DisplayObject", por tanto no podemos usar más que métodos y propiedades de la Clase DisplayObject. Claro, que nosotros sabemos que "parent" no sólo es un DisplayObject, sino que es nuestra película principal. Así que lo que hacemos es una "conversión de cast", y le decimo que es de tipo MovieClip, vamos

Código ActionScript :

MovieClip(parent).mcSuelo

El motivo de usar una "conversión de cast" a MovieClip -si quisiéramos ser más puristas le diríamos que es de la Clase a la que pertenece nuestra película principal- es porque es la única Clase nativa de Flash que "no es sellada", vamos que admite que preguntemos por variables suyas
2.-Aun así, "parent" NO existe hasta que no se haya añadido el personaje al Stage. Me explico, en la película principal podemos tener un

Código ActionScript :

var personaje:Personaje=new Personaje()

En ese mismo momento ya existe personaje, aunque hasta que no hacemos es addChild(personaje), ese "personaje" no tiene padre. Así que debemos usar el evento ADD_TO_STAGE. Así que se suele hacer algo como

Código ActionScript :

public function Personaje():void 
{
     if (stage) init();
    else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function init(e:Event = null):void 
{
      trace("personaje añadido al Stage"); 
      removeEventListener(Event.ADDED_TO_STAGE,init)
      addEventListener(Event.ENTER_FRAME,aplicarMovimiento); 
}

Vamos, en la función "constructora" añadimos el listener ADDED_TO_STAGE y llamamos a la función "init". Es en la función "init" donde le añadimos los listeners de ENTER_FRAME que usan parent.
3.-No tiene nada que ver con el nombre de la Clase

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Jun 2009 09:52 pm
bueno.. desgraciadamente perdi los archivos... todos ¬¬ asiq que no puedo corroborar si lo que dice eliseo 2 funciona..

probe nombrar el nombre de clase pero no reslto..
estoy escribiendo el codigo nuevamente... pero esta vez.. creo(tanto el suelo como al personaje) desde la clase Main. (la clase de documento) asique ya puedo referirme a ambos sim problema..

pero ahora surgio otro..

Como sabemos la gravedad tiene una aceleracion.. y las collisiones del personaje con el suelo.. las detecto con hitTestPoint.

el problema es q como tiene una aceleracion.. cuando el personaje cae fuerte.. o rapido.. queda enterrado medio metro en el suelo XD.. por q es recien cuando la funcion enterframe se repite y ase el hittestpoint... no se como solucionarlo :( si alguien programa juegos.. y me da una ayudaaa 10000 gracias..

:)

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 19 Jun 2009 06:42 am
La idea de un juego de "plataformas" con un personaje que salta, se simplifica mucho el problema cuando el "punto de registro" del "suelo" está en la parte superior y el "punto de registro" del "personaje", está en la parte inferior

Código :

 0
___
/\+

+--------
 --------

(perdón por el burdo dibujo), el "+" es el punto de registro.
Así, cuando se hace la comprobación con el hitTestPoint, además de poner dy=0, igualamos la "y" del personaje a la "y" del suelo

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 19 Jun 2009 08:27 pm
Segi tu consejo eliseo2 !. ahora bien, tengo otra situacion..

Tengo el Stage (el .fla principal llamado Main) que no tiene absolutamente nada..
Una clase Main (la clase de documento) que agrega (addChild) un personaje llamado 'player' (que tiene una clase Hero) y un esenario(simplemente un movie clip). Dentro del movie clip esenario,YA ai otros pequeños movieclip q son cuadraditos q es por donde caminara el personaje..
estos pequeños cuadraditos tienen una clase Denominada Solido.. y quiero que detecten las collisiones con el pj y q no lo dejen traspasarlas.. uso (hitTestPoint).. asta aca todo muy lindoo :P

pero el problema es q no se como referirme al jugador ..`player` (desde la clase solido) (recuerden.. el movieclip que tiene exportada la clase solido.. esta en Maintimeline>esenario>(CUADROsolido))

probe:

trace(MovieClip(parent)); >> [object Esenario]
trace(MovieClip(parent.parent)); >> [object Main]
trace(MovieClip(root)); >> [object Main]
trace(MovieClip(root.player)); >> Acceso a una propiedad player probablemente no definida mediante un referencia de tipo estatico :roll:

trace(MovieClip(parent.parent.player)); >> >> Acceso a una propiedad player probablemente no definida mediante un referencia de tipo estatico.


Bueno. .en definitiva.. no logro embocar al player! alguien sabe como referirme al mismo! ????????????????????????

GRACIAS DE ANTEMANO

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 19 Jun 2009 11:10 pm
Bueno gente!.. despues de probar y probar y volver a probar.. y probar un poco mas con algo de ayuda :P descubrii como aserlo

root["player"] asi de facil ajaj ! saludos !

por si a alguien le sirve

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 20 Jun 2009 09:37 am
Otra opción
MovieClip(parent.parent).player
MovieClip(root).player
Trato de explicar. Realmente debería ser simplement parent.player, lo que ocurre es que el compilador de Flash NO sabe que "parent" es de tipo MovieClip -sólo sabe que es un DisplayObject. Por eso realizamos la "conversión de cast", pero la conversión de cast se hace a parent.parent -o a root- NO a parent.parent.player.
Vmos, realment deberíamos poner
Main(parent.parent).player -la conversión de cast a nuestra Clase Main-. Se acostumbra a poner simplemente MovieClip porque nuestra clase Main extiende de MovieClip

Por Eliseo2

710 de clabLevel



 

msie8
Citar            
MensajeEscrito el 20 Jun 2009 11:33 am
Yo tego el mismo problema mas o menos que feresr pero no consigo solucionarlo de ninguna de las maneras que exponeis aqui.

Mi caso es que tengo un boton hecho con mc que se activa o desactiva segun una animacion dentro de otro mc y tiene que llamar a un menu que se crea en el stage. El menu es otro mc que lo llamo desde la biblioteca al pulsar dicho boton.

La pregunta es: ¿como llamo a un mc que esta en la biblioteca y quiero que se cree en el stage al pulsar un boton que esta dentro de otro mc?

espero haberme explicado bien y si alguien puede ayudarme en esto que seguro que es una tonteria se lo agradeceria hasta la eternidad ;) jeje

Por mandinguay

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Jun 2009 05:54 pm
bueno mandinguay-- depende de dodne estas escribiendo el codigo.. lo q decimos no te funciona por q yo intento referirme a un objeto q agrege previamente al esenario desde una clase.. vos intentas referirte a un objeto q esta en la bibloteca..
para esto..
pero lo primero que debes aser.. es .. exportar el MC que quieres q se cree a actionScript.. para lograrlo,
anda a la bibloteca.. dale boton derecho y propiedades.. apreta avanzadas y clickea la casilla.. "Exportar para Actionscript"
Se activaran dos campos para escribir.. en el que dice clase.. coloca un nombre.. de clase.. EJ. MimovieClip
da aceptar..( te saltara una advertencia. q te avisa q no encontro una clase y q flash creara una.. acepta..)
y despues.. de donde estes escribiendo el codigo pones:

var nombreMovieClipQuequeresAgregar:MimovieClip = new MimovieClip();
root.addChild(nombreMovieClipQuequeresAgregar);

creo q deberia funcionar!

prova y nos contas :) !
suerte!

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 20 Jun 2009 05:56 pm
ah! y gracias eliseo2 no entendia por q cuando ponia

MovieClip(parent.parent.player); no funcionaba.

MovieClip(parent.parent).player < con esto me lo dejaste claro ! ;)


nos vemos!

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 20 Jun 2009 06:14 pm
Hola feresr. Lo primero es agradecerte el interes y la contestacion tan rapida. Intente lo que me dijiste previamente y no me funciona. Me dice:

1061: Llamada a un método addChild posiblemente no definido mediante una referencia con tipo estático Flash.display:DisplayObject.

Por mandinguay

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Jun 2009 06:22 pm
Poniendo el root delante del addChild no me funciona y me da el mensaje de error antes citado. Porque lo raro es que cuando quito el root de root.addChil(SobreMi); me funciona pero me lo crea donde no debe.

Por mandinguay

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Jun 2009 07:11 pm
claro..cuando sacas el root lo crea adentro del mc donde estas poniendo el codigo.. pero por lo menos ya sabes q lo exportaste bien..

no te funciona el root.. emmm-- no se. te tiro algunas posiblidades.
fijate si asi te anda asi:

var nombreMovieClipQuequeresAgregar:MimovieClip = new MimovieClip();
MovieClip(root).addChild(nombreMovieClipQuequeresAgregar);


saludo! despues me contas ! :D

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 20 Jun 2009 07:32 pm
fenomeno tio, muchisimas gracias de verdad. Me as quitado un peso de encima que no veas. Si necesitas algo pidemelo, lo siento mis hermanas ya estan ocupadas, jajjaa

Por mandinguay

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 20 Jun 2009 07:38 pm
ajajaj.. ooooo.. !

me alegro q te alla servido! nos vemos viejo! suerte!.. cuidate

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 21 Jun 2009 12:13 pm
otra cuestion que me a salido. como lo borro del escenario una vez sacado? intento con MovieClip(root).removeChild(sobreMi);
pero me salta error. Tambien lo he intentado con:

removeChild();
removeChild(sobreMi);
root.removeChild();
root.removeChild(sobreMi);

Gracias y perdon por ser tan pesado :lol:

Por mandinguay

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 Jun 2009 05:57 pm
jej.. todo bien :). proba esto.. . como siemrpe.. no estoy seguro. ^^


root.removeChild(MovieClip(nombreDeTuMc));

espero q funcione!.

Por feresr

70 de clabLevel



 

msie
Citar            
MensajeEscrito el 22 Jun 2009 06:43 am
Hola de nuevo feresr. Intente lo que me dijiste para eliminar el movie clip. Es raro me dice: acceso a una propiedad no definida, pero es la misma propiedad que cree antes y que esta en el escenario. Hay otra manera de borrar el mc del escenario?

estoy desesperado, pero muchas gracias por contestar tan rapido.

Por mandinguay

10 de clabLevel



 

firefox
Citar            
MensajeEscrito el 22 Jun 2009 09:07 pm
no te funciona esto -- root.removeChild(MovieClip(nombreDeTuMc)); ?? :O

la verdad no se q decirte mandinguay.. estaba casi seguro :P

proba esto.. OJO.. no te garantizo q funcione tampoco.. perdon!.

removeChild(root.["nombreDeTuMc"]);

y ya q estamos pasame tu mail asi no asemos el post tan largo dale?? jaja .

Por feresr

70 de clabLevel



 

firefox
Citar            
MensajeEscrito el 22 Jun 2009 10:08 pm
Al principio de la clase agreguen una variable que sea: private var pelicula:MovieClip;
En la funcion constructora agreguen un parametro que sea: _pelicula:*
Y dentro de la funcion constructora ponen:
pelicula=_pelicula.root;

Y cuando hagan referencia a un objeto del escenario escribanlo de la siguiente manera:
pelicula.root[instancia]

chausss

Por lucasmoyano

Claber

1960 de clabLevel

22 tutoriales

Genero:Masculino  

Developer

firefox
Citar            
MensajeEscrito el 25 Jun 2009 09:49 am
Lo primero gracias a todos por vuestro interes, pero ya he solucionado el problema. Lo que tenia que hacer es:

- Llamar al transformador y crear el mc fuera de la funcion
- Ahora cuando yo hago la funcion click de crear el boton lo añado al root y creo un escuchador para un boton de cerrar dentro del mc que cree en el root.
- Ahora fuera de la funcion creo una funcion para el click del cerrar del mc del root y le digo que elimine el mc en el root.

Muy complicado todo, como podeis ver. La proxima vez hare toda la programacion en el mismo fotograma del escenario para no complicarme tanto. Gracias por el interes y para feresr este es mi mail por si necesitas algo o por otra duda que me surja :P

jejeje :wink: [email protected]

Por mandinguay

10 de clabLevel



 

firefox

 

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