Exemplo n.º 1
0
        internal bool TexturesCollided(XNACS1Primitive primitive1, XNACS1Primitive primitive2, out Vector2 collidePos)
        {
            collidePos = Vector2.Zero;

            Texture2D tex1 = m_TexTable.FindTexture(primitive1.Texture);
            Texture2D tex2 = m_TexTable.FindTexture(primitive2.Texture);

            if ((null == tex1) || (null == tex2))
            {
                return(false);
            }

            Color[] tex1Color = m_TexTable.FindTextureColor(primitive1.Texture);
            Color[] tex2Color = m_TexTable.FindTextureColor(primitive2.Texture);


            bool  pixelTouch = false;
            float r1InRadian = MathHelper.ToRadians(primitive1.RotateAngle);
            float r2InRadian = MathHelper.ToRadians(primitive2.RotateAngle);

            Vector2 p1XDir = RotateVectorByAngle(Vector2.UnitX, r1InRadian);
            Vector2 p1YDir = RotateVectorByAngle(Vector2.UnitY, r1InRadian);

            Vector2 p2XDir = RotateVectorByAngle(Vector2.UnitX, r2InRadian);
            Vector2 p2YDir = RotateVectorByAngle(Vector2.UnitY, r2InRadian);

            int tex1Width   = tex1.Width;
            int tex1Height  = tex1.Height;
            int tex1XOffset = 0;
            int tex1YOffset = 0;

            int tex2Width   = tex2.Width;
            int tex2Height  = tex2.Height;
            int tex2XOffset = 0;
            int tex2YOffset = 0;

            if (primitive1.UseSpriteSheet)
            {
                tex1Width   = primitive1.m_SpriteSourceRect.Width;
                tex1Height  = primitive1.m_SpriteSourceRect.Height;
                tex1XOffset = primitive1.m_SpriteSourceRect.X;
                tex1YOffset = primitive1.m_SpriteSourceRect.Y;
            }

            if (primitive2.UseSpriteSheet)
            {
                tex2Width   = primitive2.m_SpriteSourceRect.Width;
                tex2Height  = primitive2.m_SpriteSourceRect.Height;
                tex2XOffset = primitive2.m_SpriteSourceRect.X;
                tex2YOffset = primitive2.m_SpriteSourceRect.Y;
            }

            int i = 0;

            while ((!pixelTouch) && (i < tex1Width))
            {
                int j = 0;
                while ((!pixelTouch) && (j < tex1Height))
                {
                    collidePos = primitive1.TextureToWorldPos(i, j, tex1Width, tex1Height, p1XDir, p1YDir);
                    Color color1 = tex1Color[tex1XOffset + i + ((j + tex1YOffset) * tex1.Width)];
                    if (color1.A > 0)
                    {
                        int p2I, p2J;
                        primitive2.CameraPosToTexIndex(collidePos, tex2Width, tex2Height, p2XDir, p2YDir, out p2I, out p2J);

                        if ((p2I >= 0) && (p2I < tex2Width) &&
                            (p2J >= 0) && (p2J < tex2Height))
                        {
                            pixelTouch = (tex2Color[tex2XOffset + p2I + ((p2J + tex2YOffset) * tex2.Width)].A > 0);
                        }
                    }
                    j++;
                }
                i++;
            }

            return(pixelTouch);
        }