За столкновение пикселей в списке - PullRequest
0 голосов
/ 27 мая 2018

Название говорит само за себя.Я пытаюсь сделать столкновение с помощью метода столкновения за пиксель, который у меня есть для всех моих врагов.Мой метод работает хорошо, если я не использую список.Вот код, который я использую:

public bool IntersectPixels(
Matrix transformA, int widthA, int heightA, Color[] dataA,
Matrix transformB, int widthB, int heightB, Color[] dataB)
    {
        // Calculate a matrix which transforms from A's local space into
        // world space and then into B's local space
        Matrix transformAToB = transformA * Matrix.Invert(transformB);

        // For each row of pixels in A
        for (int yA = 0; yA < heightA; yA++)
        {
            // For each pixel in this row
            for (int xA = 0; xA < widthA; xA++)
            {
                // Calculate this pixel's location in B
                Vector2 positionInB =
                    Vector2.Transform(new Vector2(xA, yA), transformAToB);

                // Round to the nearest pixel
                int xB = (int)Math.Round(positionInB.X);
                int yB = (int)Math.Round(positionInB.Y);

                // If the pixel lies within the bounds of B
                if (0 <= xB && xB < widthB &&
                    0 <= yB && yB < heightB)
                {
                    // Get the colors of the overlapping pixels
                    Color colorA = dataA[xA + yA * widthA];
                    Color colorB = dataB[xB + yB * widthB];

                    // If both pixels are not completely transparent,
                    if (colorA.A != 0 && colorB.A != 0)
                    {
                        // then an intersection has been found
                        return true;
                    }
                }
            }
        }

        // No intersection found
        return false;
    }

Чтобы проверить коллизию, я использую этот бит кода:

public bool Update(Matrix PersonTransform2,Color[] data2)
    {
        personTransform1 = Matrix.CreateTranslation(new Vector3(new Vector2(position.X, position.Y), 0.0f));
        if (game.IntersectPixels(PersonTransform2, texture.Width, texture.Height, data2,
            PersonTransform1, texture.Width, texture.Height, data1))
        {
            return true;
        }
        return false;
    }

Мой вопрос здесь заключается в том, как я могу преобразовать этот бит кода, чтобы иметь возможностьработать со списком.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Были допущены ошибки ... Я забыл поставить цикл foreach, который прошел через весь мой список ... Код был:

for(int i = 0; i < lista.Count; i++)
        {
            if (lista[i].Update(blockTransform, data2))
            {
                touched = true;
            }
        }
0 голосов
/ 28 мая 2018

Вы можете добавить перегрузку и использовать ToArray () из Linq:

public bool Update(Matrix personTransform2, List<Color> data2)
{
    Update(Matrix personTransform2, data2.ToArray())
}

, но из-за производительности (вышеприведенное создает копию) я бы, вероятно, заменил Color[] на List<Color> в обоихподписи.

С другой стороны, для такого рода расчетов вам, вероятно, не следует использовать List<Color> для начала.Если вы заботитесь о производительности, работайте с массивами напрямую.

...