Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda con clic

Iniciado por nkr10, 16 de Abril de 2009, 11:02:15 PM

« anterior - próximo »

nkr10

Hola, estoy haciendo un proyecto para mi clase de programación; hay algo que no entiendo por que está mal; es un arreglo de 7 posiciones para dibujar 2 imagenes, 3 en las primeras 3 posiciones, una vacia y en las otras 3 otros 3 cuadros [1,1,1,0,2,2,2].

Ya está dibujado, pero al darle clic a las de "2",  me manda un error, y no se por que, y si le quito ese pedazo de codigo los "1" si sirven, pero al ponerle el otro codigo ya no. :(

namespace WindowsGame6
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D fondo;
        Texture2D Hongo;
        Texture2D pis;
        Texture2D mario;
        Texture2D luigi;
        Texture2D marioj;
        Texture2D luigij;
        MouseState mouse;
        int obj;
        int objeto;
       
        int[] arr = new int[7];
        Color color = Color.White;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            this.IsMouseVisible = true;
            arr[0] = 1;
            arr[1] = 1;
            arr[2] = 1;
            arr[3] = 0;
            arr[4] = 2;
            arr[5] = 2;
            arr[6] = 2;
            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            fondo = Content.Load<Texture2D>("fondo");
            Hongo = Content.Load<Texture2D>("GoombaN");
            pis = Content.Load<Texture2D>("GoombaP");
            mario = Content.Load<Texture2D>("mario");
            luigi = Content.Load<Texture2D>("luigi");
            marioj = Content.Load<Texture2D>("marioj");
            luigij = Content.Load<Texture2D>("luigij");
        }

            // TODO: use this.Content to load your game content here
       

        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        ///

        int clicEnMario(int xmouse, int ymouse)
        {
            Rectangle rmouse, rmario;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);
            for (int x = 1; x <= 3; x++)
            {
                rmario = new Rectangle(x * 120, 400, 150, 150);
                if (rmouse.Intersects(rmario))
                    return x;
            }
            return 0;
        }

        int clicEnLuigi(int xmouse, int ymouse)
        {
            Rectangle rmouse, rluigi;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);
            for (int xx = 1; xx >= 3; xx++)
            {

                if (arr[xx - 1] == 2)
                {
                    rluigi = new Rectangle(xx * 120, 400, 150, 150);
                    if (rmouse.Intersects(rluigi))
                        return xx;
                }
            }
            return 0;
        }
        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here
            mouse = Mouse.GetState();

            if (mouse.LeftButton == ButtonState.Pressed)
            {
               
                objeto = clicEnMario(mouse.X, mouse.Y);
                if (arr[objeto + 1] == 0)
                {
                    arr[objeto] = 0;
                    arr[objeto + 1] = 1;
                }
                else if (arr[objeto + 2] == 0)
                {
                    arr[objeto] = 0;
                    arr[objeto + 2] = 1;


                }

                if (mouse.LeftButton == ButtonState.Pressed)
                {
                    obj = clicEnLuigi(mouse.X, mouse.Y);
               
                    if (arr[obj - 1] == 0)
                    {
                        arr[obj] = 0;
                        arr[obj - 1] = 2;
                    }
                    else if (arr[obj - 2] == 0)
                    {
                        arr[obj] = 0;
                        arr[obj - 2] = 2;
                    }


               
            }

                base.Update(gameTime);
            }
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here
            spriteBatch.Begin();
            spriteBatch.Draw(fondo, new Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle(5, (graphics.GraphicsDevice.Viewport.Height)/8 * 6+4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7)+10, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 2 + 15, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 +4, 80,80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 3 + 20, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 +4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 4 + 25, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 +4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 5 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 +4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 6 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 +4, 80, 80), Color.White);


           
           
            /*for (int x = 1; x <= 3; x++)
            {
                if (x == objeto)
                {
                    xm = 100;
                }
                else
                {
                    spriteBatch.Draw(mario, new Rectangle(5, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80), Color.White);
           
                }
            }**/

            for (int x = 1; x <= 7; x++)
            {
                if (arr[x - 1] == 1)
                {
                   
                    spriteBatch.Draw(mario, new Rectangle(x * 122 - 122, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80),Color.White);
                    //spriteBatch.Draw(mario, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) + 10, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80), Color.White);
                    //spriteBatch.Draw(mario, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 2 + 15, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80), Color.White);
               
                   
                }

                if (arr[x - 1] == 2)
                {
                    spriteBatch.Draw(luigi, new Rectangle(x* 120 - 120, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80), Color.White);
                    //spriteBatch.Draw(luigi, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 5 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80), Color.White);
                    //spriteBatch.Draw(luigi, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 6 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80), Color.White);
                }
             }

            spriteBatch.End();




            base.Draw(gameTime);
        }
    }
}


Ese es el codigo, tiene algunas basuras en comentarios, por si las llegase a necesitar, por favor ayuda!!!! :'(

Vicente

Hola

¿Ese código compila? ¿Qué error te da? ¿En qué línea?

Así por encima parece que el bucle for de la funcion clicEnLuigi esta mal.

Un saludo!

Vicente

nkr10

Si, si compila.. pero me manda un error al darle click a cualquiera de los luigis o marios en:

if (mouse.LeftButton == ButtonState.Pressed)
                {
                    obj = clicEnLuigi(mouse.X, mouse.Y);

       -------> if (arr[obj - 1] == 0) //ME DICE: INDICE FUERA DE LOS LIMITES DE LA MATRÍZ
                    {
                        arr[obj] = 0;
                        arr[obj - 1] = 2;
                    }
                    else if (arr[obj - 2] == 0)
                    {
                        arr[obj] = 0;
                        arr[obj - 2] = 2;
                    }
               

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

Mira, hasta aquí todo va bien, con esto ya se mueven correctamente los 3 de la derecha(marios):

namespace WindowsGame6
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D fondo;
        Texture2D Hongo;
        Texture2D pis;
        Texture2D mario;
        Texture2D luigi;
        Texture2D marioj;
        Texture2D luigij;
        MouseState mouse;
       
        int objeto;

        int[] arr = new int[7];
        Color color = Color.White;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            this.IsMouseVisible = true;
            arr[0] = 1;
            arr[1] = 1;
            arr[2] = 1;
            arr[3] = 0;
            arr[4] = 2;
            arr[5] = 2;
            arr[6] = 2;
            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            fondo = Content.Load<Texture2D>("fondo");
            Hongo = Content.Load<Texture2D>("GoombaN");
            pis = Content.Load<Texture2D>("GoombaP");
            mario = Content.Load<Texture2D>("mario");
            luigi = Content.Load<Texture2D>("luigi");
            marioj = Content.Load<Texture2D>("marioj");
            luigij = Content.Load<Texture2D>("luigij");
        }

        // TODO: use this.Content to load your game content here


        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        ///

        int clicEnMario(int xmouse, int ymouse)
        {
            Rectangle rmouse, rmario;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);
            for (int x = 1; x <= 3; x++)
            {
                rmario = new Rectangle(x * 120, 400, 150, 150);
                if (rmouse.Intersects(rmario))
                    return x;
            }
            return 0;
        }


        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();

            // TODO: Add your update logic here
            mouse = Mouse.GetState();

            if (mouse.LeftButton == ButtonState.Pressed)
            {
                objeto = clicEnMario(mouse.X, mouse.Y);
                if (arr[objeto + 1] == 0)
                {
                    arr[objeto] = 0;
                    arr[objeto + 1] = 1;
                }
                else if (arr[objeto + 2] == 0)
                {
                    arr[objeto] = 0;
                    arr[objeto + 2] = 1;


                }













                base.Update(gameTime);
            }
        }

        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here
            spriteBatch.Begin();
            spriteBatch.Draw(fondo, new Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle(5, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) + 10, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 2 + 15, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 3 + 20, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 4 + 25, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 5 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 6 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);




           

                for (int xx = 1; xx <= 7; xx++)
                {
                    if (arr[xx - 1] == 1)
                    {

                        spriteBatch.Draw(mario, new Rectangle(xx * 122 - 122, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80), Color.White);


                    }

                    if (arr[xx - 1] == 2)
                    {
                        spriteBatch.Draw(luigi, new Rectangle(xx * 120 - 120, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80), Color.White);

                    }
                }

                spriteBatch.End();




                base.Draw(gameTime);
            }
        }
    }



Lo que tengo que hacer es algo parecido a esto:

http://www.disbelieving.com/fun/games/crackshot/index.html

la animación es lo menos importante, lo que importa es que funcione como ese juego, incluyendo a la mosca de arriba y los botones, contador e instrucciones.

Lo demas creo que si lo sé hacer, pero no sé como hacer que se muevan los de la izquierda :(




synchrnzr

Si usaras el GeSHi para colorear el código sería una gran cosa para los lectores ^_^'

sync

shephiroth

Yo el problema principal lo veo en los bucles de clickEnMario y clickEnLuigi, y ademas de algun error al escribir veo un error grave en la lógica. El error al escribir esta en el for de luigi (como ya te dijeron) donde tienes:

Código (cpp) [Seleccionar]

for (int xx=1; [b]xx>=3[/b];xx++) {
...
if (....) return xx;
}
return 0;


Perdoname, pero eso SIEMPRE devolvera 0. la condicion seria xx<=3 como en mario.

Ahora bien, el error de logica grave al q me referia (que si bien descubriras cuand puedas mover a los luigi) es q no puedes dar por sentado q los mario van a estar en las tres primeras posiciones, tienes q comprobar las 6 primeras posiciones. Lo mismo pasara con luigi, no puedes dar por hecho que esta en las 3 primeras, ni en las 3 ultimas.....sino en las 6 ultimas.

SALUDOS ^^

[EX3]

#6
Cita de: synchrnzr en 17 de Abril de 2009, 08:31:58 AM
Si usaras el GeSHi para colorear el código sería una gran cosa para los lectores ^_^'
Y para evitar los malditos -- al escribir dos guiones seguidos (seria interesante cambiar el codigo del emoticon para que usara ¬¬ en vez de los dos guiones  ::))

Ando un poco espeso a estas horas todavia (y mas siendo viernes :P) pero este codigo me desconcierta:
        int clicEnLuigi(int xmouse, int ymouse)
        {
            Rectangle rmouse, rluigi;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);
            for (int xx = 1; xx >= 3; xx++)
            {

                if (arr[xx - 1] == 2)
                {
                    rluigi = new Rectangle(xx * 120, 400, 150, 150);
                    if (rmouse.Intersects(rluigi))
                        return xx;
                }
            }
            return 0;
        }


clicEnLuigi() sirve para comprobar si has hecho clic con el raton (al menos si el cursor esta dentro) sobre el area que ocupa el sprite de Luigi? Hubiera sido mas facil comprobar si las coordenadas del raton estan dentro del area del sprite:
Si (Cursor.X => Rectangulo.Left Y Cursor.X =< Rectangulo.Right)
Y (Cursor.Y => Rectangulo.Top Y Cursor.Y =< Rectangulo.Bottom Entonces Esta dentro

A lo mejor tu codigo esta pensado para realizar alguna comprobacion adicional a parte de si el cursor esta dentro o no del sprite, pero si fuera solo eso lo podrias resumir con el codigo anterior :)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

nkr10

Hice lo que me sugirieron, y si efectivamente tenia ese error de logica jeje, lo siento.

Pero el error lo sigue marcando aqui:


Código (csharp) [Seleccionar]
if (mouse.LeftButton == ButtonState.Pressed)
                {
                    obj = clicEnLuigi(mouse.X, mouse.Y);

             ->   if (arr[obj - 1] == 0)//INDICE FUERA DE LOS LIMITES DE LA MATRÍZ
                    {
                        arr[obj] = 0;
                        arr[obj - 1] = 2;
                    }
                    else if (arr[obj - 2] == 0)
                    {
                        arr[obj] = 0;
                        arr[obj - 2] = 2;
                    }



                }


Para mover a Mario, como se tiene que mover a la derecha, le sumo uno o 2 según sea el caso y funciona bien; el problema viene al meter el metodo y codigo de luigi, luigi debe moverse a la izquierda, entonces el darle click lo muevo -1 o -2 en el arreglo igual que mario, pero no se mueve y marca ese error; y aparte mario deja de funcionar(repito solo cuando el de luigi está compilando.

Y una disculpa, soy nuevo en el foro y no sabia lo de los iconos jejeje.

Tei

¿que significa cuando clicEnLuigi devuelve 0?

quizas debas cubrir la condicion del if que te da error y su else, con otro if que considere la opcion de que obj sea 0.

de todos modos como no se en que contexto esta esto, no se de que pajoleras estais hablando.

de todos modos, si puedo opinar,.... dado que no os importa crear objetos dentro de un bucle for... supongo que no os importara tampoco encasupar este array que se testea dentro de una funcion o metodo que impida el acceso directo, sino que filtre los accesos, incluso que de sentido semantico a eso de arr[obj - 1] == 0 que algo ha de significar, supongo que algo como   mapa.esTile( offsetX, tile:SOLID );

ya digo que no conozco el contexto, pero si estas en un lenguaje donde es un error leer fuera de rango del array, parece un poco peligroso poner tanto codigo que no hace comprobaciones de bordes, y se ve que alguna es necesaria.   es mucho codigo donde puede esconderse un error.  yo casi prefiero un codigo mucho mas lento, pero mas seguro.

shephiroth

Cita de: Tei en 17 de Abril de 2009, 06:15:58 PMyo casi prefiero un codigo mucho mas lento, pero mas seguro.
En un programa como el q presenta donde hay interacciones pero no animaciones, la velocidad pierde importacia. DA igal q el programa tarde 10 milisegundos o 100 milisegundos en mover el sprite, el usario no lo va a notar.


Respecto al error del array, como te dice Tei tienes q ver porque el codigo te devuelve 0, pero (y sin entrar en mas detalles, primero piensalo) ademas tienes que pensar pq excluyes ese valor, y si tiene sentido el valor devuelto por la funcion con el uso q le das a ese valor devuelto (lo siento si he liado mas la cosa, queria decirlo sin decirlo xDD)

SALUDOS ^^

nkr10

Hoal de nuevo a todos, he seguido sus consejos y de antemano muchas gracias por ellos, hasta ahora todo va muy bien, cambié algunos codigos y el programa ya jala como debería, le agregué un contar de tiempo hacia atrás, un botón para reiniciar el juego, y mensajes para cuando pierdes o ganas,.. ahora lo unico que me falta son 2 botones, uno que es el "RESET" que lo que hace es regresar a los personajes a su posición inicial sin modificar el cronometro.. lo que hice es esto:

Código (csharp) [Seleccionar]
if (mouse.LeftButton == ButtonState.Pressed)
            {
                int p;
                p = clicreset(mouse.X, mouse.Y);//Clicreset es un metodo que hice para que el mouse intersecte con el rectangulo del botón

                if (p == 1)
                {
                    for (int n = 0; n <= 6; n++)
                    {
                        if (n < 3)
                            arr[n] = 1;
                        else if (n >= 4)
                            arr[n] = 2;
                    }
                }
            }




Aparte de esto me falta hacer que al iniciar el juego me aparesca un cuadro con las instrucciones y un botón "START" que al darle clic inicie el juego, y la mosca que aparece.

Les dejo el codigo que he hecho para que me critiquen:

Código (csharp) [Seleccionar]
namespace WindowsGame6
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D fondo;
        Texture2D Hongo;
        Texture2D pis;
        Texture2D mario;
        Texture2D luigi;
        Texture2D marioj;
        Texture2D luigij;
        Texture2D reset;
        Texture2D playagain;
        MouseState mouse;
        double tiempo;
        int gameover;
        SpriteFont fuente;
        Color color = Color.White;

        int[] arr = new int[7];
        Rectangle[] arreglo = new Rectangle[7];
        Rectangle rreset = new Rectangle(10,140,150,100);
        Rectangle rplay = new Rectangle(350, 50, 200, 150);
       

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            this.IsMouseVisible = true;
            arr[0] = 1;
            arr[1] = 1;
            arr[2] = 1;
            arr[3] = 0;
            arr[4] = 2;
            arr[5] = 2;
            arr[6] = 2;




            for (int i = 0; i < 7; i++)
            {
                arreglo[i] = new Rectangle(i * 120, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, 80, 80);

            }

            tiempo = 0;
            gameover = 0;

            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            fondo = Content.Load<Texture2D>("fondo");
            Hongo = Content.Load<Texture2D>("GoombaN");
            pis = Content.Load<Texture2D>("GoombaP");
            mario = Content.Load<Texture2D>("mario");
            luigi = Content.Load<Texture2D>("luigi");
            marioj = Content.Load<Texture2D>("marioj");
            luigij = Content.Load<Texture2D>("luigij");
            reset = Content.Load<Texture2D>("reset");
            playagain = Content.Load<Texture2D>("playagain");
            fuente = Content.Load<SpriteFont>("Verdana");
        }

        // TODO: use this.Content to load your game content here


        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        ///

        int clicEn(int xmouse, int ymouse)
        {
            Rectangle rmouse;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);

            for (int x = 0; x < 7; x++)
            {


                if (rmouse.Intersects(arreglo[x]))
                {
                   
                    return x;

                }

            }
            return 0;
        }

        int clicreset(int xmouse, int ymouse)
        {
            Rectangle rmouse;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);

               if (rmouse.Intersects(rreset))
                {

                    return 1;

                }
               return 0;
                       
           
        }

        int clicagain(int xmouse, int ymouse)
        {
            Rectangle rmouse;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);

            if (rmouse.Intersects(rplay))
            {

                return 1;

            }
            return 0;


        }
       




        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();



            // TODO: Add your update logic here
            mouse = Mouse.GetState();
            try
            {
                if (mouse.LeftButton == ButtonState.Pressed)
                {

                    int pos = clicEn(mouse.X, mouse.Y);

                    if (arr[pos] == 1)
                    {
                        if (arr[pos + 1] == 0)
                        {
                            arr[pos] = 0;
                            arr[pos + 1] = 1;
                        }
                        else if (arr[pos + 2] == 0)
                        {
                            arr[pos] = 0;
                            arr[pos + 2] = 1;
                        }



                    }


                    else
                    {
                        pos = clicEn(mouse.X, mouse.Y);

                        if (arr[pos] == 2)
                        {

                            if (arr[pos - 1] == 0)
                            {
                                arr[pos] = 0;
                                arr[pos - 1] = 2;
                            }
                            else if (arr[pos - 2] == 0)
                            {
                                arr[pos] = 0;
                                arr[pos - 2] = 2;
                            }


                        }


                    }
                }


                if (tiempo < 60)
                    tiempo += gameTime.ElapsedGameTime.TotalSeconds;
                else
                    tiempo = 0;


                base.Update(gameTime);
            }

            catch (Exception)
            {
            }

            if (mouse.LeftButton == ButtonState.Pressed)
            {
                int p;
                p = clicreset(mouse.X, mouse.Y);

                if (p == 1)
                {
                    for (int n = 0; n <= 6; n++)
                    {
                        if (n < 3)
                            arr[n] = 1;
                        else if (n >= 4)
                            arr[n] = 2;
                    }
                }
            }

            if (mouse.LeftButton == ButtonState.Pressed)
            {
                int a;
                a = clicagain(mouse.X, mouse.Y);

                if (a == 1)
                    this.Initialize();
            }
        }




        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here
            spriteBatch.Begin();
            double segundos = Math.Truncate(61.0 - tiempo);
            spriteBatch.Draw(fondo, new Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle(5, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) + 10, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 2 + 15, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 3 + 20, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 4 + 25, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 5 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 6 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
            spriteBatch.Draw(reset, rreset, color);
            spriteBatch.Draw(playagain, rplay, color);

            for (int xx = 0; xx < 7; xx++)
            {
                if (arr[xx] == 1)
                {

                    spriteBatch.Draw(mario, arreglo[xx], Color.White);


                }

                if (arr[xx] == 2)
                {
                    spriteBatch.Draw(luigi, arreglo[xx], Color.White);

                }

               
            }


            Vector2 V = new Vector2(graphics.GraphicsDevice.Viewport.Width - 125, 0);
            if (gameover == 0)

                spriteBatch.DrawString(fuente, segundos + "", V, Color.White);

            if (segundos == 0)
            {
               
                    {
                        spriteBatch.DrawString(fuente, "Game Over", new Vector2(350, 300), Color.White);
                        gameover = 1;

                        //GraphicsDevice.Clear(Color.Black);
                    }
                if (gameover == 1)
                {
                    GraphicsDevice.Clear(Color.Black);
                }
            }

                if (arr[0] == 2 && arr[1] == 2 && arr[2] == 2 && arr[4] == 1 && arr[5] == 1 && arr[6] == 1)
                {
                    spriteBatch.DrawString(fuente, "GANASTE!!!!", new Vector2(350, 300), Color.White);

                    GraphicsDevice.Clear(Color.Black);

                    gameover = 1;


                }

                spriteBatch.End();





                base.Draw(gameTime);
            }
        }
    }






De nuevo, gracias por sus consejos, este juego es para hoy en la noche jaja, les estaré muy agradecido si me dan retroalimentación y uno que otro consejo mas :D:D

Saludos.


Vicente

Como comentario te diría que sigas las guías de diseño y de estilo de Microsoft para escribir código en C#. Por ejemplo la textura Hongo debería llarmar "hongo". el método clicreset debería llamarse ClicReset,...

Te puedes instalar StyleCop:

http://code.msdn.microsoft.com/sourceanalysis

Que es una herramienta automática que te dice como deberías escribir y organizar tu código. No hay que seguirla al 100% de la letra, pero si que te ayudaría a mejorar el código en general.

Un saludo,

Vicente

shephiroth

Muy buenas. La verdad que el codigo se ve mas entero, pero sigue habiendo fallos.

Tienes un array q va de 0 a 6 (7 posiciones) y en un for compruebas a cual le ha dado y devuelves el indice. Si no se ha pulsado en ninguno devuelves.......0. Ahora bien, es correcto???

Dejando eso de lado, has puesto un try...catch por si se sale de los indices del array que no te pete, sino q capturas la excepcion y simplemente te saltas la comprobacion de el cuadro pulsado. Esto si no esta mal (funcionar funciona) bien se puede ajustar xDD

SALUDS ^^

nkr10

Por fin!!! Al fin está terminado :D:D

Muchas gracias a todos por su ayuda, fue entregado en tiempo y con buena presetnación..

Solo una duda mas, alguien sabe como o donde puedo subirlo? alguna pagina o algo así?

Por lo pronto les dejo el codigo por si quieres criticar jaja

Código (csharp) [Seleccionar]

namespace WindowsGame6
{
    /// <summary>
    /// This is the main type for your game
    /// </summary>
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D fondo;
        Texture2D Hongo;
        Texture2D pis;
        Texture2D mario;
        Texture2D luigi;
        Texture2D marioj;
        Texture2D luigij;
        Texture2D reset;
        Texture2D playagain;
        Texture2D start;
        Texture2D instrucciones;
        MouseState mouse;
        double tiempo;
        int gameover;
        SpriteFont fuente;
        Color color = Color.White;
        Color color2 = Color.White;
       
        Rectangle strt = new Rectangle(250, 380,250,50);

        int[] arr = new int[7];
        Rectangle[] arreglo = new Rectangle[7];
        Rectangle rreset = new Rectangle(10,140,150,100);
        Rectangle rplay = new Rectangle(350, 50, 200, 150);
        Texture2D koopa;

        int x = 0;
        int y = 100;
        int xm = 80;
        int ym = 80;
        bool inicia = true;
        bool perder = true;

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }

        /// <summary>
        /// Allows the game to perform any initialization it needs to before starting to run.
        /// This is where it can query for any required services and load any non-graphic
        /// related content.  Calling base.Initialize will enumerate through any components
        /// and initialize them as well.
        /// </summary>
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            this.IsMouseVisible = true;
            arr[0] = 1;
            arr[1] = 1;
            arr[2] = 1;
            arr[3] = 0;
            arr[4] = 2;
            arr[5] = 2;
            arr[6] = 2;



            for (int i = 0; i < 7; i++)
            {
                arreglo[i] = new Rectangle(i * 120, (graphics.GraphicsDevice.Viewport.Height) / 8 * 5 + 12, xm, ym);

            }

            tiempo = 0;
            gameover = 0;

            base.Initialize();
        }

        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            fondo = Content.Load<Texture2D>("fondo");
            Hongo = Content.Load<Texture2D>("GoombaN");
            pis = Content.Load<Texture2D>("GoombaP");
            mario = Content.Load<Texture2D>("mario");
            luigi = Content.Load<Texture2D>("luigi");
            marioj = Content.Load<Texture2D>("marioj");
            luigij = Content.Load<Texture2D>("luigij");
            reset = Content.Load<Texture2D>("reset");
            playagain = Content.Load<Texture2D>("playagain");
            fuente = Content.Load<SpriteFont>("Verdana");
            koopa = Content.Load <Texture2D>("koopa");
            start = Content.Load<Texture2D>("start");
            instrucciones = Content.Load<Texture2D>("instrucciones");

           
        }

        // TODO: use this.Content to load your game content here


        /// <summary>
        /// UnloadContent will be called once per game and is the place to unload
        /// all content.
        /// </summary>
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }

        /// <summary>
        /// Allows the game to run logic such as updating the world,
        /// checking for collisions, gathering input, and playing audio.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        ///

        int clicEn(int xmouse, int ymouse)
        {
            Rectangle rmouse;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);

            for (int x = 0; x < 7; x++)
            {


                if (rmouse.Intersects(arreglo[x]))
                {
                   
                    return x;

                }

            }
            return 0;
        }

        int clicreset(int xmouse, int ymouse)
        {
            Rectangle rmouse;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);

               if (rmouse.Intersects(rreset))
                {

                    return 1;

                }
               return 0;
                       
           
        }

        int clicagain(int xmouse, int ymouse)
        {
            Rectangle rmouse;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);

            if (rmouse.Intersects(rplay))
            {

                return 1;

            }
            return 0;


        }

        int clicstart(int xmouse, int ymouse)
        {
            Rectangle rmouse;

            rmouse = new Rectangle(xmouse, ymouse, 1, 1);

            if (rmouse.Intersects(strt))
            {

                return 1;

            }
            return 0;


        }
       




        protected override void Update(GameTime gameTime)
        {
            // Allows the game to exit
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
                this.Exit();



            // TODO: Add your update logic here
            mouse = Mouse.GetState();

            if (mouse.LeftButton == ButtonState.Pressed)
            {
                int a;
                a = clicagain(mouse.X, mouse.Y);

                if (a == 1)
                {
                    this.Initialize();
                    perder = true;
                }
            }

            if (perder == true)
            {
                for (int r = 1; r < graphics.GraphicsDevice.Viewport.Width; r++)
                {
                    x += 2;
                    if (x == graphics.GraphicsDevice.Viewport.Width)
                        x = 0;
                }
                try
                {
                    if (mouse.LeftButton == ButtonState.Pressed)
                    {

                        int pos = clicEn(mouse.X, mouse.Y);

                        if (arr[pos] == 1)
                        {
                            if (arr[pos + 1] == 0)
                            {
                                color = Color.Red;
                                arr[pos] = 0;
                                arr[pos + 1] = 1;
                            }
                            else if (arr[pos + 2] == 0)
                            {
                                color = Color.Red;
                                arr[pos] = 0;
                                arr[pos + 2] = 1;
                            }



                        }


                        else
                        {
                            pos = clicEn(mouse.X, mouse.Y);

                            if (arr[pos] == 2)
                            {
                               
                                if (arr[pos - 1] == 0)
                                {
                                    color2 = Color.Blue;
                                    arr[pos] = 0;
                                    arr[pos - 1] = 2;
                                }
                                else if (arr[pos - 2] == 0)
                                {
                                    color2 = Color.Blue;
                                    arr[pos] = 0;
                                    arr[pos - 2] = 2;
                                }


                            }


                        }


                    }

                    else if (mouse.LeftButton == ButtonState.Released)
                    {
                        color = Color.White;
                        color2 = Color.White;
                    }

                    if (inicia == false)
                    {
                        if (tiempo < 60)
                            tiempo += gameTime.ElapsedGameTime.TotalSeconds;
                        else
                            tiempo = 0;

                    }
                    base.Update(gameTime);
                }

                catch (Exception)
                {
                }
               
                if (mouse.LeftButton == ButtonState.Pressed)
            {
                int p;
                p = clicreset(mouse.X, mouse.Y);

                if (p == 1)
                {
                    arr[0] = 1;
                    arr[1] = 1;
                    arr[2] = 1;
                    arr[3] = 0;
                    arr[4] = 2;
                    arr[5] = 2;
                    arr[6] = 2;
                }

            }

            }

           

           
        }




        /// <summary>
        /// This is called when the game should draw itself.
        /// </summary>
        /// <param name="gameTime">Provides a snapshot of timing values.</param>
        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            // TODO: Add your drawing code here
            spriteBatch.Begin();
            double segundos;
            if(mouse.LeftButton == ButtonState.Pressed)
            {
                int d;
                d = clicstart(mouse.X, mouse.Y);
                    if(d==1)
                    {
                        inicia = false;
                    }
            }

            if (inicia == true)
            {
                spriteBatch.Draw(instrucciones, new Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height), Color.White);
               
                spriteBatch.Draw(start, strt, color);

                segundos = 61;
            }

            else if (inicia == false)
            {


                segundos = Math.Truncate(61.0 - tiempo);
                spriteBatch.Draw(fondo, new Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height), Color.White);
                spriteBatch.Draw(Hongo, new Rectangle(5, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
                spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) + 10, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
                spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 2 + 15, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
                spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 3 + 20, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
                spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 4 + 25, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
                spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 5 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
                spriteBatch.Draw(Hongo, new Rectangle((graphics.GraphicsDevice.Viewport.Width / 7) * 6 + 30, (graphics.GraphicsDevice.Viewport.Height) / 8 * 6 + 4, 80, 80), Color.White);
                spriteBatch.Draw(reset, rreset, Color.White);
                spriteBatch.Draw(playagain, rplay, Color.White);
                spriteBatch.Draw(koopa, new Rectangle(x, y, 80, 80), Color.White);

                for (int xx = 0; xx < 7; xx++)
                {
                    if (arr[xx] == 1)
                    {

                        spriteBatch.Draw(mario, arreglo[xx], color);


                    }

                    if (arr[xx] == 2)
                    {
                        spriteBatch.Draw(luigi, arreglo[xx], color2);

                    }

                   

                }


                Vector2 V = new Vector2(graphics.GraphicsDevice.Viewport.Width - 125, 0);
                if (gameover == 0)

                    spriteBatch.DrawString(fuente, segundos + "", V, Color.White);

                if (segundos == 0)
                {

                    {
                        spriteBatch.DrawString(fuente, "Game Over", new Vector2(350, 300), Color.White);
                        gameover = 1;

                        perder = false;

                       
                       
                    }
                   
                }

                if (arr[0] == 2 && arr[1] == 2 && arr[2] == 2 && arr[4] == 1 && arr[5] == 1 && arr[6] == 1)
                {
                    spriteBatch.DrawString(fuente, "You Won!!!", new Vector2(350, 300), Color.White);

                    GraphicsDevice.Clear(Color.Black);
                    perder = false;
                    gameover = 1;


                }
            }
                spriteBatch.End();





                base.Draw(gameTime);
            }
        }
    }






A y para los que me preguntaban el por qué se regresa el valor 0 en el metodo, es por que primero, para poder compilar me pide que regrese una variable mas, y es por que esa variable necesita una valor alterlo por si no se da clic, y ese valor es 0.

Gracias de nuevo :D

Saludos.

kbks

Es decir, que devuelves lo mismo si da clic en el primer elemento (0) o si no da clic en ninguno. ¿No debería de ser cualquier otro número que tu identifiques como que no ha pulsado nada desde fuera del método (-1, 7 o 40000)?






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.