Estoy tratando de seguir este tutorial http://www.tonypa.pri.ee/tbw/tut05.html para implementar colisiones en tiempo real en un mundo basado en mosaicos.
Encuentro las coordenadas centrales de mis entidades gracias a estas propiedades:
public float CenterX
{
get { return X + Width / 2f; }
set { X = value - Width / 2f; }
}
public float CenterY
{
get { return Y + Height / 2f; }
set { Y = value - Height / 2f; }
}
Luego, en mi método de actualización, en la clase de jugador, que se llama cada cuadro, tengo este código:
public override void Update()
{
base.Update();
int downY = (int)Math.Floor((CenterY + Height / 2f - 1) / 16f);
int upY = (int)Math.Floor((CenterY - Height / 2f) / 16f);
int leftX = (int)Math.Floor((CenterX + Speed * NextX - Width / 2f) / 16f);
int rightX = (int)Math.Floor((CenterX + Speed * NextX + Width / 2f - 1) / 16f);
bool upleft = Game.CurrentMap[leftX, upY] != 1;
bool downleft = Game.CurrentMap[leftX, downY] != 1;
bool upright = Game.CurrentMap[rightX, upY] != 1;
bool downright = Game.CurrentMap[rightX, downY] != 1;
if(NextX == 1)
{
if (upright && downright)
CenterX += Speed;
else
CenterX = (Game.GetCellX(CenterX) + 1)*16 - Width / 2f;
}
}
downY, upY, leftX y rightX deben encontrar respectivamente la posición Y más baja, la posición Y más alta, la posición X más a la izquierda y la posición X más a la derecha. Agrego + Speed * NextX porque en el tutorial la función getMyCorners se llama con estos parámetros:
getMyCorners (ob.x+ob.speed*dirx, ob.y, ob);
Los métodos GetCellX y GetCellY:
public int GetCellX(float mX)
{
return (int)Math.Floor(mX / SGame.Camera.TileSize);
}
public int GetCellY(float mY)
{
return (int)Math.Floor(mY / SGame.Camera.TileSize);
}
El problema es que el jugador "parpadea" mientras golpea una pared, y la detección de esquinas ni siquiera funciona correctamente, ya que puede superponer paredes que solo golpean una de las esquinas. No entiendo lo que está mal. En el tutorial, los campos ob.x y ob.y deben ser iguales a mis propiedades CenterX y CenterY, y ob.width y ob.height deben ser iguales a Width / 2f y Height / 2f. Sin embargo, todavía no funciona.
Gracias por tu ayuda.