XNA: идентификация идентичных спрайтов, созданных с помощью цикла for - PullRequest
1 голос
/ 07 января 2012

G'day all,

Короче говоря, я использую цикл for для создания группы идентичных спрайтов, которые я хочу откидывать по экрану.Проблема в том, как мне написать процесс обнаружения столкновений для спрайтов.Я использовал процесс размещения прямоугольников вокруг спрайтов и использования метода .intersects для прямоугольников, но в этом случае я создал каждый спрайт отдельно и мог идентифицировать каждый из них уникальным образом.Теперь у меня есть куча спрайтов, но нет очевидного способа выбора одного из другого.

Подробно, если я создам объект с именем Bouncer.cs и дам ему инструкции по перемещению в его методе update (), то создамкуча спрайтов, использующих это в Game.cs:

for (int i = 1; i < 5; ++i)
{
    Vector2 position = new Vector2(i * 50, i * 50);
    Vector2 direction = new Vector2(i * 10, i * 10);
    Vector2 velocity = new Vector2(10);

    Components.Add(new Bouncer(this, position, direction, velocity, i));

 }

 base.Initialize();

Я могу нарисовать прямоугольник вокруг каждого, используя:

foreach (Bouncer component1 in Components)
{
    Bouncer thing = (Bouncer)component1;
    Rectangle thingRectangle;
    thingRectangle = new Rectangle((int)thing.position.X, (int)thing.position.Y, thing.sprite.Width, thing.sprite.Height);

Но теперь, как я могу проверить на столкновение?Я с трудом могу использовать:

if (thingRectangle.Intersects(thingRectangle))

Я должен отметить, что я учу по профессии и играю с кодированием, чтобы мой мозг не превратился в кашу.Недавно я работал с Python и с Python я мог просто поместить все спрайты в список:

sprites[];

Тогда я мог бы просто ссылаться на каждого из них как sprite [1] или sprite [2] или как угодноИндекс в списке есть.Есть ли в XNA что-то подобное?

Пожалуйста, дайте мне знать, нужно ли публиковать еще какой-нибудь код.

Спасибо, Эндрю.

1 Ответ

1 голос
/ 07 января 2012

Одним из решений, которое я использую в своем игровом движке, является запуск кода логики внутри объектов для каждого обновления игры, т.е.каждый кадр.Кажется, вы уже делаете это в соответствии с именами переменных, которые указывают, что вы запускаете некоторый физический код в объектах, чтобы обновить их позиции.

Возможно, вы также захотите создать прямоугольник столкновений внутри конструктора Bouncer, чтобы он был болеедоступны, и вы хорошо используете объектно-ориентированное программирование, возможно, даже сделаете его средством доступа, так что вы можете обновлять его каждый раз, когда вызываете его, вместо того, чтобы вручную обновлять ограничивающий / коллизионный блок.Например:

public Rectangle @BoundingBox {
    get { return new Rectangle(_Position.X, _Position.Y, width, height); }
}

Какой бы способ не работал, но проверки столкновений могут выполняться внутри объекта Bouncer.Вы можете сделать список ссылок объектов Bouncer статическим или передать его самим объектам.Код для коллизий очень прост:

foreach(Bouncer bouncer in Components) //Components can be a static List or you can pass it on in the constructor of the Bouncer object
{
    if (bouncer.BoundingBox.Intersects(this.BoundingBox))
    {
        //they collided
    }
}
...