locked
Metodos para Videojuegos... RRS feed

  • Pregunta

  • Muy buenas Foro!!

    He empezado a investigar sobre el desarrollo de Videojuegos en C# y estoy intentado hacer algo pequeño a ver que tal...
    Actualmente tengo un Metodo para mover un Picturebox (un supuesto personaje) hacia donde haga click con el mouse.
    El método funciona, osea, el personaje se mueve hacia donde le indique, pero primero ajusta el eje X y despues el eje Y, es decir, primero se mueve en vertical y despues en horizontal hacia donde le indico, y no se como hacer para conseguir que pueda moverse en diagonal, Ajustando los 2 ejes al mismo tiempo...

    Este es el metodo que uso...

            private Point Mover(int X, int Y)
            {
               if (X > pictureBox1.Location.X)
               {
    
                   for (int X1 = pictureBox1.Location.X; X1 < X; X1++)
                   {
                       
                       
                       if(Y > pictureBox1.Location.Y)
                       {
                           for (int Y1 = pictureBox1.Location.Y; Y1 < Y; Y1++)
                           {
                              pictureBox1.Location = new Point(X1, Y1);
                           }
                       }
                       else
                       {
                           for (int Y1 = pictureBox1.Location.Y; Y1 > Y; Y1--)
                           {
                               pictureBox1.Location = new Point(X1, Y1);
                           }
                       }
                   }
               }
               else
               {
                   for (int X1 = pictureBox1.Location.X; X1 > X; X1--)
                   {
                       
    
                       if (Y > pictureBox1.Location.Y)
                       {
                           for (int Y1 = pictureBox1.Location.Y; Y1 < Y; Y1++)
                           {
                               pictureBox1.Location = new Point(X1, Y1);
                           }
                       }
                       else
                       {
                           for (int Y1 = pictureBox1.Location.Y; Y1 > Y; Y1--)
                           {
                               pictureBox1.Location = new Point(X1, Y1);
                           }
                       }
                   }
               }
                return new Point(X, Y);
            }


    Algo que me llamó mucho la atención fue el XNA, pero al intentar correr alguna Aplicacion hecha en XNA me da un error de que se requiere el Pixel Shader y Vertex Shader 1.1, cosa que no soporta esta #$%#$ de tarjeta Intel, asi que decidi seguir sin XNA (por ahora).

    Cualquier aporte acerca del desarrolo de videojuegos en C# o cualquier método que pueda utilizar alguna vez en lo que sea relacionado con este tipo de desarrollo estará mas que agradecido...

    Salu3 y mucha suerte!!!
    [Fernando Nicolás Santana Bueno] || {Analista Programador (VB.net & ASP.NET, empezando con C# y probando con JAVA...)} || Santo Domingo, República Dominicana
    viernes, 20 de noviembre de 2009 14:47

Respuestas

  • Hola Nicolas,

    Si lo que quieres hacer es desarrollar videojuegos sería interesante que te olvides del System.Forms y comiences a mirar el Microsoft.XNA.Framework :-)

    puedes encontrar info de como iniciarte en:

    http://creators.xna.com
    http://xnacommunity.codeplex.com/

    Un saludo
    http://geeks.ms/blogs/jbosch
    http://www.verticaling.com
    lunes, 11 de enero de 2010 0:08
  • mira este codigo es casi la version correcta de lo que quieres:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace PruebasForms
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Click(object sender, EventArgs e)
            {
                Mover_PictureBox(pictureBox1, this.PointToClient(Control.MousePosition));
            }
    
            private void Mover_PictureBox(PictureBox pic, Point puntoMouse)
            {
                Point puntoPictureBox = pic.Location;
    
                while(puntoPictureBox != puntoMouse)
                {
                    puntoPictureBox = CalcularSiguientePunto(puntoPictureBox, puntoMouse);
                    pictureBox1.Location = puntoPictureBox;
                    System.Threading.Thread.Sleep(10);
                }
                
            }
    
            private Point CalcularSiguientePunto(Point puntoActual, Point nuevoPunto)
            {
                if (puntoActual.X > nuevoPunto.X)
                    puntoActual.X--;
                else if (puntoActual.X < nuevoPunto.X)
                    puntoActual.X++;
    
                if (puntoActual.Y > nuevoPunto.Y)
                    puntoActual.Y--;
                else if (puntoActual.Y < nuevoPunto.Y)
                    puntoActual.Y++;
    
                return puntoActual;
            }
        }
    }
    

    si te fijas se mueve al tiempo en X y Y.

    Claro que no te dara una diagonal perfecta y al final hara movimientos rectos para ajustarse... pero asi es como tu lo has diseñado.

    Si quieres que te quede con diagonales 'perfectas' entonces puedes hacer algo asi utilizando la ecuación de la recta:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace PruebasForms
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Click(object sender, EventArgs e)
            {
                Mover_PictureBox2(pictureBox1, this.PointToClient(Control.MousePosition));
            }
    
    
    
            private void Mover_PictureBox2(PictureBox pic, Point puntoMouse)
            {
                //para evitar que se den divisiones por 0
                if (pic.Location != puntoMouse)
                {
                    Point puntoPictureBox = pic.Location;
                    /*Calcular la pendiente
                     * m = (y2 - y1)
                     *     ---------
                     *     (x2 - x1)
                     * */
                    double m = (puntoMouse.Y - puntoPictureBox.Y)
                             / (double)(puntoMouse.X - puntoPictureBox.X);
    
                    while (puntoPictureBox != puntoMouse)
                    {
                        puntoPictureBox = CalcularSiguientePunto2(m, puntoPictureBox, puntoMouse);
                        pictureBox1.Location = puntoPictureBox;
                        System.Threading.Thread.Sleep(10);
                    }
                }
            }
    
            private Point CalcularSiguientePunto2(double m, Point puntoActual, Point puntoDestino)
            {
                if (puntoActual.X > puntoDestino.X)
                    puntoActual.X--;
                else if (puntoActual.X < puntoDestino.X)
                    puntoActual.X++;
    
                //se hace este if como auxiliar para ajustar presición
                if (puntoActual.X != puntoDestino.X)
                {
                    /*dada la ecuación general de la recta :
                     * se obtiene que : y1 = m(x1 - x2) + y2*/
                    puntoActual.Y = (int) Math.Round((m*(puntoActual.X - puntoDestino.X)),0) + puntoDestino.Y;
                }
                else
                    puntoActual.Y = puntoDestino.Y;
    
                return puntoActual;
            }
    
        }
    }





    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Visita Mi Blog C# XNA Sistemas Operativos
    viernes, 27 de noviembre de 2009 21:46

Todas las respuestas

  • calcula el nuevo punto en sus dos ejes X y Y y una vez calculado entonces si lo asignas a Location.


    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Visita Mi Blog C# XNA Sistemas Operativos
    viernes, 27 de noviembre de 2009 19:47
  • Muy buenas Juan Carlos y gracias por responder...

    Ya se que tengo que calcular los 2 ejes al mismo tiempo, la cosa es como calcularlo...

    Salu3 y suerte...
    [Fernando Nicolás Santana Bueno] || {Analista Programador (VB.net & ASP.NET, empezando con C# y probando con JAVA...)} || Santo Domingo, República Dominicana
    viernes, 27 de noviembre de 2009 19:59
  • mira este codigo es casi la version correcta de lo que quieres:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace PruebasForms
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Click(object sender, EventArgs e)
            {
                Mover_PictureBox(pictureBox1, this.PointToClient(Control.MousePosition));
            }
    
            private void Mover_PictureBox(PictureBox pic, Point puntoMouse)
            {
                Point puntoPictureBox = pic.Location;
    
                while(puntoPictureBox != puntoMouse)
                {
                    puntoPictureBox = CalcularSiguientePunto(puntoPictureBox, puntoMouse);
                    pictureBox1.Location = puntoPictureBox;
                    System.Threading.Thread.Sleep(10);
                }
                
            }
    
            private Point CalcularSiguientePunto(Point puntoActual, Point nuevoPunto)
            {
                if (puntoActual.X > nuevoPunto.X)
                    puntoActual.X--;
                else if (puntoActual.X < nuevoPunto.X)
                    puntoActual.X++;
    
                if (puntoActual.Y > nuevoPunto.Y)
                    puntoActual.Y--;
                else if (puntoActual.Y < nuevoPunto.Y)
                    puntoActual.Y++;
    
                return puntoActual;
            }
        }
    }
    

    si te fijas se mueve al tiempo en X y Y.

    Claro que no te dara una diagonal perfecta y al final hara movimientos rectos para ajustarse... pero asi es como tu lo has diseñado.

    Si quieres que te quede con diagonales 'perfectas' entonces puedes hacer algo asi utilizando la ecuación de la recta:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace PruebasForms
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Click(object sender, EventArgs e)
            {
                Mover_PictureBox2(pictureBox1, this.PointToClient(Control.MousePosition));
            }
    
    
    
            private void Mover_PictureBox2(PictureBox pic, Point puntoMouse)
            {
                //para evitar que se den divisiones por 0
                if (pic.Location != puntoMouse)
                {
                    Point puntoPictureBox = pic.Location;
                    /*Calcular la pendiente
                     * m = (y2 - y1)
                     *     ---------
                     *     (x2 - x1)
                     * */
                    double m = (puntoMouse.Y - puntoPictureBox.Y)
                             / (double)(puntoMouse.X - puntoPictureBox.X);
    
                    while (puntoPictureBox != puntoMouse)
                    {
                        puntoPictureBox = CalcularSiguientePunto2(m, puntoPictureBox, puntoMouse);
                        pictureBox1.Location = puntoPictureBox;
                        System.Threading.Thread.Sleep(10);
                    }
                }
            }
    
            private Point CalcularSiguientePunto2(double m, Point puntoActual, Point puntoDestino)
            {
                if (puntoActual.X > puntoDestino.X)
                    puntoActual.X--;
                else if (puntoActual.X < puntoDestino.X)
                    puntoActual.X++;
    
                //se hace este if como auxiliar para ajustar presición
                if (puntoActual.X != puntoDestino.X)
                {
                    /*dada la ecuación general de la recta :
                     * se obtiene que : y1 = m(x1 - x2) + y2*/
                    puntoActual.Y = (int) Math.Round((m*(puntoActual.X - puntoDestino.X)),0) + puntoDestino.Y;
                }
                else
                    puntoActual.Y = puntoDestino.Y;
    
                return puntoActual;
            }
    
        }
    }





    Colabora con la comunidad, si éste mensaje te ha sido de utilidad, márcalo como respuesta correcta.
    Juan Carlos Ruiz Pacheco
    Ingeniero de Sistemas
    Microsoft MVP C#
    MCP,MCTS,DCE+Platino,OCA,OCP
    Visita Mi Blog C# XNA Sistemas Operativos
    viernes, 27 de noviembre de 2009 21:46
  • Hola Nicolas,

    Si lo que quieres hacer es desarrollar videojuegos sería interesante que te olvides del System.Forms y comiences a mirar el Microsoft.XNA.Framework :-)

    puedes encontrar info de como iniciarte en:

    http://creators.xna.com
    http://xnacommunity.codeplex.com/

    Un saludo
    http://geeks.ms/blogs/jbosch
    http://www.verticaling.com
    lunes, 11 de enero de 2010 0:08