Foros del Web » Programación para mayores de 30 ;) » Java »

Duda basica Vectores

Estas en el tema de Duda basica Vectores en el foro de Java en Foros del Web. Pues estoy tratando de almacenar arrays de una dimension en un vector, en los cuales alamaceno las coordenadas (x,y) de donde deberia dibujarse cada cuadro ...
  #1 (permalink)  
Antiguo 14/01/2011, 18:24
 
Fecha de Ingreso: septiembre-2010
Mensajes: 3
Antigüedad: 13 años, 7 meses
Puntos: 0
Duda basica Vectores

Pues estoy tratando de almacenar arrays de una dimension en un vector, en los cuales alamaceno las coordenadas (x,y) de donde deberia dibujarse cada cuadro para formar una figura (trato de crear un juego de la serpiente basico), en J2ME para celulares, tengo el siguiente codigo:

Código:
canvas=new Canvas(){

            protected void paint(Graphics g){
                ancho=getWidth();
                alto=getHeight();
                Hcuadros=(ancho-(ancho/5+1))/5;
                Vcuadros=(alto-(alto/5+1))/5;
                System.out.println("Cuadros H:"+Hcuadros+"\nCuadros V:"+Vcuadros+"\nancho="+ancho);
                Array_paredes=new boolean[Hcuadros][Vcuadros];

                System.out.println("Capacidad del vector: "+Vector_snake.capacity());
                
                //pintamos la pantalla
                g.setColor(255, 255, 255);
                g.fillRect(0, 0, ancho, alto);
                g.setColor(0,0,0);
                int InicioX=(ancho-(Hcuadros+1+Hcuadros*5))/2;
                int InicioY=(alto-(Vcuadros+1+Vcuadros*5))/2;
                int a=InicioX,b=InicioY,x,y;

                if(Vector_snake.isEmpty()){
                  //System.out.println("Pinta 1a vez");
                    for(x=0;x<5;x++){
                        int[] Array={Hcuadros/2-x,Vcuadros/2};
                        Vector_snake.addElement(Array);
                    }
                }
                    
                for(y=0;y<Vcuadros;y++){                   
                    for(x=0;x<Hcuadros;x++){
                        if((y==0)||(y==(Vcuadros-1))){
                            g.fillRect(a,b,5,5);
                        }
                        else if((x==0)||(x==(Hcuadros-1))){
                            g.fillRect(a,b,5,5);
                        }
                        a+=6;
                    }
                    b+=6;
                    a=InicioX;
                }

                System.out.println("----------Al repintar------------");
                for(x=0;x<5;x++){
                    int s[]=(int[])Vector_snake.elementAt(x); 
                    g.fillRect(s[0]*6+InicioX,s[1]*6+InicioY,5,5);
                    System.out.println("ElementAt: "+x+" [0]= "+s[0]);
                    System.out.println("ElementAt: "+x+" [1]= "+s[1]);
                }
            }

            protected void keyPressed(int keyCode){
                int arriba=getKeyCode(UP);
                int abajo=getKeyCode(DOWN);
                int izquierda=getKeyCode(LEFT);
                int derecha=getKeyCode(RIGHT);

                if(keyCode==arriba){
                    
                    System.out.println("----------Al dar click------------");
                        for(int x=4;x>0;x--){
                             int z[]=(int[])Vector_snake.elementAt(x-1);
                             Vector_snake.removeElementAt(x);
                             Vector_snake.insertElementAt(z, x);
                             int s[]=(int[])Vector_snake.elementAt(x);
                                System.out.println("ElementAt: "+x+" [0]= "+s[0]);
                                System.out.println("ElementAt: "+x+" [1]= "+s[1]);
                     
                        }
                    int temp[]=(int[])Vector_snake.elementAt(0);
                    temp[1]=temp[1]-1;
                    Vector_snake.removeElementAt(0);
                    Vector_snake.insertElementAt(temp, 0);
                    System.out.println("ElementAt: "+0+" [0]= "+temp[0]);
                    System.out.println("ElementAt: "+0+" [1]= "+temp[1]);
                                         
                    repaint();
                }

            }
        };
al iniciar me dibuja bien la la serpiente donde deberia, pero al hacer click para que se mueva un cuadro hacia arriba, mi logica es que las posiciones de cada cuadro que forma la serpiente se recorran en los arrays almacenados en el vector, asi la posicion 4 del vector tendra las coordenadas anteriores del vector 3, etc, pero al redibujarla pantalla con repaint() parece como si me modificar el contenido de los arrays sin razon aparente.

----------Al dar click------------
ElementAt: 4 [0]= 16
ElementAt: 4 [1]= 24
ElementAt: 3 [0]= 17
ElementAt: 3 [1]= 24
ElementAt: 2 [0]= 18
ElementAt: 2 [1]= 24
ElementAt: 1 [0]= 19
ElementAt: 1 [1]= 24
ElementAt: 0 [0]= 19
ElementAt: 0 [1]= 23

----------Al repintar------------
ElementAt: 0 [0]= 19
ElementAt: 0 [1]= 23
ElementAt: 1 [0]= 19
ElementAt: 1 [1]= 23 <------------ deberia ser 24 pero sin razon aparente al entrar al repaint() le resta 1 ????? o mas bien parece que copia el contenido del vector anterior el 0
ElementAt: 2 [0]= 18
ElementAt: 2 [1]= 24
ElementAt: 3 [0]= 17
ElementAt: 3 [1]= 24
ElementAt: 4 [0]= 16
ElementAt: 4 [1]= 24

Al dar click nuevamente:

----------Al dar click------------
ElementAt: 4 [0]= 17
ElementAt: 4 [1]= 24
ElementAt: 3 [0]= 18
ElementAt: 3 [1]= 24
ElementAt: 2 [0]= 19
ElementAt: 2 [1]= 23
ElementAt: 1 [0]= 19
ElementAt: 1 [1]= 23
ElementAt: 0 [0]= 19
ElementAt: 0 [1]= 22
Cuadros H:38
Cuadros V:48
ancho=240
Capacidad del vector: 5
----------Al repintar------------
ElementAt: 0 [0]= 19
ElementAt: 0 [1]= 22
ElementAt: 1 [0]= 19
ElementAt: 1 [1]= 22
ElementAt: 2 [0]= 19
ElementAt: 2 [1]= 22 <--------------- Se ve que esta copiando los mismos valores
ElementAt: 3 [0]= 18
ElementAt: 3 [1]= 24
ElementAt: 4 [0]= 17
ElementAt: 4 [1]= 24


Espero que alguien me diga que estoy haciendo mal porque por mas que le doy vueltas no encuentro algun error
  #2 (permalink)  
Antiguo 14/01/2011, 20:22
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Duda basica Vectores

Hola,

Revisar ese código es bastante complejo y encontrar el posible error es todavía mas difícil sin tener todo el código, y depurar un programa para ME le agrega mas complicaciones.

Pero si me permites darte un consejo, evidentemente estás usando un Vector para almacenar arreglos y eso evidentemente hace mas complejo algo que es mucho mas simple. Lo que deberías de manejar es una matriz, puesto que cada posición en la pantalla va a significar un cuadro.

Es decir, si tienes una matriz, por ejemplo:

Código:
char[][] pantalla = new char[25][80];
para accesar una posición solamente tienes que llevar una serie de coordenadas X y Y. La primera posición sería X = 0 y Y = 0, si quieres bajar solamente tienes que sumar 1 a Y y marcar la posición del vector como ocupado o algo.

Código:
pantalla[X][Y] = 'O';
Y te eliminas este tipo de construcciones que son difíciles de depurar:

Código:
                             int z[]=(int[])Vector_snake.elementAt(x-1);
                             Vector_snake.removeElementAt(x);
                             Vector_snake.insertElementAt(z, x);
En otros casos son muy útiles las colecciones.

Saludos,

ps:

El mejor ejemplo que he visto de este tipo de juegos fue Nibbles de Microsoft, que venía como ejemplo en QBasic en 1988 o algo así. Todavía puedes encontrar el código en algún lugar de la red, si deseas leerlo. Aunque se manejaba la parte superior de cada lugar de la matriz como superior ▀ e inferior ▄ y lleno █ lo cual hacía mas complejo el código, es el mejor ejemplo que yo personalmente haya visto de este juego. Y usaron una matriz.

Etiquetas: vectores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:50.