Comunidad de diseño web y desarrollo en internet online

Clases y subclases

Citar            
MensajeEscrito el 10 May 2010 12:00 am
hola, soy mas bien nuevo en esto del as3, la cosa es q estoy haciendo un juego, ya tengo definido el personaje y todo, ya lo muevo sin problemas, ya tambien empeze a hacer los enemigos,mi porblema es q cree una clase "mafioso", y le asigne un movi clip con su respectivas imagenes , la cosa es que quiero crear mas mafiosos, digamos mafioso con navaja, con revovler y asi, pero quiero que todos estos sean una subclase de mafioso, como hago para crear la subclase, cuando hago el extend me saca error.

package {//Importamos las clases necesarias
import flash.display.MovieClip;
import flash.display.DisplayObject;
import flash.utils.Timer;
import flash.events.*;
import flash.display.Stage;
import flash.events.Event;


public class mafioso extends flash.display.MovieClip {

}
}



package{

public class Joy extends mafioso {
}

}


se supone que si yo tengo una funcion que requiere una variable del tipo mafioso, tambien podria asignarle una del tipo joy ???

function disparar(enemigo:mafioso){
}
var ene:Joy=new Joy
disparar(ene)

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 May 2010 07:08 am
En la clase Joy tienes que importar la clase Mafioso. Simplificando tu código al máximo sería así:
Clase Mafioso:

Código ActionScript :

package
{
   import flash.display.MovieClip;
   
   public class Mafioso extends MovieClip
   {
      
   }
}

Clase Joy:

Código ActionScript :

package
{
   import Mafioso;
   
   public class Joy extends Mafioso
   {
      
   }
}

Para crear un mafioso y un joy:

Código ActionScript :

var mafioso:Mafioso = new Mafioso();
addChild(mafioso);

var joy:Joy = new Joy();
addChild(joy);

Y sí, a una instancia del tipo Mafioso le puedes asignar un Joy por aquello del polimorfismo, pero no se hace de la forma que has puesto, sino así:

Código ActionScript :

var mafioso:Mafioso = new Joy();
addChild(mafioso);

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 May 2010 07:55 pm
parce muchas gracias, men otra preguntica en el mismo ejemplo

el constructor de mafioso requiere unos paramtros de entrada

public function mafioso(posicion, arma){
}

pero la clase joy no

public function joy(){
}


yo al crear una variable de tipo joy, como le paso los parametros q necesita mafioso???

asi??
var joy:Joy = new Joy(posx,pistola);

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 10 May 2010 09:45 pm
Tienes que usar "super" para llamar al constructor de la superclase:
Clase Mafioso:

Código ActionScript :

package
{
   import flash.display.MovieClip;
   
   public class Mafioso extends MovieClip
   {
      public function Mafioso(posicion:uint, arma:String)
      {
         trace(posicion, arma);
      }
   }
}

Clase Joy:

Código ActionScript :

package
{
   import Mafioso;
   
   public class Joy extends Mafioso
   {
      public function Joy()
      {
         super(3, "pistola");
      }
   }
}

Creación de varias instancias (una usando polimorfismo):

Código ActionScript :

var mafioso:Mafioso = new Mafioso(5, "cuchillo");
addChild(mafioso);

var joy:Joy = new Joy();
addChild(joy);

var mafioso2:Mafioso = new Joy();
addChild(mafioso2);

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 May 2010 11:46 pm
parce me saca un error. no tengo q hacerle nada mas?? en el movie clip donde lo importo como clase le tengo q poner como clase base mafioso??? o q??

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 May 2010 12:04 am
parce si mafioso tiene un clip de pelicula asignado y joy tiene otro diferente,y ambos clips estan construidos con simbolos similares, eso puede causar algun conflicto??

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 May 2010 12:18 am
parce otra cosita q pena yo tan canson, si una funcion le tengo q pasar como parametro un mafioso

function algo(mafioso:Mafioso)

a esta tambien le puedo pasar un joy??

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 May 2010 08:21 am
La clase base es MovieClip (te lo podrá por defecto). Tienes que poner "Mafioso" en las propiedades del clip del mafioso, pero en la casilla Clase, no en clase base; y haces lo mismo en el clip del Joy pero en lugar de mafioso pon "Joy". Ten en cuenta que si en lugar de tener las clases en el mismo directorio que el .fla estás poniendo tus clases dentro de otra carpeta (por ejemplo una llamada "enemigos"), tienes que poner "enemigos.Mafioso" y "enemigos.Joy".
Si te sigue dando error postea el error que te da.

Si cada clase tiene asignado un clip diferente no tiene que darte ningún problema.

Y por supuesto que a una función con parámetro de tipo Mafioso puedes pasarle un Joy. Piensa que Joy al extender a Mafioso hereda todas sus propiedades y métodos (si buscas en la web seguro que encuentras el famoso ejemplo de herencia en oop de los mamíferos; seguro que te aclarará muchas dudas).
De todos modos podías haberlo probado tú mismo:

Código ActionScript :

algo(mafioso);
algo(joy);
function algo(m:Mafioso):void
{
   trace(m);
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 11 May 2010 02:47 pm
Si necesitas repasar los conceptos de Clases, Sub-clases, etc., puedes darle una mirada a nuestro Curso de POO

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

chrome
Citar            
MensajeEscrito el 11 May 2010 03:38 pm
jajaj si ya lo comprobe, pero me di cuenta q el error no era por eso, lo que pasa es q en el movieclip de mafioso yo cree un simbolo hit que lo uso para detectar colisiones con el hitTestObject, en el clip de joy tambien use el mismo simbolo hit, el error q me saca es 1152: Existe un conflicto con la definición heredada mafioso.hit del espacio de nombres public.

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 11 May 2010 09:57 pm

The Fricky! escribió:

Si necesitas repasar los conceptos de Clases, Sub-clases, etc., puedes darle una mirada a nuestro Curso de POO

Muy bueno el curso!! Mi más sincera enhorabuena (un buen resumen para iniciarse en la oop, en serio).
Hace días que lo ví en la portada de la página, pero hasta hoy no lo había leído.

@sfg2: En el capítulo "Conceptos de la Programación Orientada a Objetos" hay un apartado que trata sobre la herencia donde se explica un poco eso del polimorfismo: al igual que en el curso pone que una gallina es un ave (y por lo tanto puedes usar una gallina en todos los lugares donde se requiera un ave), en tu ejemplo un Joy es un Enemigo, y por lo tanto a una variable de tipo Enemigo le puedes asignar un objeto Joy.
En cuanto al error del que hablas, parece como si estuvieses intentando asignar tanto a la clase como a la subclase la misma propiedad hit, pero si esa propiedad ya está en la superclase no se tiene que definir en la subclase (ya que la hereda).

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2010 12:33 pm
lo q pasa es q el error sale por un simbolo duplicado en los movie clip, pero yo ese simbolo lo necesito en todos los enemigos para poder comprobar el hittest

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 12 May 2010 06:28 pm
¿Le estás dando un nombre de instancia a ese clip que usas para hacer el hitTest en los clips del mafioso y de Joy?
Si es así, el problema está en que por un lado estás creando una propiedad dentro de la superclase Mafioso llamada "hit", y por otro lado intentas crear la misma propiedad en la subclase (en realidad es el propio compilador el que te crea esta variable duplicada tanto en la superclase como en la subclase), y de ahí que tengas un conflicto al definir mafioso.hit.
Este problema se debe a que tienes activado en Flash CS4 una opción que crea automáticamente las variables para todos los clips que sean instancias de otros dentro del clip ligado a la clase. Yo personalmente suelo desactivarlo siempre; te da un poco más de trabajo a la hora de crear las clases, pero te evita problemas como el que tienes tú ahora.
Para solucionarlo tienes que abrir el documento .fla, y seguir estos pasos:
(¡Ojo, al hacer esto: a partir de ese momento tendrás que ir creando todas y cada una de las variables de todas las instancias de clips que contengan tus clips!)

En el menú pulsa File - Publish Settings
Seleccionas la pestaña Flash
Al lado de donde pone ActionScript 3.0 pulsa el botón Settings
Desactiva la casilla "Automatically declare stage instances"

Después de hacer esto, como ya he dicho antes ESTÁS OBLIGADO a declarar esa variable de tipo MovieClip llamada "hit" en la superclase Mafioso:

Código ActionScript :

package
{
   import flash.display.MovieClip;
   
   public class Mafioso extends MovieClip
   {
      public var hit:MovieClip;
      
      public function Mafioso(posicion:uint, arma:String)
      {
         trace(posicion, arma);
      }
   }
}

Y si tu clip del mafioso tuviera otros clips a los que hubieses dado nombre de instancia, también tendrías que declararlos explicitamente.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 May 2010 07:47 pm
pero si hago eso igual no puedo asignarle el mismo nombre de instancia al simbolo en cada movie clip, o si???

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 12 May 2010 09:59 pm
Al contrario, para poder darle el mismo nombre tienes que hacerlo así (por lo menos yo no conozco otra forma de hacerlo sin tener que usar instancias diferentes), y de ese modo al declarar la variable en la superclase quedará asociada al clip tanto en la superclase como en la subclase.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 May 2010 03:06 am
parce otra vez yo molestando, mira yo hice una clase bala y ella puse el hit test y bien me funciona excelente, pero ahora yo quiero q sea no se tipo street figther y poder pegar patadas, que me recomedas, como puedo hacer el hit test???

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 24 May 2010 06:52 am
Pues lo más sencillo sería (al dar una patada) que cuando el clip de tu personaje tenga la pierna extendida hagas un hitTest entre un punto de registro que estaría en su pie, y el clip de tu enemigo. Sería igual que lo que hayas hecho para la detección de colisión con la bala, pero con el pie o el puño del personaje.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 26 May 2010 03:04 am
parce si yo tengo 2 movi clip

movie1 y movie2 en mi porgrama me toca agregar siempre movie 1 de primero, pero yo quiero q me salga por encima del movie2, con q funcion se hace eso en as3??? estuve leyendo q es con la funcion setchildindex, donde puedo encontrar informacion de esta?

Por sfg2

12 de clabLevel



 

chrome
Citar            
MensajeEscrito el 26 May 2010 07:58 am
Esto ya no tiene que ver con el hilo. Deberías haber creado otro, pero bueno.
En la propia ayuda que trae Adobe CS tienes toda la información que necesitas.
Si quieres que al añadir movie2 en otra profundidad que no sea la superior, en lugar de:

Código ActionScript :

this.addChild(movie2);

Tienes que poner:

Código ActionScript :

this.addChildAt(movie2, 0);

donde el 0 indica la profundidad en la que se añadirá el clip en la lista de visualización (0 es la profundidad más baja).

Si el clip ya está en el escenario y quieres cambiar la profundidad:

Código ActionScript :

this.setChildIndex(m2, 1);

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox

 

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