public override bool colisiona(FormaFisica otra) { try { FormaFisicaCirculo otroCirculo = otra as FormaFisicaCirculo; if (otroCirculo != null) { float distanciaCuadrada = (otroCirculo.pos - this.pos).LengthSquared(); float sumaRadios = this.radio + otroCirculo.radio; if (distanciaCuadrada < sumaRadios * sumaRadios) { return(true); } return(false); } FormaFisicaRectangulo otroRectangulo = otra as FormaFisicaRectangulo; if (otroRectangulo != null) { return(otroRectangulo.colisiona(this)); } return(false); } catch { return(false); } }
public abstract bool colisiona(FormaFisica otra);
public override bool colisiona(FormaFisica otra) { try { Vector2[] esquinasPropias = new Vector2[4]; esquinasPropias[0] = pos + new Vector2(-ancho / 2f, -alto / 2f); esquinasPropias[1] = pos + new Vector2(ancho / 2f, -alto / 2f); esquinasPropias[2] = pos + new Vector2(ancho / 2f, alto / 2f); esquinasPropias[3] = pos + new Vector2(-ancho / 2f, alto / 2f); FormaFisicaCirculo otroCirculo = otra as FormaFisicaCirculo; if (otroCirculo != null) { float distanciaCuadrada = (otroCirculo.pos - this.pos).LengthSquared(); //calcular colision entre circulo y rectangulo foreach (Vector2 esquina in esquinasPropias) { if (Vector2.DistanceSquared(esquina, otroCirculo.pos) < otroCirculo.radio * otroCirculo.radio) { return(true); } } Vector2[] extremosCirculo = new Vector2[4]; extremosCirculo[0] = otroCirculo.pos + new Vector2(otroCirculo.radio, 0); extremosCirculo[1] = otroCirculo.pos + new Vector2(-otroCirculo.radio, 0); extremosCirculo[2] = otroCirculo.pos + new Vector2(0, otroCirculo.radio); extremosCirculo[3] = otroCirculo.pos + new Vector2(0, -otroCirculo.radio); foreach (Vector2 maxCirculo in extremosCirculo) { if (puntoEnRect(maxCirculo, esquinasPropias)) { return(true); } } return(false); } FormaFisicaRectangulo otroRectangulo = otra as FormaFisicaRectangulo; if (otroRectangulo != null) { Vector2[] esquinasOtro = new Vector2[4]; esquinasOtro[0] = otroRectangulo.pos + new Vector2(-otroRectangulo.ancho / 2f, -otroRectangulo.alto / 2f); esquinasOtro[1] = otroRectangulo.pos + new Vector2(otroRectangulo.ancho / 2f, -otroRectangulo.alto / 2f); esquinasOtro[2] = otroRectangulo.pos + new Vector2(otroRectangulo.ancho / 2f, otroRectangulo.alto / 2f); esquinasOtro[3] = otroRectangulo.pos + new Vector2(-otroRectangulo.ancho / 2f, otroRectangulo.alto / 2f); //Verifico si alguna de mis esquinas está dentro del otro rectangulo foreach (Vector2 esquina in esquinasPropias) { if (puntoEnRect(esquina, esquinasOtro)) { return(true); } } //verifico si alguna de sus esquinas está dentro de mi rectangulo foreach (Vector2 esquina in esquinasOtro) { if (puntoEnRect(esquina, esquinasPropias)) { return(true); } } Vector2[] esquinasCentros = new Vector2[4]; esquinasCentros[0] = pos + new Vector2(Math.Min(pos.X, otra.pos.X), Math.Min(pos.Y, otra.pos.Y)); esquinasCentros[1] = pos + new Vector2(Math.Max(pos.X, otra.pos.X), Math.Min(pos.Y, otra.pos.Y)); esquinasCentros[2] = pos + new Vector2(Math.Max(pos.X, otra.pos.X), Math.Max(pos.Y, otra.pos.Y)); esquinasCentros[3] = pos + new Vector2(Math.Min(pos.X, otra.pos.X), Math.Max(pos.Y, otra.pos.Y)); foreach (Vector2 esquina in esquinasCentros) { if (puntoEnRect(esquina, esquinasOtro)) { return(true); } } //verifico si alguna de sus esquinas está dentro de mi rectangulo foreach (Vector2 esquina in esquinasCentros) { if (puntoEnRect(esquina, esquinasPropias)) { return(true); } } } return(false); } catch { Console.WriteLine("Error Catched"); return(false); } }