Comunidad de diseño web y desarrollo en internet online

Problema al declarar nueva clase personalizada

Citar            
MensajeEscrito el 03 Dic 2012 07:46 pm
Muy buenas, estoy aprendiendo Actionscript 3.0 en Adobe Flash CS5 con un curso a través de videotutoriales. Hemos llegado a la parte de trabajo con objetos, y hemos probado con declarar una clase personalizada. Según nos comentan, el formato de declaración sería el siguiente:

class Pelota {
var Radio = 10;
var Color = 0xff0000;
var xPosition = 59;
var yPosition = 15;
public function Pelota() {
// constructor code
}
}

Se supone que así declararíamos la clase Pelota y varias propiedades asociadas a la misma. Después, deberíamos hacer una instancia de la clase con NEW.

Mi problema es que, al ponerlo así, me dice que la clase está anidada.
Si le pongo, como he visto curioseando por internet, la declaración PACKAGE delante (y lo encierro dentro de sus correspondientes llaves), me dice que "no se esperaba package".

¿Alguien podría ayudarme? Por más que busco por la red, no localizo cuál es el problema exacto, y como resolverlo, claro.

Necesito la ayuda, por favor. Muchas gracias de antemano.

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Dic 2012 12:54 pm
BuenAS:

Eso es debido a que estás escribiendo el código en la línea de tiempo de Flash Prof. Las clases debes escribirlas en archivos independientes con extensión .as (ActionScript).

Flash tiene un panel bastante básico para crear Clases. Ve al menu Ventana/ Otros paneles/ Proyecto y te aparecerá un nuevo panel que te permite crear archivos de clases.

Una clase tiene una estructura similar a esta. Y es MUY IMPORTANTE: la clase se debe llamar IGUAL que el archivo que la contiene, por tanto el siguiente texto debería estar en un archivo llamado ClaseDocumento.as.

Código ActionScript :

package
{
   import flash.display.MovieClip;
   
   public class ClaseDocumento extends MovieClip
   {
      public function ClaseDocumento()
      {
         
      }
   }
}


Por otro lado, si no colocas a la clase dentro de un paquete, como has escrito anteriormente, ésta tiene ámbito global, cosa poco recomendable (aunque pudiera parecer lo contrario en un principio).

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 04 Dic 2012 01:52 pm
Muchas gracias por la pronta respuesta, pero me surge una segunda duda entonces.

Si creo la clase en un archivo aparte, tal y como comentas, ¿debo importar de alguna manera dicho archivo para poder crear un instancia del mismo en mi archivo Flash después?

¿Habría que poner algo así como: import Flash.Pelota?

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Dic 2012 03:15 pm
BuenAS:

Si no está en el directorio raíz, o sea, no está en un paquete, debes importarla para que el compilador la localice.

Por otro lado, hay una cosa también importante: el package debe coincidir EXACTAMENTE con la ruta de carpetas en la que el archivo de la clase.

Así, si tienes la clase Pelota en el paquete com.utilidades.objetos, el archivo Pelota.as DEBE estar en la subcarpeta
com/utilidades/objetos.

y deberías importarla con:

import com.utilidades.objetos.Pelota;

Por otro lado, si tienes pensado trabajar con clases, quizá sea recomendable que utilizaras un editor distinto de Flash Professiona. Una opción para Windows es

FlashDevelop

que puedes descargarte gratuítamente.

O Flash Builder, este sí es de pago.

Te van a ayudar mucho a crear rápidamente las Clases, editarlas, tienen una sugerencia de código muy buena, etc.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 07 Dic 2012 07:11 pm
Bueno, he creado la clase como archivo Pelota.as, y la he colocado en el directorio donde tengo el proyecto flash desde donde quiero llamarla, creada de la siguiente manera:

package {
class Pelota {
var Radio = 10;
var Color = 0xff0000;
var xPosition = 59;
var yPosition = 15;
public function Pelota () {
}
}
}


Mi problema es que ahora coloco un:

var SaltoPelota = new Pelota ();

y me dice que el método Pelota no existe:

¿he de colocarlo en otro sitio para que lo localice o es que tengo que decirle directamente el directorio donde está de alguna manera?

Gracias de antemano de nuevo, y siento la lata que estoy dando, pero me está gustando el tema de programación en Actionscript y quiero sacarle todo el jugo que pueda.

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Dic 2012 05:12 pm
Bien, después de dedicarle un tiempo, he conseguido que me reconozca la clase Pelota, pero al crear una nueva variable con ella de la siguiente manera:

var SaltoPelota:Pelota = new Pelota ();

me dice que no se ha definido la VARIABLE Pelota (cuando debería ser la CLASE, entiendo).
La clase pelota la tengo definida según lo siguiente:

package {
import flash.display.MovieClip
class Pelota extends MovieClip {
var Radio = 10;
var Color = 0xff0000;
var xPosition = 59;
var yPosition = 15;
function Pelota () {
}
}
}


¿Alguna luz que alguien pueda arrojar sobre cuál es el problema?

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Dic 2012 06:49 pm
Muchas gracias por todo, Lukánicos. Me has guiado bastante a la hora de resolver el problema.Ya he conseguido darle solución y he definido mi clase y la he conseguido llamar desde mi proyecto Flash.

La segunda parte del fallo ha sido cuando he tratado de definir una clase con propiedades no fijas (no tienen un valor determinado), sino que reciben dicho valor al crear la correspondiente instancia. Me acepta la definición de clase:

package {

import flash.display.MovieClip;

public class Pelota extends MovieClip {
var Radio:Number;
var Longitud:Number;

public function Pelota (Radio, Longitud) {
this.Radio = Radio;
this.Longitud = Longitud; // constructor code
}

}

}

Pero cuando trato de crear una instancia de la misma, me dice que se esperaban los dos argumentos que le he definido en la clase y que no se han indicado ninguno de ellos:

var PruebaPelota = new Pelota (10, 3);

Cuando en la propia instancia le acabo de decir que quiero que dichos valores sean 10 y 3 respectivamente. Le estoy dando vuelvas, pero no consigo ver el error, ¿podrías orientarme un poco al respecto?

Muchas gracias de antemano y un saludo.

PD: Por supuesto, si ves que te estoy pidiendo muchas cosas, dímelo y no te insistiré al respecto. Es un favor que pido, a fin de cuentas.

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 10 Dic 2012 01:10 pm
BuenAS:

Creo que el problema que aparece es que no has definido el ámbito de las variables Radio y Longitud, y por defecto las toma 'internal', por lo que no puedes verlas. Algo así:

Código ActionScript :

package
{
   
   import flash.display.MovieClip;
   
   public class Pelota extends MovieClip {
      
      public var radio:Number;
      public var longitud:Number;
      
      public function Pelota (radio:Number, longitud:Number) {
         this.radio = radio;
         this.longitud = longitud; // constructor code
      }
      
   }
   
}


Verás que además he escrito el nombre de las variables en minúsculas. Es buena práctica hacer esto, para diferenciar una instancia de su clase (que sí se debe escribir en mayúsculas). Como digo, es buena práctica, y no afecta a la compilación del código.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 10 Dic 2012 05:24 pm
¡Vaya! Parece ser que no es el problema. Lo he puesto tal y como comentas, pero me sigue diciendo que se han introducido 0 argumentos de los dos que se esperaba.

Tiene la pinta de que no acepta los dos argumentos bien (ya sea porque no los esperaba o porque haya algún problema a la hora de trasladarlos a su posición dentro del contructor).

Por otro lado, me gustaría hacer una pregunta, ¿es necesario definir las variables justo después de definir la clase (me refiero a las variables RADIO y LONGITUD) y volver a definirlas después al declarar la función constructor (se vuelven a poner RADIO y LONGITUD y se vuelven a definir como NUMBER las dos de nuevo)? ¿no es una redundancia? (aunque no lo creo, porque si lo fuese, el programa ya daría algún indicio de error, supongo).

Por Nedlam

13 de clabLevel



 

firefox
Citar            
MensajeEscrito el 10 Dic 2012 05:38 pm
BuenAS:

Pues no sé, esa misma clase la he utilizado en un ejemplillo y cogía los valores bien.

Es que son distintas, por ejemplo, cuando haces:

this.radio = radio;

el primer radio (el que va después de this.) hace referencia a la propiedad radio de la clase, y la segunda (la que hay despues del igual) es el parámetro que le has pasado al constructor. Y esto sirve para que tu clase 'recuerde' el valor(o valores) que le pasas como parámetros en el construtor.

Si no quieres liarte, dale nombres distintos, por ejemplo llama con guión bajo a la propiedad y podrás hacer en el constructor:

this._radio = radio;

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

chrome
Citar            
MensajeEscrito el 14 Dic 2012 05:39 pm
Bueno, he probado a definir las variables con otros nombres, pero me da el mismo problema. Finalmente, he encontrado por la red la posibilidad de no definir nada como función del método y definir "aparte" (dentro de la clase) otra función que ejecute lo que yo quiero hacer (dar los valores que se indican en la instancia a las propiedades de la instancia recién creada). De esta manera, la clase quedaría así:

package {

import flash.display.MovieClip;

public class Pelota extends MovieClip {
private var radioProp:Number;
private var longitudProp:Number;

public function Pelota () {

}

public function DefinirPelota (radio:Number, longitud:Number) {
this.radioProp = radio;
this.longitudProp = longitud;
}

}

}


Tengo una clase Pelota, y dentro de dicha clase, es la función DefinirPelota la que me ejecuta el cambio de variables.
Ahora, en la línea de tiempo principal de mi archivo Flash, llamo a ambas:

var PruebaPelota:Pelota = new Pelota;
PruebaPelota.DefinirPelota (10, 3);

Primero he creado la variable, y luego con la función interna de la clase, le redefino las propiedades. Mi sorpresa es cuando encuentro que me dice que el archivo Flash tiene datos no válidos en el Frame1 de la clase Pelota (entiendo que se refiere a que la clase Pelota no estaría bien definida, pero no lo veo tan claro).

¿Alguna idea de cómo terminar de resolver ésto?

Gracias de antemano.

Por Nedlam

13 de clabLevel



 

firefox

 

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