Хобрук: Ваш путь к мастерству в программировании

Ищу совет по лучшему способу создания отражающего светового луча для 2D-игры в XNA

Извините, если этот вопрос немного открыт, но я новичок в C# и XNA... и на самом деле в этом форуме!

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

Вот скриншот игры

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

Мне просто интересно, есть ли у кого-нибудь какие-либо советы относительно наилучшего метода обнаружения препятствий, их вращения и определения направления отражения Луча (с какой стороны Зеркала поражен), прежде чем я полностью посвятю себя чему-то, что может получить действительно сложно или никогда даже не работать?

Вот как выглядит мой класс Beam в настоящее время... все классы, кроме одного, наследуются от одного базового класса, называемого Object, и все объекты объявлены в статическом списке объектов, принадлежащем отдельному классу Items. Извините, если это плохое, грязное кодирование!

        class Beam : Object
{
    private Vector2 start;
    private double length;
    private Vector2 POC;



    public Beam(Vector2 pos)
        : base(pos)
    {

        spriteName = "beam";
        depth = 0.2f;
        solid = true;
        foreach (Object o in Items.objectList)
        {
            if (o.GetType() == typeof(PowerStation))
            {
                start = o.Origin;
            }
        }
    }

    public override void Update()
    {
        Point newPoint = new Point((int)Origin.X, (int)Origin.Y);
        while ((!(collision(new Mirror(new Vector2(0, 0))))) && (newPoint.X > 0) && (newPoint.Y > 0)) // && boundaries of window
        {
            newPoint.Y--; //will be changed to a Vector
        }

        POC = PointOfCollision(new Mirror(new Vector2(0, 0))); // Need to make it do POC of newPoint, not just the Beam Object!
        length = FindLength(start, new Vector2(50, 50));
        //Scale = new Vector2( , );     //amount to scale sprite


        base.Update();
    }

    private double FindLength(Vector2 pos1, Vector2 pos2)
    {
        return (Math.Sqrt(Math.Pow(Math.Abs(pos2.X - pos1.X), 2.0f) + Math.Pow(Math.Abs(pos2.Y - pos1.Y), 2.0f)));
    }
}

Любая помощь будет принята с благодарностью! заранее спасибо


  • Просто подсказка, я бы изменил FindLength(Vector2, Vector2) на FindLength(ref Vector2, ref Vector2) только для того, чтобы вместо передачи всего struct вы просто передавали указатель на него. 19.06.2012

Ответы:


1

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

Вместо этого возьмите свой луч и выполните итерацию по всем зеркалам, вычислите пересечение луча и плоскости зеркала (обработайте случай, когда пересечения нет), затем проверьте пересечение, чтобы убедиться, что оно находится внутри физического зеркала. Запишите матч, который происходит на кратчайшем расстоянии.

Вы почти наверняка можете ускорить этот расчет, заранее вычислив ограничивающие рамки для всех зеркал и при проверке луча отметьте, к какому квадранту он направляется от текущей точки — вы можете отбросить по крайней мере половину (а обычно 3/4) всех зеркал. зеркала с двумя целочисленными сравнениями каждое.

Повторяйте до тех пор, пока либо не будет пересечения (луч ускользает), либо он не наткнется на что-то, что остановит его, а не отразит.

Если зеркал МНОГО, можно пойти еще дальше и разбить экран на сектора, в каждом из которых есть список зеркал. Проверяйте только зеркала в текущем секторе, если вы не получили попадания, выясните, в какой сектор он входит дальше, и повторите. Это немного больше математики, бросающей луч луча в обмен на исключение большинства зеркал без единой инструкции. Если вы имеете дело с пользовательскими зеркалами, я сомневаюсь, что их будет достаточно, чтобы это стоило делать.

19.06.2012
  • Спасибо за вашу помощь! высоко ценится 19.06.2012

  • 2

    Представьте все в виде векторов: ваши световые лучи и стороны фигур, от которых они отражаются. Тогда это очень простая алгебра для обнаружения пересечений и углов отражения. Это также будет бесконечно быстрее, чем любое обнаружение на основе пикселей.

    19.06.2012
    Новые материалы

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

    Как я опубликовал свое первое приложение в App Store в 13 лет
    Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

    Что в лицо
    Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

    Почему шаблоны проектирования и почему нет?
    Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..