when you see if { ... } else { ... } you see code, i see my fucking life ...
No te has registrado
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:
public Color[] DatosTextura;
Sprite.cs
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
DatosTextura = new Color[Textura.Width*Textura.Height];
personajeTextura.GetData(DatosTextura);Sprite.cs
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.
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.
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:
Desconectado