C # XNA 4.0 Получение масштабируемой позиции повернутого спрайта в окне - PullRequest
1 голос
/ 07 июня 2011

У меня есть некоторые проблемы со столкновением.Я хочу получить координаты спрайта, который можно вращать в масштабе или как угодно.Это похоже на руководство Riemers, но он сталкивается с двумя спрайтами, и мне нужны только те точки, где альфа равна нулю.

Лучше увидеть источник:

 public Color[,] TextureTo2DArray(Texture2D texture) // to get color array
    {
        Color[] colors1D = new Color[texture.Width * texture.Height];
        texture.GetData(colors1D);

        Color[,] colors2D = new Color[texture.Width, texture.Height];
        for (int x = 0; x < texture.Width; x++)
            for (int y = 0; y < texture.Height; y++)
                colors2D[x, y] = colors1D[x + y * texture.Width];

        return colors2D;
    }

С цветом довольно легко,но вот часть, где я получаю очки:

 public Vector2 TexturePos(Color[,] Color, Matrix matrix)
        {

            int width1 = Color.GetLength(0);
            int height1 = Color.GetLength(1);


            for (int x = 0; x < width1; x++)
            {
                for (int y = 0; y < height1; y++)
                {
                    Vector2 pos1 = new Vector2(x, y);

                    if (Color[x, y].A > 0)
                    {
                        Vector2 screenPos = Vector2.Transform(pos1, matrix);
                        return screenPos;
                    }
                }
            }

            return new Vector2(-1, -1);
        }

И для матрицы я использую это:

        Matrix matrix =
            Matrix.CreateTranslation(new Vector3(origin, 0)) * 
            Matrix.CreateRotationZ(MathHelper.ToRadians(rotation))*
            Matrix.CreateScale(scale) * 
            Matrix.CreateTranslation(new Vector3(pos, 0));

Спрайт прямоугольный, но я получаю круговое движение: я вращаюсьэто (вращение + = 0,5), добавляя гравитацию и заставляя ее сталкиваться с некоторым значением y:

Pos.Y += 5;
if (Position.Y >= 200)
BoxPos.Y -= 5;

И я получаю, что он вращается как окружность, сталкивающаяся с линией, но не как прямоугольник.

Это нормально?Может быть, мне нужны исправления в источнике?

1 Ответ

0 голосов
/ 10 августа 2011

"Предполагается, что этот метод получает позицию пикселя (в спрайте), которая не является прозрачной, а поворачивается и масштабируется (в зависимости от спрайта)."

Вам нужно взглянуть на это: http://create.msdn.com/en-US/education/catalog/tutorial/collision_2d_perpixel_transformed

Это отличная статья о 2D-столкновениях в XNA, в которой есть пример метода, который выполняет 2D-обнаружение столкновений для Scaled & Rotated набора спрайтов.

...