Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: wintermute83 en 19 de Octubre de 2010, 04:21:52 PM

Título: reutilizar un array
Publicado por: wintermute83 en 19 de Octubre de 2010, 04:21:52 PM
Bueno, pues la pregunta de hoy tambien es bastante sencilla:

la libria que uso (slick2d) tiene una clase que requiere un array de objetos tipo Image, y devuelve un objeto del tipo Animation.

Como lo que busco es crear estos objetos animation y los array de imagenes no me interesan, habia pensado reutilizar el nombre del array de imagenes. Os pongo lo que quiero hacer.

        Image [] imageSet = {imMancubusList.get(2)};    // coge la imagen de un arrayList donde tengo todas las imagenes guardadas
        anMancubusList.add(new Animation(imageSet,1000,false));      // esta es la llamada a la clase que requiere un array de Image

        imageSet=null;
        Image [] imageSet = {imMancubusList.get(0), imMancubusList.get(1), imMancubusList.get(2), imMancubusList.get(3),            imMancubusList.get(4),   imMancubusList.get(5)};
        int [] duration = {150, 150, 150, 150, 150, 150};
        anMancubusList.add(new Animation(imageSet,duration,false));

pero esto no compila porque imageSet ya está definido. Una primera aproximación seria crear un nuevo array para cada objeto Animation.

        Image [] imageSet1 = {imMancubusList.get(2)};
        anMancubusList.add(new Animation(imageSet1,1000,false));

        imageSet1=null;

        Image [] imageSet2 = {imMancubusList.get(0), imMancubusList.get(1), imMancubusList.get(2), imMancubusList.get(3), imMancubusList.get(4),  imMancubusList.get(5)};
        int [] duration = {150, 150, 150, 150, 150, 150};
        anMancubusList.add(new Animation(imageSet2,duration,false));

De esta manera compila y todo va bien, pero cuando el juego empiece a tener mas y mas se dara la situación en la que este creando el arraySet300. En verdad esos arrays no los necesito una vez que tengo creado el objeto Animation. Por eso me gustaría reutilizar el nombre imageSet, al igual que si podemos hacer con variables tipo int u objetos String.

Un saludo a todos
Título: Re: reutilizar un array
Publicado por: Vicente en 19 de Octubre de 2010, 05:22:18 PM
Cambia tu segundo uso de imageSet por esto:

imageSet = {imMancubusList.get(0), imMancubusList.get(1), imMancubusList.get(2), imMancubusList.get(3),            imMancubusList.get(4),   imMancubusList.get(5)};

Sin volver a definir la variable y listo :)
Título: Re: reutilizar un array
Publicado por: wintermute83 en 20 de Octubre de 2010, 04:48:53 PM
Vicente, tal como tu me dices recibo un  "illegal start of expression".
Pego el código tal como lo tengo:

Image [] imageSet = {imMancubusList.get(2)};
animation = new Animation(imageSet,1000,false);
animMancubusList.add(animation);
animMancubusList.add(getFlippedAnim(animation));

imageSet = {imMancubusList.get(0), imMancubusList.get(1), imMancubusList.get(2), imMancubusList.get(3), imMancubusList.get(4),       imMancubusList.get(5)};

Y ahí es donde dice que no compilará..
Título: Re: reutilizar un array
Publicado por: Vicente en 20 de Octubre de 2010, 05:43:18 PM
En el segundo array seguramente ya no puedas usar la sintaxis {....}, si no que tendrás que hacer un new del tamaño y meter los elementos a mano.
Título: Re: reutilizar un array
Publicado por: wintermute83 en 20 de Octubre de 2010, 10:11:50 PM
Parece que efectivamente no puedo.
Por mantenerlo simple he optado por continuar añadiendo arrays, y que el compilador se deshaga de ellos automaticamente.
Título: Re: reutilizar un array
Publicado por: jmcots en 21 de Octubre de 2010, 09:38:40 AM
Hola wintermute83,

en C++, puedes agrupar un trozo de código entre { y }, de tal manera que al llegar al final del bloque, se libera la memoria demandada.

Creo que en Java esto también es así, de esta manera podrías realizar la inicialización dentro de un bloque:

{
    Image [] imageSet = {imMancubusList.get(2)};
    anMancubusList.add(new Animation(imageSet,1000,false));
}

{
    Image [] imageSet = {imMancubusList.get(0), imMancubusList.get(1), imMancubusList.get(2), imMancubusList.get(3)};
    int [] duration = {150, 150, 150, 150, 150, 150};
    anMancubusList.add(new Animation(imageSet,duration,false));
}


Así puedes usar el mismo nombre todo el rato y, en caso que sea posible, se liberará memoria lo antes posible. Pero te va a quedar  un código un poco más largo...

Saludos!
Título: Re: reutilizar un array
Publicado por: wintermute83 en 21 de Octubre de 2010, 01:38:42 PM
gracias por el apunte jmcots, funciona sin problemas.