Exemplo n.º 1
0
        public bool PixeisTocaram(Texturas outraTextura, out Vector2 pontoColisao)
        {
            bool toca = ToqueTextures(outraTextura);

            pontoColisao = Posicao;
            if (toca)
            {
                bool toquePixel = false;

                Vector2 direccaoIX = MostraVector.ModificarPeloAng(Vector2.UnitX, Rotacao);
                Vector2 direccaoIY = MostraVector.ModificarPeloAng(Vector2.UnitY, Rotacao);

                Vector2 outraDirX = MostraVector.ModificarPeloAng(Vector2.UnitX, outraTextura.Rotacao);
                Vector2 outraDirY = MostraVector.ModificarPeloAng(Vector2.UnitY, outraTextura.Rotacao);

                int i = 0;
                while ((!toquePixel) && (i < SpriteLargura))

                {
                    int j = 0;
                    while ((!toquePixel) && (j < SpriteAltura))
                    {
                        pontoColisao = IndiceDaPosicaoCamera(i, j, direccaoIX, direccaoIY);
                        Color corI = BuscaCores(i, j);
                        if (corI.A > 0)
                        {
                            Vector2 outroIndex = outraTextura.PosicaoCameraIndex(pontoColisao, outraDirX, outraDirY);
                            int     xMin       = (int)outroIndex.X;
                            int     yMin       = (int)outroIndex.Y;

                            if ((xMin >= 0) && (xMin < outraTextura.SpriteLargura) && (yMin >= 0) && (yMin < outraTextura.SpriteAltura))
                            {
                                toquePixel = (outraTextura.BuscaCores(xMin, yMin).A > 0);
                            }
                        }
                        j++;
                    }
                    i++;
                }
                toca = toquePixel;
            }
            return(toca);
        }
Exemplo n.º 2
0
        public bool ToqueTextures(Texturas outraTextura)
        {
            if ((Math.Abs(rotacaoI) < float.Epsilon) && (Math.Abs(outraTextura.rotacaoI) < float.Epsilon))
            {
                //Sem rotaçoes e verifica se exite uma sobreposiçao de limites
                Vector2 meuMin   = LimiteMin;
                Vector2 outroMin = outraTextura.LimiteMin;

                Vector2 meuMax   = LimiteMaxx;
                Vector2 outroMax = outraTextura.LimiteMaxx;

                return((meuMin.X < outroMax.X) && (meuMax.X > outroMin.X) && (meuMin.Y < outroMax.Y) && (meuMax.Y > outroMin.Y));
            }
            else
            {
                // Se um dos elementos tiver rodado usa o angulo
                //Usar o maior ratio de imagem e raio mais proximo
                // raiz quadrada de (1/2)*X ~ 0.71f*X

                float raio1 = 0.71f * MathHelper.Max(Tamanho.X, Tamanho.Y);
                float raio2 = 0.71f * MathHelper.Max(outraTextura.Tamanho.X, outraTextura.Tamanho.Y);
                return((outraTextura.Posicao - Posicao).Length() < (raio1 + raio2));
            }
        }
Exemplo n.º 3
0
        static public EstadoColisaoCamera ColisaoComJanela(Texturas prim)
        {
            Vector2 min = posicaoCantoInferiorEsq;
            Vector2 max = posicaoCantoSuperiorDir;

            if (prim.LimiteMaxx.Y > max.Y)
            {
                return(EstadoColisaoCamera.ColisaoSuperior);
            }
            if (prim.LimiteMin.X < min.X)
            {
                return(EstadoColisaoCamera.ColisaoEsq);
            }
            if (prim.LimiteMaxx.X > max.X)
            {
                return(EstadoColisaoCamera.ColisaoDir);
            }
            if (prim.LimiteMin.Y < min.Y)
            {
                return(EstadoColisaoCamera.ColisaoInferior);
            }

            return(EstadoColisaoCamera.DentroJanela);
        }