Название говорит само за себя. Я пытаюсь создать столкновение с помощью метода столкновения на пиксель, который у меня работает для всех моих врагов. Мой метод отлично работает, если я не использую список. Вот код, который я использую:
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;
}
Мой вопрос здесь в том, как я могу преобразовать этот фрагмент кода, чтобы иметь возможность работать со списком.





Вы можете добавить перегрузку и использовать ToArray () из Linq:
public bool Update(Matrix personTransform2, List<Color> data2)
{
Update(Matrix personTransform2, data2.ToArray())
}
но из-за производительности (выше создается копия) я бы, вероятно, заменил Color[] на List<Color> в обеих подписях.
С другой стороны, для такого рода вычислений вам, вероятно, не следует использовать List<Color> для начала. Если вас волнует производительность, работайте напрямую с массивами.
Были допущены ошибки ... Я забыл поставить цикл foreach, который просматривал весь мой список ... Код был:
for(int i = 0; i < lista.Count; i++)
{
if (lista[i].Update(blockTransform, data2))
{
touched = true;
}
}