locked
Método no regresa valor, ayuda. RRS feed

  • Pregunta

  • Bueno pues básicamente mi proyecto en XNA consta de 3 clases, Game1, Jugador y Tiles, en Game1 mando a llamar los métodos de las otras 2 clases como update, etc. y mi idea es manejar las colisiones en la clase de Jugador, con rectangulos, el problema es que Tiles no me regresa el valor deseado; mi pedazo de código (de la clase Tiles) es este:

            public void Update()
            {
                rec_tile = new Rectangle((int)posicion.X, (int)posicion.Y, img_tile.Width, img_tile.Height);
            }

            public Rectangle rectanguloTile()
            {           
                return rec_tile ;
            }

    Posicion.X y Y las tomo del constructor "Tiles", y pues img_tile es un Texture2D. Para la colisión uso esto (en la clase Jugador):

           private Tiles _tile = new Tiles();

           public void Update()
            {
               rec_jugador = new Rectangle((int)posicion.X, (int)posicion.Y, img_jugador.Width, img_jugador.Height);
               
                if (Keyboard.GetState().IsKeyDown(Keys.Left))
                { desplazamiento = -2; }

                else if (Keyboard.GetState().IsKeyDown(Keys.Right))
                { desplazamiento = 2; }

                else
                { desplazamiento = 0; }

                if (!rec_jugador.Intersects(_tile.rectanguloTile()))
                {
                    posicion.X += desplazamiento;
                }

            }

    Pero pues "rectanguloTile()" no me devuelve el valor deseado.

    ¿Qué estoy haciendo mal?

    Gracias.

    domingo, 20 de junio de 2010 4:56

Respuestas

  • Por lo que interpreto de ese codigo para que "rec_tile()" tenga un valor deberias estar llamando constantemente el metodo "Update()" que actualiza este valor del rectangulo en la clase Tile.

    Deberias agregar "_til.Update()" antes de

    if (!rec_jugador.Intersects(_tile.rectanguloTile()))

    { ........

    Asi se actualiza el valor del rectangulo del "tile" antes de verificar si interseca con el del personaje.

    ------------------------------

    Una buena practica ,en mes de llamar desde tu "Game1" a estos metodos espesificos de otras clases deberias usar los "GameComponents", en los cuales cada clase controla su comportamiento. Estos tienen su propio metodo "Update" donde puedes escribir directamente la logica sin nesesidad de llamar al metodo desde "Game1". Tambien puedes usar los "DrawableGameComponent" que aparte del metodo "Update" tienen el "Draw" para q la clase se dibuje por si sola.

    Te paso un articulo que subi a mi sitio donde explicomo como hacer botones usando los GameComponent.

    Son 3 videos, en tu caso con ver el 1º deberia ser suficiente para entender como utilizarlo, el resto es mas espesifico para botones.

    http://www.bfxstudio.net/Pages/Article.aspx?art=15

    p/d: El codigo fuente esta al final del articulo.

    Espero que te sea util.

     

     

    • Marcado como respuesta carlos-182 lunes, 21 de junio de 2010 17:53
    domingo, 20 de junio de 2010 16:21

Todas las respuestas

  • Por lo que interpreto de ese codigo para que "rec_tile()" tenga un valor deberias estar llamando constantemente el metodo "Update()" que actualiza este valor del rectangulo en la clase Tile.

    Deberias agregar "_til.Update()" antes de

    if (!rec_jugador.Intersects(_tile.rectanguloTile()))

    { ........

    Asi se actualiza el valor del rectangulo del "tile" antes de verificar si interseca con el del personaje.

    ------------------------------

    Una buena practica ,en mes de llamar desde tu "Game1" a estos metodos espesificos de otras clases deberias usar los "GameComponents", en los cuales cada clase controla su comportamiento. Estos tienen su propio metodo "Update" donde puedes escribir directamente la logica sin nesesidad de llamar al metodo desde "Game1". Tambien puedes usar los "DrawableGameComponent" que aparte del metodo "Update" tienen el "Draw" para q la clase se dibuje por si sola.

    Te paso un articulo que subi a mi sitio donde explicomo como hacer botones usando los GameComponent.

    Son 3 videos, en tu caso con ver el 1º deberia ser suficiente para entender como utilizarlo, el resto es mas espesifico para botones.

    http://www.bfxstudio.net/Pages/Article.aspx?art=15

    p/d: El codigo fuente esta al final del articulo.

    Espero que te sea util.

     

     

    • Marcado como respuesta carlos-182 lunes, 21 de junio de 2010 17:53
    domingo, 20 de junio de 2010 16:21
  • No he probado lo que me has dicho, pero suena lógico... antes de leer tu respuesta estuve tratando de solucionarlo y lo que hice fue modificar el metodo "update" y en vez de que fuera void, lo hice Rectangle, así si me devuelve el valor deseado, no se si traiga consecuencias el hecho de que el metodo update es Rectangle.

    Otra pregunta, he visto que tu técnica para programar en XNA es el uso de Components, podrías explicarme en sí que es un component? He estado trabajando en un "Tile Engine", donde en un int array meto distintos valores de numeros y al final en el método draw recorre ese arreglo para que me dibuje un distinto tile por cada número, así puedo hacer mejor los mapas, pero el problema es en las colisiones, yo necesito especificarle cuales tiles son "pasables" y cuales no lo son. Pensé que quizá una propiedad funcionaria, pero creo que tendría que implementarlo como componente, no sé si me puedas hechar una mano en eso.


    Por cierto, tendrás MSN Messenger ? Sería mejor hablar en tiempo real y no por post, claro, si estás de acuerdo.

    Gracias de antemano.

    • Marcado como respuesta carlos-182 lunes, 21 de junio de 2010 17:53
    • Desmarcado como respuesta carlos-182 lunes, 21 de junio de 2010 17:53
    domingo, 20 de junio de 2010 19:27
  • Por mi no hay problema, mi msn es "agustinrosso_1@hotmail.com".

    El uso de los GameComponents no es complicado. El hacer un TileEngine quisa te sea algo mas dificil.

    Justamente hace un tiempo arme un TileEngine con perspectiva isometrica, no lo termine pero te puedo dar una mano como encararlo.

     

    p/d: ahora estoy mal de tiempos, en unos dias me desocupo y subo un tutorial explicando el uso de los GameComponent.

    domingo, 20 de junio de 2010 20:41