2D Rectangle система обнаружения столкновений (работает в реальной игре) - PullRequest
1 голос
/ 07 февраля 2011

Последние несколько месяцев я занимался разработкой игры в свободное время.Одной из претензий, которую я повторял снова и снова и не получил 100% работы, является обнаружение столкновений.Моя система (размещена ниже) в основном работает, однако случайные вещи, кажется, случаются время от времени, например, когда игрока выталкивают за пределы уровня и т. Д. Учебники по этому вопросу, с которыми я сталкивался, предлагают базовую работу, т.е.знать, что объект будет связан с рассматриваемым объектом, но в реальной игре вы бы этого не знали.Вот моя реализация, но что мне нужно, так это если кто-нибудь знает о хорошей надежной системе для достижения того, что я здесь делаю.

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

    public void Move(float xAdditional, float yAdditional)
    {
        X += xAdditional;
        Y += yAdditional;

        foreach (var item in Level.Items)
        {
            if (item != this)
            {
                if (item.Boundary.Intersects(this.Boundary))
                {
                    if (item.Boundary.Top > this.Boundary.Top) //we have collided with an object below us.
                    {
                        Y = item.Boundary.Top - (this.Boundary.Height/2);
                    }
                    if(item.Boundary.Bottom < this.Boundary.Bottom)//we have collided with an object above us.
                    {
                        Y = item.Boundary.Bottom + (this.Boundary.Height/2);
                    }
                    if(item.Boundary.Left > this.Boundary.Left) //We have collided with an object to the right.
                    {
                        X = item.Boundary.Left - (this.Boundary.Width/2);
                    }
                    if(item.Boundary.Right < this.Boundary.Right)// We have collided with an object to the left;
                    {
                        X = item.Boundary.Right + (this.Boundary.Width/2);
                    }
                }
            }

        }


    }

Ответы [ 2 ]

1 голос
/ 08 февраля 2011

Окончательным решением было отказаться от моего собственного решения и внедрить Farseer .

Спасибо

Через некоторое время после этого я выбрал phys2d.net, который я нашел гораздо более полезным с точки зрения разработчиков.

0 голосов
/ 07 февраля 2011

Прежде всего, обнаружение столкновений сильно зависит от геометрии объекта.Существует множество проверенных на практике решений, интегрированных в математические линейные алгебры, но они зависят от геометрии, которую вы пытаетесь использовать.Вместо того, чтобы реализовывать алгоритм с использованием свойств вашего объекта, попробуйте реализовать математическое уравнение напрямую, а затем использовать результат, чтобы определить, произошло ваше столкновение или нет.(как при использовании векторов t = ab, если | t |> 0, иначе нет).

Если у вас есть простая геометрия, например, прямоугольники или круги, вам следует взглянуть на «Математику для программирования трехмерных игр и компьютерной графики» Эрика Ленгеля.

Также имейте в виду, что вы можете достичьобнаружение столкновений с другими методами, такими как столкновение спрайтов.Другая возможность заключается в использовании инфраструктуры более высокого уровня, выполняющей эту работу за вас (например, OSG)

...