Desarrollo de juegos II

Siguiendo con el post anterior, y esto del desarrollo de juegos. Ahora les traigo una pieza de código muy simple, creada en C#.

 

Este mini juego nació, como otros, para fin de año. Normalmente, todos los fines de año a modo de tarjeta navideña, en vez de enviar las tipicas postales por internet, me siento un rato y hago un mini juego. En esta ocasión, un Arkanoid.

 

Como ya dije, haciendo uso de C# y GDI+, nada del otro mundo, pero pasa por medianamente aceptable Risa

 
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Xmass
{
    public partial class Form1 : Form
    {
        const int _LengthX = 6;
        const int _LengthY = 14;
        #region "Pictures variables"
        private PictureBox picArka = new PictureBox();
        private PictureBox picBall = new PictureBox();
        private PictureBox[,] picBox = new PictureBox[_LengthX, _LengthY];
        #endregion
        private int intPoints = 0;
        private Timer oTimer = new Timer();
        #region "Ball variables"
        private int _posX = 1;
        private int _posY = -1;
        private int _Speed = 4;
        private int _VelCounter = 0;
        #endregion
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            InitializeArray();
            Bitmap oBitMap = new Bitmap(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Xmass.arka.bmp"));
            picArka.Image = oBitMap;
            picArka.Visible = true;
            picArka.Left = (this.Width / 2) – ((picArka.Width / 2) / 2);
            picArka.Top = this.Height – picArka.Height;
            picArka.Height = 15;
            picArka.Width = 48;
            picArka.MouseMove += new MouseEventHandler(pArka_MouseMove);
            Bitmap oBallBitMap = new Bitmap(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Xmass.ball.bmp"));
            picBall.Image = oBallBitMap;
            picBall.Visible = true;
            picBall.Width = 8;
            picBall.Height = 8;
            picBall.Left = (this.Width / 2) – ((picBall.Width / 2) / 2);
            picBall.Top = picArka.Top – picBall.Height;
            oTimer.Tick += new EventHandler(MoveBall);
            oTimer.Enabled = true;
            oTimer.Interval = 50;
           
            this.Controls.Add(picBall);
            this.Controls.Add(picArka);
        }
             
        private void MoveBall(object o, EventArgs e)
        {
            int xBallPosition = picBall.Top + picBall.Height;
            int yBallPosition = picArka.Left + picArka.Width;
           
            if (_VelCounter <= 500)
                _VelCounter++;
            //switch (_VelCounter)
            //{
            //    case 500:
            if (_VelCounter == 500)
                _Speed += 3;
            //        break;
                //case 1000:
                //    _Speed *= 2;
                //    break;
            //}
            picBall.Left += (_Speed * _posX);
            picBall.Top += (_Speed * _posY);
            if ((xBallPosition >= picArka.Top)
                && (_posY == 1)
                    && ((picBall.Left >= picArka.Left) && (picBall.Left <= yBallPosition)))
                    {
                    picBall.Top -= (_Speed * _posY);
                    _posY *= -1;
                    }
                   
            if (picBall.Top >= (picArka.Top + picArka.Height))
            {
                this.lblFinJuego.Visible = true;
                picImagen.Visible = true;
                oTimer.Enabled = false;
            }
            if (picBall.Top <= 0)
            {
                picBall.Top -= (_Speed * _posY);
                _posY *= -1;
            }
            if ((picBall.Left >= (this.Width – picBall.Width)) || (picBall.Left <= 0))
            {
                picBall.Left -= (_Speed * _posX);
                _posX *= -1;
            }
            CheckGiftCollition();
        }
        private void CheckGiftCollition()
        {
            bool _blnEndGame = true;
            for (int i = 0; i<=_LengthX – 1; i++)
            {
                for (int j = 0; j<=_LengthY – 1; j++)
                {
                    if ((picBall.Top <= (picBox[i,j].Top + picBox[i,j].Height))
                        && (picBall.Top >= picBox[i,j].Top)
                        && (picBall.Left >= (picBox[i,j].Left))
                        && ((picBall.Left + picBall.Width) <= (picBox[i,j].Left + picBox[i,j].Width))
                        )
                    {
                        if (picBox[i,j].Visible == true)
                        {
                            //_posX *= -1;
                            _posY *= -1;
                            intPoints += 10;
                            picBox[i,j].Visible = false;
                            this.lblPoints.Text = "Points: " + intPoints.ToString();
                        }
                    }
                   
                    if (picBox[i,j].Visible)
                    {
                        if (_blnEndGame)
                        {
                        _blnEndGame = !_blnEndGame;
                        }
                    }
                }
            }
            if (_blnEndGame)
            {
                this.lblFinJuego.Visible = true;
                picImagen.Visible = true;
                oTimer.Enabled = false;
            }
        }
        private void InitializeArray()
        {
            Bitmap oBitMap = new Bitmap(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Xmass.box.bmp"));
            for (int i = 0; i<=_LengthX – 1; i++)
            {
                for (int j = 0; j<=_LengthY – 1; j++)
                {
                    picBox[i,j] = new PictureBox();
                    picBox[i,j].Width = 17;
                    picBox[i,j].Height = 22;
                    picBox[i,j].Image = oBitMap;
                    picBox[i,j].Top = (i + 1) * 30;
                    picBox[i,j].Left = (j + 1) * 20;
                    this.Controls.Add(picBox[i,j]);
                }
            }
        }
        #region "Arkanoid movements"
        private void pArka_MouseMove(object sender, MouseEventArgs e)
        {
            int X = 0;
            X = picArka.Left + e.X;
            CalculatePosition(X);
        }
        protected override void OnMouseMove(MouseEventArgs e)
        {
          base.OnMouseMove(e);
            CalculatePosition(e.X);
        }
     
        private void CalculatePosition(int MouseX)
        {
            int X = 0;
            X = MouseX – ((picArka.Width / 2) / 2);
            picArka.Left = X;
        }
        #endregion
    }
}
 
 
Estoy en proceso de conseguir una maquina medianamente aceptable, asi que, si tengo suerte, traere algunas cosas con XNA.
About these ads

13 comentarios on “Desarrollo de juegos II”

  1. JORGE ERNESTO dice:

    Hola MiNombre es Jorge Chavez, Quisiera aprender a Desarrollar juegos de lo que sea o ser trabajador de una empresa que se dedicara a programar juegos, buen  a lo que voy, Quisiera saber como poner un juego en red, pro ejemplo algun serpientes y escaleras, o por que no este mismo que hiciste.
     
    Muchas Gracias  Saludos 

  2. Matias dice:

    Hola Jorge, cuando dices de poner el juego en red, te refieres a que mas de una persona pueda jugarlo? Por ejemplo, que dos personas esten jugando al mismo tiempo y se vean mutuamente? O, que pueda jugarse desde una pagina web?
     
    Si es este ultimo, lo que se suele usar es ShockWave o Flash, o Java. Estos estan preparados para este trabajo. Digo, para la publicacion en Web. Ahora, tambien puedes hacer un ActiveX, con sus complicaciones, pero te da mucha potencia. 

  3. JORGE ERNESTO dice:

    Hola  Matias, yo me refiero a que dos personas esten jugando al mismo tiempo un juego, y que se vea mutuamente, por ejemplo:
     
    El juego de mesa, SERPIENTES Y ESCALERAS, que es muy conocido, que en dos PC al mismo tiempo puedan jugar y que uno espere el turno del otro, asi hasta que una persona gane el juego.
     
    tambien quisiera trabajar en una empresa que se dedicara a hacer juegos para consola, como Xbox 360, o Play Station 3, o PC.
     
    Es una de mis metas poder trabajar en una empresa derrolladora de juegos.
     
    Saludos  y muchas gracias.

  4. JORGE ERNESTO dice:

    Hola Matias Otra vez:
     
    Esta vez te escribo, me gustaria que me pudieras decir como funciona tu juego, lo que pasa es que yo vi en el codigo que tienes varios control sobre el formulario, y como no se en donde ban ni como ponerlo. pues quisiera ver si tienes tiempo y me pudieras explicar como estan puesto en el formulario. No se si en alguna entrega anterior utilizaste o diste algo de los controles que ivas a utilizar o si todo esta en el codigo y la imagen que dejaste.
     
    Suerte y saludos

  5. Matias dice:

    Lo que hice para este caso, es colocar estos controles en el formulario y son ellos los que se mueven e interactuan entre si. Esto no es la mejor manera de hacerlo, ya que estas moviendo controles grandes, pesados, y que no tienen mucha capacidad para hacer este tipo de trabajo.
     
    Lo ideal es que todo esto se "pinte" sobre un lienzo, un formulario, la pantalla, etc. Asi puedes crear todo en memoria, dibujarlo primero alli, y luego pasarlo a la parte visual como una foto.
     
    De cualquier manera, te comento rapidamente. Lo que tienes son 4 PictureBox, uno para el arkanoid, otro para la pelotita, otro para una imagen de fondo que se muestra cuando ganas o pierdes, y otra para para las cajas. La cual es un vector de dos dimensiones que almacena cada una de las cajas. Esta ultima se crea dinamicamente y muestra las cajas.
     
    Teniendo estas cosas, lo demas deberia acomodarse solo (Si no mal recuerdo), ya que las posiciones iniciales se pre setean, asi como el tamaño de los picture box.
     
    Una vez mas, esta no es la manera de hacer un juego profesional. Esto es solo para hacer poco codigo :)
     
    Saludos.

  6. JORGE ERNESTO dice:

    Hola Otra vez, Me gustaria saber de donde eres y saber en que tecnologias estas involucrado
     
    yo soy programadore Web, no con mucha experiencia pero poco a poco la llevo..
    saludos gracias 

  7. JORGE ERNESTO dice:

    hola Matias , quisiera ver si me podrias proporcionar las imagenes del juego.
    Saludos Gracias
     

  8. Matias dice:

    Listo, se agregaron las imagenes del juego.
     
    Tendras que recortarlas un poco y sacarlas por separado. En la primer imagen, se puede ver la estructura de la aplicacion para tener una mejor idea.
     
    Con respecto a tus otras preguntas. Vivo en Cordoba, Argentina. Y con respecto a las tecnologias, muy facil :), todo lo referido a Microsoft.

  9. JORGE ERNESTO dice:

    Muchas Gracias una ultima cosa:
     
     Bitmap oBitMap = new Bitmap(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Xmass.arka.bmp"));
     
    Este Codigo Me Pudieras decir a que hace referencia, por que cuando ejecuto la aplicacion me marca error de referencia nula.
    Si no me equivoco son las imagenes, yo puse algunas que baje de la red, y le puse ese nombre,pero me marca ese mismo error.
     
    ¿La pongo en alguna carpeta en especial?
     
    DIsculpa que te moleste tanto
     
    Yo tambien estoy con las tecnologias de Microsoft y soy de La Ciudad de CULIACAN SINALOA MEXICO y estudio en la UNIVERSIDAD AUTONOMA DE SINALOA
     
     

  10. Matias dice:

    Esta linea lee los archivos desde "adentro" del assembly. O sea, las imagenes estan dentro del EXE. Esta es una manera facil de transportar las imagenes junto con tu programa y asi no tener miles de archivos los cuales podrian ser borrados o cambiados.
     
    Para hacer que la imagen este dentro, selecciona la imagen desde el explorador de soluciones de Visual Studio y en sus propiades coloca que trabaje como recurso embebido.
     
    De cualquier manera, podrias hacer el mismo trabajo cambiando la linea para que lo lea de una carpeta fisica.

  11. maria del carmen dice:

    como hacer un codigo de el juego serpientes y escaleras pero en c++ o un ejemplo
    urge saber porfavor contestar lo mas pronto posible

  12. Adriana dice:

    hola…..como puedo hacer para que un picturebox(imagen de barco) se mueva por el windows form o un ejemplo xfa lo necesito lo mas pronto posible gracias…….

  13. Matias dice:

    No se cual es el objetivo que persigues. De cualquier manera, simplemente debes modificar las propiedades Top y Left del control para que este se mueva. Como el movimiento se realiza como los dibujos animados, necesitas de un Timer que dispare el movimiento cada X cantidad de tiempo y asi lograr un movimiento fluido. De hecho, en el ejemplo de este post tienes la forma de como hacerlo.


Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 368 seguidores