Ex - Comunidad de Programadores, Nuevo Leon

when you see if { ... } else { ... } you see code, i see my fucking life ...

No te has registrado

  • Inicio
  •  » XNA
  •  » Tutorial 6. Per-pixel colision

#1 2008-05-18 10:07:10

hassamu
Administrador
Ubicaci髇: San Nicolas de los Garza
Registrado: 2006-07-15
Mensajes: 154
Web

Tutorial 6. Per-pixel colision

Glosario:

Per-pixel Colision: Es un tipo de colisi贸n que se basa en la informaci贸n que obtiene de los canales alpha de las imagenes. Cuando dos pixeles no-alfa se sobreponen, ahi existe una colisi贸n. Este tipo de detecci贸n de colision es la ideal cuando se tienen pocos sprites y adem谩s peque帽os.
Color[]: Es una estructura que representa un color utilizando la informaci贸n de los canales RGB y Alpha.
Texture2D.GetData: Copia la informaci贸n de los pixeles de una textura, en un arreglo.
Math.Max: Funci贸n que regresa el n煤mero mayor entre dos enteros de 32 bits con signo.
Math.Min: Funcion que regresa el n煤mero menor entre dos enteros con signo de 32 bits.
Rectangle.Top: Regresa la coordenada Y de la parte mas alta del rectangulo.
Rectangle.Bottom: Regresa la coordenada Y de la parte mas baja del rectangulo.
Rectangle.Left: Regresa la coordenada X de la parte mas a la izquierda del rectangulo.
Rectangle.Right: Regresa la coordenada X de la parte mas a la derecha del rectangulo.
Color.A: Regresa el valor de la componente del canal Alpha.

En este tutorial, vamos a modificar el archivo de proyecto del tutorial 5. Aqui viene una aclaraci贸n, vamos a modificar ambas clases, personajes.cs y sprite.cs y vamos a escribir un nuevo m茅todo en Game1.cs

Ademas de que cambie el spritesheet para Larry, lo hice mas peque帽o para que pudiera ser almacenado en un arreglo de tipo Color. Como mencion茅 en el glosario, este tipo de deteccion de colisiones es ideal para un juego con sprites peque帽os y no numerosos.

Primero debemos declarar un arreglo tipo Color[] en ambas clases.
Personaje.cs:

C骴igo:

public Color[] DatosTextura;

Sprite.cs

C骴igo:

public Color[] DatosTextura;

Ahora vamos a llenar nuestros arreglos con la informaci贸n de los pixeles de nuestras texturas, necesitmaos modificar el m茅todo cargar de cada una de las clases:
Personaje.cs

C骴igo:

            DatosTextura = new Color[Textura.Width*Textura.Height];
            personajeTextura.GetData(DatosTextura);

Sprite.cs

C骴igo:

            DatosTextura = new Color[Textura.Width * Textura.Height];
            Textura.GetData(DatosTextura);

Ahora ya tenemos toda la informaci贸n necesaria para implementar Per-pixel collision. Lo que hicimos fue asignar un espacio al arreglo DatosTextura y una vez que el espacio fue asignado, empezamos a rellenar el array con el m茅todo .GetData de la clase Texture2D

Ahora vamos a la clase principal Game1.cs y vamos a crear un nuevo m茅todo llamado IntersectanPixeles() lo que har谩 este m茅todo ser谩 comparar la informaci贸n de los pixeles de ambos arrays. Si dos pixeles no-alfa se sobreponen significa que ahi existe una colisi贸n. El color magenta como hab铆a mencionado anteriormente, es el color que produce un cero-alpha (transparente).

Nuestro m茅todo aceptara dos rectangulos de limites para los sprites y su array de informaci贸n de pixeles. El rectangulo que aceptara como parametro es el mismo que usamos para darle la animaci贸n.

C骴igo:

        bool IntersectanPixeles(Rectangle rectanguloA, Color[] datosA, Rectangle rectanguloB, Color[] datosB)
        {
            int techo = Math.Max(rectanguloA.Top, rectanguloB.Top);
            int piso = Math.Min(rectanguloA.Bottom, rectanguloB.Bottom);
            int izquierda = Math.Max(rectanguloA.Left, rectanguloB.Left);
            int derecha = Math.Min(rectanguloA.Right, rectanguloB.Right);


            for (int y=techo; y < piso; y++)
            {
                for (int x=izquierda; x < derecha; x++)
                {
                    Color colorA = datosA[(x - rectanguloA.Left) + (y - rectanguloA.Top) * rectanguloA.Width];
                    Color colorB = datosB[(x - rectanguloB.Left) + (y - rectanguloB.Top) * rectanguloB.Width];

                    if (colorA.A != 0 && colorB.A != 0)
                    {
                        return true;
                    }
                }
//Si nunca entro al ciclo if, entonces no existe colisi贸n.
            return false;
        }

Ahora vamos al m茅todo update y quitamos nuestro algoritmo de colisiones para reemplazarlo por el m茅todo que acabamos de escribir.

C骴igo:

                if (IntersectanPixeles(personajeRectangulo, Larry.DatosTextura, trebolRectangulo, trebol.DatosTextura))
                {
                    PersonajeColision = true;
                }

Ejercicios:
1. Crea nuevas imagenes con diferentes formas y aplicales per-pixel collision
2. Trata de crear un marcador cada vez que larry agarre un trebol.

Proyecto:
Tutorial6.rar
Spritesheets:
Larry.png
Treboles.png
Screenshot:
http://progra.fime.uanl.mx/tutoriales/xna/tutorial6.jpg


Hay 10 tipos de personas en este mundo: los que entienden binario y los que no.

Desconectado

 
  • Inicio
  •  » XNA
  •  » Tutorial 6. Per-pixel colision

Pie del foro

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson