Пример #1
0
 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 void agregarFFRectangulo(float ancho, float alto, Vector2 offsetPos)
        {
            FormaFisica ff  = new FormaFisicaRectangulo(ancho, alto);
            FFOffset    ffo = new FFOffset();

            ffo.ff     = ff;
            ffo.offset = offsetPos;

            formasFisicasOffset.Add(ffo);
        }
Пример #3
0
        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);
            }
        }