Microsoft MVP

Email y Rss

email rss

Klout

Seguidores en facebook

Timeline de mi Twitter

Tienes preguntas?

Ideas de un Conejo
Más allá de los sistemas de información: (C#)=> videojuegos, soluciones a problemas interesantes y Sistemas Operativos
XNA
C#
Sistemas Operativos
Varios
Windows Phone
WinRT
XAML
Azure
HTML 5
Acerca de

Detección de Colisiones 2D básica

May 5th, 2007 by JuanK

Follow @JuanKRuiz

En el procesos de desarrollo de videojuegos las colisiones juegan un papel fundamental tanto que sin ellas se puede decir que no hay juego.

Hay diferentes formas de manejar las colisiones dependiendo de muchos factores como por ejemplo si es un juego 2D o 3D o si es juego de automóviles, uno de aventuras o uno de pelea. Para el caso especifico de los videojuegos 2D, si bien hay diferencias entre unos estilos de juego y otros, existen dos estilos fundamentales para detección de colisiones: Colisión de rectángulos y Colisión de Círculos, cada cual se usa según sea conveniente de acuerdo a la figura que mejor pueda contener al cuadro de animación.

Este articulo se enfocara a la detección de colisiones utilizando rectángulos y/o círculos los principios son aplicables en cualquier herramienta, sin embargo para efectos del articulo se utilizara C# y XNA FrameWork. El performance también es fundamental, como suele suceder hay muchas maneras de hacer las cosas y eso se vera en el desarrollo del articulo.

Cuando utilizar un sistema de colisiones determinado?

Depende principalmente de la forma del sprite, es decir desde luego todo sprite es rectangular, pero la figura descrita dentro de el es generalmente irregular y existen casos en los que un cuadrado no daría la precisión adecuada para la forma dibujada en el sprite como se puede ver en la figura descrita a continuación:

colisiones1

En el ejemplo se puede observar una situación tipica, un programa detector de colisiones diría que en ambos casos hay colisión, pero es evidente que solo hay colisión real cuando se usa detección de colisiones usando círculos. Desde luego también ocurren casos contrarios al anterior, como se ve en la siguiente imagen:

Colisiones2

Es claro que el personaje al cual le calculan la colisión usando circunferencias esta en desventaja.

Detección de Colisiones Entre Círculos

Para calcular colisiones entre dos círculos se requieren conocer el radio de cada circulo y su posición, realmente y aunque no pareciera, calcular la colisión de dos círculos es sencillo, se debe determinar la distancia entre el centro de un circulo y el centro del otro círculo, si la distancia entre ambos centros es menor que la suma de los radios de ambos círculos entonces existe una colisión entre ellos .

Colisiones3

Así que desde luego el paso a seguir es el paso 1: Establecer la distancia entre dos puntos.

Cálculo de la distancia entre dos puntos

La distancia entre dos puntos se determina haciendo uso de la ecuación: formula que se deriva del álgebra de Pitágoras. La implementación de esta ecuación se muestra a continuación:

El código es C# y la estructura Vector2 hace parte de XNA Framework.

        /// <summary>
        /// Calculate the distance between 2 points the algoritm is 100% accurate
        /// as well this algoritm is not extreme fast
        /// </summary>
        /// <param name="p1">Point 1</param>
        /// <param name="p2">Point 1</param>
        /// <returns>The distance between the points</returns>
        public static int AccurateDistance( Vector2 p1,  Vector2 p2)
        {
            return (int) System.Math.Sqrt((p2.X - p1.X) * (p2.X - p1.X) + (p2.Y - p1.Y) * (p2.Y - p1.Y));
        }

Con esto ya se tiene casi todo hecho, solo es necesario sumar los radios de los círculos y restarles la distancia obtenida, si la distancia es <= a 0 entonces existe colisión.

Sin embargo esta formula tiene una debilidad y es que usada de manera intensa (como suele suceder en un vjuego) puede volverse poco eficiente, así que en su lugar se puede hacer uso de la siguiente implementación, que si bien no brinda un resultado 100% preciso si ofrece una muy cercana aproximación a este y sobre todo es mucho más rápida que la versión anterior, la implementación hace uso de la Serie de Maclaurin:

El código es C# y la estructura Vector2 hace parte de XNA Framework.

        /// <summary>
        /// Calculate the distance between 2 points, it use a fast algoritm as well this
        /// algoritm isn't 100% accurate
        /// </summary>
        /// <param name="p1">Point 1</param>
        /// <param name="p2">Point 1</param>
        /// <returns>The distance between the points</returns>
        public static int FastDistance( Vector2 p1, Vector2 p2)
        {
            int x = (int)System.Math.Abs(p2.X - p1.X);
            int y = (int)System.Math.Abs(p2.Y - p1.Y);

            int min = x < y ? x : y;

            return System.Math.Abs(x + y - (min >> 1) - (min >> 2) + (min >> 4));
        }

Detección de Colisiones Entre Rectángulos

Para determinar si existe colisión entre dos rectángulos se necesita únicamente conocer su posición y sus dimensiones. El cálculo es sencillo, imaginemos que estamos en un sistema de coordenadas de dos dimensiones, si en el eje X el rectángulo 1 inicia antes que termine el dibujo del rectángulo 2 y si el rectángulo 2 inicia antes de que finalice el dibujo del rectángulo 1 y si hacemos el mismo ejercicio en el eje Y entonces existe una colisión entre los rectángulos, si una de las 4 condiciones falla entonces no hay colisión.

Colisiones 4

Para una implementación de colisiones básica esta implementación es mas que suficiente, informa cuando hay colisión entre dos rectángulos, he usado algunos parentesis adicionales en el if tan solo por claridad, pero estos no son necesarios.

El código es C# y la estructura Rectangle hace parte de XNA Framework.

        /// <summary>
        /// Calculale if two rectangles are colisioning between they
        /// </summary>
        /// <param name="a">Rectangle 1</param>
        /// <param name="b">Rectangle 2</param>
        /// <returns>bool if an intersection exist if not false</returns>
        public static bool RectangleColission( Rectangle a, Rectangle b)
        {
            if ( (a.X < b.X + b.Width) && (b.X < a.X + a.Width) && (a.Y < b.Y + b.Height))
            {
                return b.Y < a.Y + a.Height;
            }
            
            return false;
        }

Esta función es lo suficientemente rápida para la mayoría de los casos, sin embargo en ocasiones es necesario no solo determinar si existe colisión entre los rectángulos sino adicionalmente calcular el rectángulo resultante de dicha colisión, este caso es muy común cuando se realizan procesos de detección de colisiones mas avanzadas como por ejemplo la colisión perfecta la cual compara en que puntos del rectángulo de intersección dos colores se tocan entre si, esta seria una implementación optimizada que permite en un solo paso obtener el rectángulo de intersección y determinar si existe o no colisión.

[/code]

        /// <summary>
        /// Calculale if two rectangles are colisioning between they and obtain the resulting interect rectangle
        /// </summary>
        /// <param name="a">Rectangle 1</param>
        /// <param name="b">Rectangle 2</param>
        /// <param name="c">output intersection Rectangle </param>
        /// <returns>bool if an intersection exist if not false</returns>
        /// <remarks>if not colission exists the output rectangle is the empty rectangle</remarks>
        public static bool RectangleIntersection( Rectangle a,  Rectangle b, out Rectangle c)
        {
            Rectangle c = new Rectangle c();
            int x = System.Math.Max(a.X, b.X);
            int num2 = System.Math.Min(a.X + a.Width, b.X + b.Width);
            int y = System.Math.Max(a.Y, b.Y);
            int num4 = System.Math.Min(a.Y + a.Height, b.Y + b.Height);

            if (num2 >= x && num4 >= y)
            {
                c.X = x;
                c.Y = y;
                c.Width = num2 - x;
                c.Height = num4 - y;

                return true;
            }
            c.Height =c.Width =c.Y =c.X = 0;
            return false;
        }

En una próxima entrada del blog estare tratando el tema de colisiones por píxel.

Juan Carlos Ruiz Pacheco
Ingeniero de Sistemas

Print Friendly

Follow @JuanKRuiz

  • 24 Comentarios »
  • Publicado en la categoría 'C#, XNA'

24 comentarios to “Detección de Colisiones 2D básica ”


  • Aoyama Says:
    June 12th, 2007 at 3:01 pm  

    Hola JuanK, aquí visitando tu blog, lo faveare y lo añadiré a mis enlaces ^^ el tema de las colisiones es muy interesante. Saludos!

  • ibito Says:
    July 3rd, 2007 at 2:21 pm  

    Excelente artículo, ¡te felicito Juank!, enlazaré a tu artículo si no hay problema :D

  • Eduardo Says:
    January 8th, 2008 at 3:41 pm  

    Excelene articulo, pero me gustaria esto lo digo a titulo personal que hicieras una introduccion a estos temas, antes de empezar de lleno a programar, pues muchos de los que leemos tus articulos no tenemos un nivel como el tuyo.

    Gracias

  • JuanK Says:
    January 8th, 2008 at 3:48 pm  

    Tienes razón, lo tendre muy en cuenta para las próximas.

  • paola montoya Says:
    January 10th, 2009 at 4:49 pm  

    superrrrr megabien , cone!!!

  • Agustin Says:
    January 17th, 2009 at 3:56 pm  

    Hola conejo JuanK:
    me has solucionado la vida, finalmente he aprendido cómo definir si un rectangulo se intersecta con otro, siempre he usado la función intrínsica de flash, pero ahora tenía que hacer un query en MySQL y ha funcionado de maravilla, después de una pequeña corrección que anoto ahora:

    En la función “RectangleColission”:

    if ( (a.X < b.X + b.Width) && (b.X < a.X + a.Width) && (a.Y < b.Y + b.Height))

    no siempre entrega el resultado correcto
    faltó agregarle lo que pegaste como retorno dela función.

    o sea, el if() quedaría así:

    if ( (a.X < b.X + b.Width) && (b.X < a.X + a.Width) && (a.Y < b.Y + b.Height) && (b.Y < a.Y + a.Height))

    espero no estar haciendo el loco.
    Saludos y Gracias.

  • jesus Says:
    June 23rd, 2009 at 8:27 am  

    Hola, esta interesante eso, estoy estudiando ing de sistemas, y tengo algo de conocimientos de programacion, pero mas que todo he desarrollado por asi decirlo programas de orden administrativos, y ahora he querido incursionar en el area de los video juegos, asi que esta tema me cae excelente… Cualquier recomendacion que pudieses hacerme, algun material que camine en pro de apredender te lo agradecería… saludos
    Buen material…

  • paola montoya Says:
    July 8th, 2009 at 2:31 pm  

    pequeño ponny

  • kechm Says:
    April 3rd, 2011 at 12:18 pm  

    oe man cual es la contraseña de estos archivos en esta pagina…http://www.taringa.net/posts/ebooks-tutoriales/9897882/Tutorial-de-Actionscript-CS3.html ……xq no funka con pass: juank_2010

  • JuanK Says:
    April 3rd, 2011 at 2:46 pm  

    no tengo idea, ese juank no soy yo.

  • newmix Says:
    May 3rd, 2011 at 5:49 pm  

    hola me gustaria saber si alguien me puede ayudar, para completar un juego de damas españolas, quiero que cuando se pase por encima de una ficha esta desaparesca(“comer”) cheken el siguiente codigo:
    no es lo mejor pero al menos lo intento, no se me ocurre mas.
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace DamasGame
    {
    public partial class Form3 : Form
    {
    private Image fichaRojas = (Bitmap)Image.FromFile(@”\DamasGame\DamasGame\DamasGame\Resources\fichaRoja.png”);
    private Image fichaVerdes = (Bitmap)Image.FromFile(@”\DamasGame\DamasGame\DamasGame\Resources\fichaVerde.png”);
    private Image seleccionado = (Bitmap)Image.FromFile(@”\DamasGame\DamasGame\DamasGame\Resources\fondonaranja2select.png”);
    private Image fichaReinaRoja = (Bitmap)Image.FromFile(@”\DamasGame\DamasGame\DamasGame\Resources\fichaReinaRoja.png”);
    private Image fichaReinaVerde = (Bitmap)Image.FromFile(@”\DamasGame\DamasGame\DamasGame\Resources\fichaReinaAzul.png”);
    int picSelecto = 0;
    public bool jugadorRojo = false;
    public bool jugadorVerde = false;
    public bool EsReinaRoja = false;
    public bool EsReinaVerde = false;

    public int contadorfichasVerdes = 0, contadorfichasRojas = 0;

    public Form3()
    {
    InitializeComponent();
    }

    private void Form3_Load(object sender, EventArgs e)
    {
    this.lblComidasVerdes.Text = “0″;
    this.lblComidasRojas.Text = “0″;
    this.picboxComidasVerdes.Image = fichaVerdes;
    this.picboxComidasRojas.Image = fichaRojas;
    this.picboxTurno.Image = fichaRojas;
    jugadorRojo = true;
    CargarJuego();
    }

    public void CargarJuego()
    {
    this.pictureBox1.Image = fichaVerdes;
    this.pictureBox2.Image = fichaVerdes;
    this.pictureBox3.Image = fichaVerdes;
    this.pictureBox4.Image = fichaVerdes;
    this.pictureBox5.Image = fichaVerdes;
    this.pictureBox6.Image = fichaVerdes;
    this.pictureBox7.Image = fichaVerdes;
    this.pictureBox8.Image = fichaVerdes;
    this.pictureBox9.Image = fichaVerdes;
    this.pictureBox10.Image = fichaVerdes;
    this.pictureBox11.Image = fichaVerdes;
    this.pictureBox12.Image = fichaVerdes;

    this.pictureBox21.Image = fichaRojas;
    this.pictureBox22.Image = fichaRojas;
    this.pictureBox23.Image = fichaRojas;
    this.pictureBox24.Image = fichaRojas;
    this.pictureBox25.Image = fichaRojas;
    this.pictureBox26.Image = fichaRojas;
    this.pictureBox27.Image = fichaRojas;
    this.pictureBox28.Image = fichaRojas;
    this.pictureBox29.Image = fichaRojas;
    this.pictureBox30.Image = fichaRojas;
    this.pictureBox31.Image = fichaRojas;
    this.pictureBox32.Image = fichaRojas;

    this.pictureBox1.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox2.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox3.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox4.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox5.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox6.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox7.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox8.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox9.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox10.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox11.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox12.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox13.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox14.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox15.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox16.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox17.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox18.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox19.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox20.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox21.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox22.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox23.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox24.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox25.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox26.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox27.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox28.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox29.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox30.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox31.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox32.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }

    public void NuevoJuego()
    {
    this.lblComidasRojas.Text = “0″;
    this.lblComidasVerdes.Text = “0″;
    this.picboxTurno.Image = fichaRojas;
    contadorfichasRojas = 0;
    contadorfichasVerdes = 0;
    jugadorRojo = true;

    this.pictureBox13.Image = null;
    this.pictureBox14.Image = null;
    this.pictureBox15.Image = null;
    this.pictureBox16.Image = null;
    this.pictureBox17.Image = null;
    this.pictureBox18.Image = null;
    this.pictureBox19.Image = null;
    this.pictureBox20.Image = null;
    }

    private void salirToolStripMenuItem_Click(object sender, EventArgs e)
    {
    DialogResult result = MessageBox.Show(“SE PERDERÁ EL JUEGO ACTUAL, ESTA SEGURO DE QUERER SALIR?”, “AVISO”, MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    if (result == DialogResult.Cancel)
    MessageBox.Show(“VUELVE A JUGAR, QUIZÁS PUEDAS GANAR”, “AVISO”, MessageBoxButtons.OK);
    else
    Application.Exit();
    }

    private void comoJugarToolStripMenuItem_Click(object sender, EventArgs e)
    {
    string NL = Environment.NewLine;
    MessageBox.Show(“UD, empieza con fichas rojas, para avanzar un cuadro a la vez y en diagonal” + NL +
    “seleccione una ficha roja, despues seleccione el cuadro de destino” + NL +
    “el siguiente turno es el mismo procedimiento, solo que hacia abajo” + NL +
    “recuerde las reglas del juego, solo avance un cuadro a la vez, como cuando exista una ficha” + NL +
    “delante de ud, y solo si el siguiente recuadro esta vacio podra comerla.” + NL +
    “No podra si existen dos fichas delante de ud, no podra regresar una fila anterior.”);
    }

    private void acercaDeToolStripMenuItem_Click(object sender, EventArgs e)
    {
    MessageBox.Show(“JUEGO DE DAMAS ESPAÑOLAS v 1.0″);
    }

    private void nuevoJuegoToolStripMenuItem_Click(object sender, EventArgs e)
    {
    DialogResult result = MessageBox.Show(“SE PERDERÁ EL JUEGO ACTUAL, ESTA SEGURO DE EMPEZAR DE NUEVO?”, “AVISO”, MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    if (result == DialogResult.Cancel)
    MessageBox.Show(“REGRESA A JUGAR HOMBRE!”, “AVISO”);
    else
    {
    NuevoJuego();
    CargarJuego();
    Invalidate();
    }
    }

    private void pictureBox21_Click(object sender, EventArgs e)
    {
    if (jugadorRojo == true & this.pictureBox21.Image == fichaRojas)
    {
    this.pictureBox21.BackgroundImage = seleccionado;
    picSelecto = 21;
    jugadorRojo = true;
    }
    else
    if (jugadorVerde == true & this.pictureBox21.Image == fichaVerdes)
    {
    this.pictureBox21.BackgroundImage = seleccionado;
    picSelecto = 21;
    jugadorVerde = true;
    }
    else
    if (jugadorRojo == true & this.pictureBox21.Image == null & picSelecto == 25)
    {
    this.pictureBox21.Image = fichaRojas;
    this.pictureBox25.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox25.Image = null;
    }
    else
    if (jugadorVerde == true & this.pictureBox21.Image == null & picSelecto == 17)
    {
    this.pictureBox21.Image = fichaVerdes;
    this.pictureBox17.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox17.Image = null;
    }
    //comer una roja
    else
    if (jugadorVerde == true & this.pictureBox21.Image == null & picSelecto == 14 & this.pictureBox17.Image == fichaRojas)
    {
    this.pictureBox21.Image = fichaVerdes;
    this.pictureBox14.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox14.Image = null;
    //comer roja
    this.pictureBox17.Image = null;
    contadorfichasRojas += 1;
    lblComidasRojas.Text = Convert.ToString(contadorfichasRojas);
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }

    }

    private void pictureBox17_Click(object sender, EventArgs e)
    {
    if (jugadorRojo == true & this.pictureBox17.Image == null & picSelecto == 21)
    {
    this.pictureBox17.Image = fichaRojas;
    this.pictureBox21.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox21.Image = null;
    //cambio de turno :)
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (jugadorRojo == true & this.pictureBox17.Image == null & picSelecto == 22)
    {
    this.pictureBox17.Image = fichaRojas;
    this.pictureBox22.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox22.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (jugadorVerde == true & this.pictureBox17.Image == null & picSelecto == 13)
    {
    this.pictureBox17.Image = fichaVerdes;
    this.pictureBox3.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox3.Image = null;
    jugadorRojo = true;
    jugadorVerde = false;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (jugadorVerde == true & this.pictureBox17.Image == null & picSelecto == 14)
    {
    this.pictureBox17.Image = fichaVerdes;
    this.pictureBox14.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox14.Image = null;
    jugadorRojo = true;
    jugadorVerde = false;
    this.picboxTurno.Image = fichaRojas;
    }

    }

    private void pictureBox22_Click(object sender, EventArgs e)
    {
    if (jugadorRojo == true & this.pictureBox22.Image == fichaRojas)
    {
    this.pictureBox22.BackgroundImage = seleccionado;
    picSelecto = 22;
    }
    else
    if (jugadorVerde == true & this.pictureBox22.Image == fichaVerdes)
    {
    this.pictureBox22.BackgroundImage = seleccionado;
    picSelecto = 22;
    }
    // si esta vacio para el turno rojo
    else
    if (jugadorRojo == true & this.pictureBox22.Image == null & picSelecto == 25)
    {
    this.pictureBox22.Image = fichaRojas;
    this.pictureBox25.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox25.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (jugadorRojo == true & this.pictureBox22.Image == null & picSelecto == 26)
    {
    this.pictureBox22.Image = fichaRojas;
    this.pictureBox26.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox26.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    // si vacio para turno verde
    else
    if (jugadorVerde == true & this.pictureBox22.Image == null & picSelecto == 17)
    {
    this.pictureBox22.Image = fichaVerdes;
    this.pictureBox17.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox17.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }

    }

    private void pictureBox18_Click(object sender, EventArgs e)
    {
    if (jugadorRojo == true & this.pictureBox18.Image == null & picSelecto == 22)
    {
    this.pictureBox18.Image = fichaRojas;
    this.pictureBox22.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox22.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (jugadorRojo = true & this.pictureBox18.Image == fichaRojas)
    {
    this.pictureBox18.BackgroundImage = seleccionado;
    picSelecto = 18;
    }
    else
    if (jugadorVerde == true & this.pictureBox18.Image == fichaVerdes)
    {
    this.pictureBox18.Image = fichaVerdes;
    picSelecto = 18;
    }
    else
    if (jugadorRojo == true & this.pictureBox18.Image == null & picSelecto == 23)
    {
    this.pictureBox18.Image = fichaRojas;
    this.pictureBox23.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox23.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    }

    private void pictureBox9_Click(object sender, EventArgs e)
    {
    if (this.pictureBox9.Image == fichaVerdes & jugadorVerde == true)
    {
    this.pictureBox9.BackgroundImage = seleccionado;
    picSelecto = 9;
    }
    else
    if (jugadorRojo == true & this.pictureBox9.Image == fichaRojas)
    {
    this.pictureBox9.BackgroundImage = seleccionado;
    picSelecto = 9;
    }
    else
    if (jugadorVerde == true & this.pictureBox9.Image == null & picSelecto == 5)
    {
    this.pictureBox9.Image = fichaVerdes;
    this.pictureBox5.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox5.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (jugadorVerde == true & this.pictureBox9.Image == null & picSelecto == 6)
    {
    this.pictureBox9.Image = fichaVerdes;
    this.pictureBox6.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox6.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (jugadorRojo == true & this.pictureBox9.Image == null & picSelecto == 3)
    {
    this.pictureBox9.Image = fichaRojas;
    this.pictureBox3.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox3.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (jugadorRojo == true & this.pictureBox9.Image == null & picSelecto == 14)
    {
    this.pictureBox9.Image = fichaRojas;
    this.pictureBox14.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox14.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //comer en 6 y 14 ROJO
    else
    if (this.pictureBox9.Image == null & jugadorVerde == true & picSelecto == 2 & this.pictureBox6.Image == fichaRojas)
    {
    this.pictureBox6.Image = null;
    this.pictureBox2.Image = null;
    this.pictureBox2.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox9.Image = fichaVerdes;
    contadorfichasRojas += 1;
    lblComidasRojas.Text = Convert.ToString(contadorfichasRojas);
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (this.pictureBox9.Image == null & jugadorVerde == true & EsReinaVerde == true & this.pictureBox14.Image == fichaRojas & picSelecto == 18)
    {
    this.pictureBox9.Image = fichaReinaVerde;
    this.pictureBox14.Image = null;
    this.pictureBox18.Image = null;
    this.pictureBox18.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    contadorfichasRojas += 1;
    lblComidasRojas.Text = Convert.ToString(contadorfichasRojas);
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (this.pictureBox9.Image == null & jugadorRojo == true & picSelecto == 18 & this.pictureBox14.Image == fichaVerdes)
    {
    this.pictureBox9.Image = fichaRojas;
    this.pictureBox18.Image = null;
    this.pictureBox18.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox14.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    jugadorVerde = true;
    jugadorRojo = false;
    this.picboxTurno.Image = fichaVerdes;
    }

    }

    private void pictureBox13_Click(object sender, EventArgs e)
    {

    }

    private void pictureBox10_Click(object sender, EventArgs e)
    {
    if (this.pictureBox10.Image != null & jugadorRojo == true || jugadorVerde == true)
    {
    this.pictureBox10.BackgroundImage = seleccionado;
    picSelecto = 10;
    }
    //establecer ficha verde
    else
    if (this.pictureBox10.Image == null & jugadorVerde == true & picSelecto == 1 || picSelecto == 3)
    {
    this.pictureBox10.Image = fichaVerdes;
    if (picSelecto == 1)
    {

    }
    }
    }

    private void pictureBox14_Click(object sender, EventArgs e)
    {
    if (jugadorVerde == true & this.pictureBox14.Image == null & picSelecto == 9)
    {
    this.pictureBox14.Image = fichaVerdes;
    this.pictureBox9.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox9.Image = null;
    jugadorRojo = true;
    jugadorVerde = false;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (jugadorVerde == true & this.pictureBox14.Image == fichaVerdes)
    {
    this.pictureBox14.BackgroundImage = seleccionado;
    picSelecto = 14;
    }

    }

    private void pictureBox23_Click(object sender, EventArgs e)
    {
    if (jugadorVerde == true & this.pictureBox23.Image == fichaVerdes)
    {
    this.pictureBox23.BackgroundImage = seleccionado;
    picSelecto = 23;
    }
    else
    if (jugadorRojo == true & this.pictureBox23.Image == fichaRojas)
    {
    this.pictureBox23.BackgroundImage = seleccionado;
    picSelecto = 23;
    }
    else
    if (jugadorVerde = true & this.pictureBox23.Image == null & picSelecto == 18)
    {
    this.pictureBox23.Image = fichaVerdes;
    this.pictureBox18.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox18.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (jugadorVerde = true & this.pictureBox23.Image == null & picSelecto == 19)
    {
    this.pictureBox23.Image = fichaVerdes;
    this.pictureBox19.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox19.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (jugadorRojo == true & this.pictureBox23.Image == null & picSelecto == 26)
    {
    this.pictureBox23.Image = fichaRojas;
    this.pictureBox26.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox26.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (jugadorRojo == true & this.pictureBox23.Image == null & picSelecto == 27)
    {
    this.pictureBox23.Image = fichaRojas;
    this.pictureBox27.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox27.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //comer verde o rojo de las casillas 18,19,26,27 [23]
    else
    if (jugadorVerde == true & this.pictureBox23.Image == null & picSelecto == 14 & this.pictureBox18.Image == fichaRojas)
    {
    this.pictureBox23.Image = fichaVerdes;
    this.pictureBox14.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox14.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    //comer la ficha que esta en la 18
    this.pictureBox18.Image = null;
    contadorfichasRojas += 1;
    lblComidasRojas.Text = Convert.ToString(contadorfichasRojas);
    }
    else
    if (jugadorVerde == true & this.pictureBox23.Image == null & picSelecto == 16 & this.pictureBox19.Image == fichaRojas)
    {
    this.pictureBox23.Image = fichaVerdes;
    this.pictureBox16.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox16.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    //comer la ficha que esta en la 19
    this.pictureBox19.Image = null;
    contadorfichasRojas += 1;
    lblComidasRojas.Text = Convert.ToString(contadorfichasRojas);
    }
    else
    if (jugadorRojo == true & this.pictureBox23.Image == null & picSelecto == 30 & this.pictureBox26.Image == fichaVerdes)
    {
    this.pictureBox23.Image = fichaRojas;
    this.pictureBox30.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox30.Image = null;
    jugadorVerde = true;
    jugadorRojo = false;
    this.picboxTurno.Image = fichaVerdes;
    //comer la ficha que esta en la 26
    this.pictureBox26.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }
    else
    if (jugadorRojo == true & this.pictureBox23.Image == null & picSelecto == 32 & this.pictureBox27.Image == fichaVerdes)
    {
    this.pictureBox23.Image = fichaRojas;
    this.pictureBox32.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox32.Image = null;
    jugadorVerde = true;
    jugadorRojo = false;
    this.picboxTurno.Image = fichaVerdes;
    //comer la ficha que esta en la 27
    this.pictureBox27.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }

    }

    private void pictureBox19_Click(object sender, EventArgs e)
    {
    if (jugadorRojo == true & this.pictureBox19.Image == null & picSelecto == 23)
    {
    this.pictureBox19.Image = fichaRojas;
    this.pictureBox23.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox23.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (jugadorRojo == true & this.pictureBox19.Image == null & picSelecto == 24)
    {
    this.pictureBox19.Image = fichaRojas;
    this.pictureBox24.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox24.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (jugadorRojo == true & this.pictureBox19.Image == fichaRojas)
    {
    this.pictureBox19.BackgroundImage = seleccionado;
    picSelecto = 19;
    }
    else
    if (jugadorRojo == true & this.pictureBox19.Image == fichaVerdes)
    {
    this.pictureBox19.BackgroundImage = seleccionado;
    picSelecto = 19;
    }
    else
    if (jugadorVerde == true & this.pictureBox19.Image == null & picSelecto == 15)
    {
    this.pictureBox19.Image = fichaVerdes;
    this.pictureBox15.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox15.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    else
    if (jugadorVerde == true & this.pictureBox19.Image == null & picSelecto == 16)
    {
    this.pictureBox19.Image = fichaVerdes;
    this.pictureBox16.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox16.Image = null;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    //comer de 15,16,23,24 [19] 1º turno del rojo
    else
    if (jugadorRojo == true & this.pictureBox19.Image == null & picSelecto == 26 & this.pictureBox23.Image == fichaVerdes)
    {
    this.pictureBox19.Image = fichaVerdes;
    this.pictureBox26.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox26.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    //comer verde de la 23
    this.pictureBox23.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }
    }

    private void pictureBox1_Click(object sender, EventArgs e)
    {
    if (this.pictureBox1.Image == fichaVerdes & jugadorVerde == true)
    {
    this.pictureBox1.BackgroundImage = seleccionado;
    picSelecto = 1;
    }
    else
    if (this.pictureBox1.Image == fichaReinaRoja & jugadorRojo == true & EsReinaRoja == true)
    {
    this.pictureBox1.BackgroundImage = seleccionado;
    picSelecto = 1;
    }
    else
    if (this.pictureBox1.Image == null & jugadorRojo == true & picSelecto == 5)
    {
    this.pictureBox1.Image = fichaReinaRoja;
    this.pictureBox5.Image = null;
    this.pictureBox5.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (this.pictureBox1.Image == null & jugadorRojo == true & picSelecto == 6)
    {
    this.pictureBox1.Image = fichaReinaRoja;
    this.pictureBox6.Image = null;
    this.pictureBox6.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //comer del 5 o 6 [1
    else //come la del 6
    if (this.pictureBox1.Image == null & this.pictureBox6.Image != null & picSelecto == 10 & jugadorRojo == true)
    {
    this.pictureBox1.Image = fichaReinaRoja;
    this.pictureBox10.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox10.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    //comer
    this.pictureBox6.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }
    }

    private void pictureBox2_Click(object sender, EventArgs e)
    {
    if (this.pictureBox1.Image == fichaVerdes & jugadorVerde == true)
    {
    this.pictureBox1.BackgroundImage = seleccionado;
    picSelecto = 1;
    }
    else
    if (this.pictureBox1.Image == fichaReinaRoja & jugadorRojo == true & EsReinaRoja == true)
    {
    this.pictureBox1.BackgroundImage = seleccionado;
    picSelecto = 1;
    }
    else
    if (this.pictureBox1.Image == null & jugadorRojo == true & picSelecto == 6)
    {
    this.pictureBox1.Image = fichaReinaRoja;
    EsReinaRoja = true;
    this.pictureBox6.Image = null;
    this.pictureBox6.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (this.pictureBox1.Image == null & jugadorRojo == true & picSelecto == 7)
    {
    this.pictureBox1.Image = fichaReinaRoja;
    EsReinaRoja = true;
    this.pictureBox7.Image = null;
    this.pictureBox7.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //comer 6
    else
    if (this.pictureBox2.Image == null & jugadorRojo == true & picSelecto == 9 & this.pictureBox6.Image == fichaVerdes)
    {
    this.pictureBox9.Image = null;
    this.pictureBox9.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox6.Image = null;
    contadorfichasVerdes += 1;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }
    //comer del 7
    else
    if (this.pictureBox2.Image == null & jugadorRojo == true & picSelecto == 11 & this.pictureBox7.Image == fichaVerdes)
    {
    this.pictureBox11.Image = null;
    this.pictureBox11.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox7.Image = null;
    contadorfichasVerdes += 1;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }

    }

    private void pictureBox3_Click(object sender, EventArgs e)
    {
    if (this.pictureBox3.Image != null & jugadorVerde == true)
    {
    this.pictureBox3.BackgroundImage = seleccionado;
    picSelecto = 3;
    }
    else
    if (this.pictureBox3.BackgroundImage == seleccionado)
    {
    this.pictureBox3.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    picSelecto = 0;
    }
    else
    if (this.pictureBox3.Image == null & jugadorRojo == true & picSelecto == 7)//coronar al rojo
    {
    this.pictureBox3.Image = fichaReinaRoja;
    EsReinaRoja = true;
    this.pictureBox7.Image = null;
    this.pictureBox7.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (this.pictureBox3.Image == null & jugadorRojo == true & picSelecto == 8)
    {
    this.pictureBox3.Image = fichaReinaRoja;
    this.pictureBox8.Image = null;
    this.pictureBox8.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //comer
    else//7
    if (this.pictureBox3.Image == null & jugadorRojo == true & picSelecto == 10 & this.pictureBox7.Image == fichaVerdes)
    {
    this.pictureBox10.Image = null;
    this.pictureBox10.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox7.Image = null;
    this.pictureBox3.Image = fichaReinaRoja;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }
    else//8
    if (this.pictureBox3.Image == null & jugadorRojo == true & picSelecto == 12 & this.pictureBox8.Image == fichaVerdes)
    {
    this.pictureBox3.Image = fichaReinaRoja;
    this.pictureBox12.Image = null;
    this.pictureBox12.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox8.Image = null;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }
    }

    private void pictureBox4_Click(object sender, EventArgs e)
    {
    if (this.pictureBox4.Image != null & jugadorVerde == true)
    {
    this.pictureBox4.BackgroundImage = seleccionado;
    picSelecto = 4;
    }
    else
    if (this.pictureBox4.BackgroundImage == seleccionado & jugadorVerde == true)
    {
    this.pictureBox4.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    picSelecto = 0;
    }
    else
    if (this.pictureBox4.Image == null & jugadorRojo == true & picSelecto == 8)
    {
    this.pictureBox4.Image = fichaReinaRoja;
    this.pictureBox8.Image = null;
    this.pictureBox8.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //
    else
    if (this.pictureBox4.Image == null & jugadorRojo == true & picSelecto == 11 & this.pictureBox8.Image == fichaVerdes)
    {
    this.pictureBox8.Image = null;
    this.pictureBox11.Image = null;
    this.pictureBox11.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox4.Image = fichaReinaRoja;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }
    }

    private void pictureBox5_Click(object sender, EventArgs e)
    {
    if (this.pictureBox5.Image != null & jugadorVerde == true || jugadorRojo == true)
    {
    this.pictureBox5.BackgroundImage = seleccionado;
    picSelecto = 5;
    }
    else
    if (this.pictureBox5.Image == null & jugadorRojo == true & picSelecto == 9)
    {
    this.pictureBox5.Image = fichaRojas;
    this.pictureBox9.Image = null;
    this.pictureBox9.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (this.pictureBox5.Image == null & jugadorVerde == true & picSelecto == 1)
    {
    this.pictureBox5.Image = fichaVerdes;
    this.pictureBox1.Image = null;
    this.pictureBox1.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorVerde = false;
    jugadorRojo = true;
    picboxTurno.Image = fichaRojas;
    }
    else//9
    if (this.pictureBox5.Image == null & jugadorRojo == true & picSelecto == 14 & this.pictureBox9.Image == fichaVerdes)
    {
    this.pictureBox9.Image = null;
    this.pictureBox14.Image = null;
    this.pictureBox14.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox5.Image = fichaRojas;
    jugadorRojo = false;
    jugadorVerde = true;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    }
    else
    if (this.pictureBox5.Image == null & jugadorVerde == true & picSelecto == 9 & EsReinaVerde == true)
    {
    this.pictureBox9.Image = null;
    this.pictureBox9.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    }

    private void pictureBox6_Click(object sender, EventArgs e)
    {
    if (this.pictureBox6.Image != null & jugadorRojo == true || jugadorVerde == true)
    {
    this.pictureBox6.BackgroundImage = seleccionado;
    picSelecto = 6;
    }
    else
    if (this.pictureBox6.Image == null & jugadorVerde == true & picSelecto == 1 || picSelecto == 2)
    {
    this.pictureBox6.Image = fichaVerdes;
    if (picSelecto == 1)
    {
    this.pictureBox1.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox1.Image = null;
    }
    else
    if (picSelecto == 2)
    {
    this.pictureBox2.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox2.Image = null;
    }
    jugadorVerde=false;
    jugadorRojo=true;
    this.picboxTurno.Image=fichaRojas;
    }
    // turno rojo
    else
    if (this.pictureBox6.Image == null & jugadorRojo == true & picSelecto == 9 || picSelecto == 10)
    {
    this.pictureBox6.Image = fichaRojas;
    if (picSelecto == 9)
    {
    this.pictureBox9.Image = null;
    this.pictureBox9.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }
    else
    if (picSelecto == 10)
    {
    this.pictureBox10.Image = null;
    this.pictureBox10.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //comer 9-10
    else
    if (this.pictureBox6.Image == null & jugadorRojo == true & picSelecto == 3 || picSelecto == 15 & this.pictureBox9.Image==fichaVerdes || this.pictureBox10.Image==fichaVerdes)
    {
    this.pictureBox6.Image = fichaRojas;
    if (picSelecto == 3 & this.pictureBox9.Image == fichaVerdes)
    {
    this.pictureBox3.Image = null;
    this.pictureBox3.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox9.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (picSelecto == 15 & this.pictureBox10.Image == fichaVerdes)
    {
    this.pictureBox15.Image = null;
    this.pictureBox15.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox10.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    }

    }

    private void pictureBox7_Click(object sender, EventArgs e)
    {
    if (this.pictureBox7.Image != null & jugadorRojo == true || jugadorVerde == true)
    {
    this.pictureBox7.BackgroundImage = seleccionado;
    picSelecto = 7;
    }
    else
    if (this.pictureBox7.Image == null & jugadorVerde == true & picSelecto == 2 || picSelecto == 3)
    {
    this.pictureBox7.Image = fichaVerdes;
    if (picSelecto == 2)
    {
    this.pictureBox2.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox2.Image = null;
    }
    else
    if (picSelecto == 3)
    {
    this.pictureBox3.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox3.Image = null;
    }
    jugadorVerde = false;
    jugadorRojo = true;
    this.picboxTurno.Image = fichaRojas;
    }
    // turno rojo
    else
    if (this.pictureBox7.Image == null & jugadorRojo == true & picSelecto == 10 || picSelecto == 11)
    {
    this.pictureBox7.Image = fichaRojas;
    if (picSelecto == 10)
    {
    this.pictureBox10.Image = null;
    this.pictureBox10.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }
    else
    if (picSelecto == 11)
    {
    this.pictureBox11.Image = null;
    this.pictureBox11.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //comer 9-10
    else
    if (this.pictureBox7.Image == null & jugadorRojo == true & picSelecto == 14 || picSelecto == 16 & this.pictureBox10.Image == fichaVerdes || this.pictureBox11.Image == fichaVerdes)
    {
    this.pictureBox7.Image = fichaRojas;
    if (picSelecto == 14 & this.pictureBox10.Image == fichaVerdes)
    {
    this.pictureBox14.Image = null;
    this.pictureBox14.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox10.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    else
    if (picSelecto == 16 & this.pictureBox11.Image == fichaVerdes)
    {
    this.pictureBox16.Image = null;
    this.pictureBox16.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox11.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    }
    }

    private void pictureBox8_Click(object sender, EventArgs e)
    {
    if (this.pictureBox8 != null & jugadorRojo == true || jugadorVerde == true)
    {
    this.pictureBox8.BackgroundImage = seleccionado;
    picSelecto = 8;
    }
    else
    if (this.pictureBox8.Image == null & jugadorRojo == true & picSelecto == 12 || picSelecto == 11)
    {
    this.pictureBox8.Image = fichaRojas;
    if (picSelecto == 12)
    {
    this.pictureBox12.Image = null;
    this.pictureBox12.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }
    else
    if (picSelecto == 11)
    {
    this.pictureBox11.Image = null;
    this.pictureBox11.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //turno verde
    else
    if (this.pictureBox8.Image == null & jugadorVerde == true & picSelecto == 3 || picSelecto == 4)
    {
    this.pictureBox8.Image = fichaVerdes;
    if (picSelecto == 3)
    {
    this.pictureBox3.Image = null;
    this.pictureBox3.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }
    else
    if (picSelecto == 4)
    {
    this.pictureBox4.Image = null;
    this.pictureBox4.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    }
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }
    //comer 11
    else
    if (this.pictureBox8.Image == null & jugadorRojo == true & picSelecto == 15 & this.pictureBox11.Image == fichaVerdes)
    {
    this.pictureBox8.Image = fichaRojas;
    this.pictureBox15.Image = null;
    this.pictureBox15.BackgroundImage = DamasGame.Properties.Resources.fondonaranja2;
    this.pictureBox11.Image = null;
    contadorfichasVerdes += 1;
    lblComidasVerdes.Text = Convert.ToString(contadorfichasVerdes);
    jugadorRojo = false;
    jugadorVerde = true;
    this.picboxTurno.Image = fichaVerdes;
    }

    }
    }
    }

  • Gab Hern Says:
    July 24th, 2011 at 9:56 am  

    Hola Juank Muy buen articulo tienes toda la razón en cuanto a la utilización de círculos aunque en el caso de los rectángulos hay una forma de detectar la colisión mucho mas sencilla y muy precisa como la de los círculos que es simplemente usando el método intersect el cual lo que hace es detectar la colisión por medio de la suma de rectángulos pero para hacer esto uno debe estar totalmente sobre el otro. Para este método se utilizan 3 rectángulos, los de las 2 texturas que chocan, y el de resultado( quien será nuestro resultado de la colisión ) la implementación seria algo Asi:

    Rectangle.Intersect(ref rectangulo1, ref rectangulo2, out result);
    If(result !=Rectangle.Empty)
    {
    //acción deseada al choque
    }

    En esta parte lo que hace es calcular el choque y en caso de que la suma de los rectángulos se haya dado entonces que haga algo.

    Agradezco a Juan por sus aportes en español a el mundo de los juegos y XNA. Si quieren un poco mas de info de este método pueden visitar: http://tinturo.com/3pjjzod

  • Gab Hern Says:
    July 24th, 2011 at 9:58 am  

    Hola Juank Muy buen articulo tienes toda la razón en cuanto a la utilización de círculos aunque en el caso de los rectángulos hay una forma de detectar la colisión mucho mas sencilla y muy precisa como la de los círculos que es simplemente usando el método intersect el cual lo que hace es detectar la colisión por medio de la suma de rectángulos pero para hacer esto uno debe estar totalmente sobre el otro. Para este método se utilizan 3 rectángulos, los de las 2 texturas que chocan, y el de resultado( quien será nuestro resultado de la colisión ) la implementación seria algo Asi:
    Rectangle.Intersect(ref rectangulo1, ref rectangulo2, out result);
    If(result !=Rectangle.Empty)
    {
    //acción deseada al choque
    }
    En esta parte lo que hace es calcular el choque y en caso de que la suma de los rectángulos se haya dado entonces que haga algo.
    Agradezco a Juan por sus aportes en español a el mundo de los juegos y XNA. Si quieren un poco mas de info de este método pueden visitar: http://tinyurl.com/3pjjzod

  • JuanK Says:
    July 24th, 2011 at 4:50 pm  

    Hola, así es lo que pasa es que este artículo lo escribi cuando recién salio la primera versión de XNA (o un beta ni recuerdo) y en esa época no existia esa funcionalidad en la clase Rectangle

  • JuanK Says:
    July 24th, 2011 at 4:51 pm  

    Hola, así es lo que pasa es que este artículo lo escribi cuando recién salio la primera versión de XNA (o un beta ni recuerdo) y en esa época no existia esa funcionalidad en la clase Rectangle.

  • carlos Says:
    February 5th, 2012 at 4:36 pm  

    Hola.. agradezco de antemano por compartir su conocimiento para el beneficio de todos…. yo apenas estoy iniciando en c#. Por favor me puede guiar con el siguiente tema…

    como hago para atrapar el resultado si es true o false ??? ( return true o return false)

    public static bool RectangleIntersection( Rectangle a, Rectangle b, out Rectangle c)

    yo necesito saber como se hace ….

    si el resultado es true.. entonces yo necesito ejecutar una accion… pero este resultado lo necesito atrapar fuera de la funcion public static bool RectangleIntersection( Rectangle a, Rectangle b, out Rectangle c)

    Gracias por su atencion

  • JuanK Says:
    February 7th, 2012 at 10:55 am  

    Es una pregunta bastante básica,

    bool hayInterseccion = RectangleIntersection( a, b, out c);

  • koday Says:
    March 18th, 2012 at 9:18 am  

    para la deteccion de la colision circular. Si tengo en cuenta solo un eje, como en la imagen suponiendo que ambos estan en la misma altura, saber si colisionan es tan facil como sumar los dos radios y compararlo con la diferencia de x de ambos circulos.

    Si R1+R2 mayor que el valor absoluto de x1 – x2 entonces colisiona

    Supongo que para el eje y tambien pasaría igual
    si r1+r2 mayor que el valor absoluto de y1-y2 entonces colisiona

    por tanto si se une los dos, obtendria para detectar la colision entre dos circulos.

    Si R1+R2 mayor que el valor absoluto de (x1+y1) – (x2+y2) entonces colisiona

  • JuanK Says:
    March 18th, 2012 at 12:35 pm  

    Si, eso es exactamente lo que hace

  • Kevin Says:
    August 2nd, 2012 at 12:08 pm  

    Muchísimas gracias!!
    Esto me ha servido para mi código de Elementos Finitos Extendidos ;)

  • Nicolas Says:
    October 18th, 2012 at 1:55 pm  

    Hola, en el segundo codigo de deteccion de colisiones de rectangulos, me salta un error enla letra “c”.. me aparece “Uso del parametro outsin asignar ‘c’”… me dicen bien que es??

  • JuanK Says:
    October 22nd, 2012 at 9:26 am  

    Hola nico, ya he corregido el articulo en mi blog, no se en que momento se daño, porque estaba bien.

    De paso, hasta donde recuero las versiones actuales de XNA ya tiene soporte para hacer todo eso de manera incorporada.

    saludos

  • Bernabé Says:
    January 31st, 2013 at 2:01 pm  

    Hola,

    Y si los rectagulos cambiasen de angulo, en funcion del evento del raton por ejemplo un juego de estrategia espacial…como detectaria entonces la colision entre esos rectangulos?

    Gracias.

    saludos.

  • JuanK Says:
    February 26th, 2013 at 2:09 pm  

    No te sirve el mismo cálculo, debes cmabiar el algoritmo para determinar si un punto esta dentro del área del poligono. Es má complejo pero no es imposible. Debes repasar cálculo de 9 y 10 grado si un día tengo tiempo haré un post al respecto.

Deja un comentario

Redes Sociales

Follow @JuanKRuiz
Answer Questions

Busca en el blog

Artículos Relacionados

  • El XNA Content Pipeline
  • C# – XNA- Como Convertir Una Imagen a Escala de Grises
  • C# – XNA – Shaders – Como Convertir Una Imagen a Escala de Grises
  • Artículos Relacionados

  • El XNA Content Pipeline
  • C# – XNA- Como Convertir Una Imagen a Escala de Grises
  • C# – XNA – Shaders – Como Convertir Una Imagen a Escala de Grises
  • Nube de Temas

    API - Azure - C# - codigo - Forms - IE - IE9 - Image - imagenes - IT - Microsoft - MVP - Pinned - PowerShell - Proceso - rendimiento - RSS - sistema - Sistemas Operativos - Site - Visual - WCF - Windows - Windows 8 - Windows Store - WinRT - WndProc - WPF - XAML - XNA

    Blogs recomendados

  • VBCodigoPocketPC Espacio para tratar temas de programacion para dispositivos moviles, Pocket PC, Compact Framework, Embbeded Visual Basic, Visual Basic.NET , C# (C Sharp)
  • Róbinson Moscoso Estaré publicando acá cosas sobre tecnologia .NET, situacioines cotidianas de las que voy aprendiendo… sirve como extensión de memoria.
  • .Net C# Blog de Nelsón Venegas
  • Warnov Microsoft Developer Evangelist
  • IT LIfe Blog de mi Hermano que esta en el lado claro: IT
  • Sorey Garcia Una chica del común con la firme intención de no serlo
  • Black Byte videojuegos, modelado y animación 3d
  • Road to IT World Cosas interesantes de IT
  • Marcela Chitiva Un poco de esto… un poco de aquello
  • Surviving the Nigth El mejor blog para aquellos que nos gustan los “internals”
  • Meta

    1. Log in
    2. WordPress

    Ideas de un Conejo is powered by Wordpress. Theme designed by Juan Carlos Ruiz.