Какой самый эффективный способ создания «инструмента пера» для рисования, как в Paint? - PullRequest
0 голосов
/ 22 мая 2019

Я создал «перо», но теперь, когда я начинаю рисовать, загрузка процессора превышает 60%, и он начинает отставать. Это просто очень плохой алгоритм для этой задачи? Нашел его на msdn и немного измени. Каждый раз, когда мышь перемещается по холсту, я создаю линию от предыдущей позиции мыши до текущей.

Вот оно (я действительно новичок)

private void MainCanvas_MouseMove(object sender, MouseEventArgs e)
    {

        Canvas.SetTop(el, customCursor.Y - cursorRadius / 2);
        Canvas.SetLeft(el, customCursor.X - cursorRadius / 2);

        if (e.LeftButton == MouseButtonState.Pressed)
        {
            myPath = new Path();
            mainCanvas.Children.Add(myPath);
            geometry = new StreamGeometry();
            myPath.Stroke = Brushes.Red;
            myPath.StrokeThickness = 5;
            geometry.FillRule = FillRule.EvenOdd;
            using (StreamGeometryContext ctx = geometry.Open())
            {
                ctx.BeginFigure(customCursor, false /* is filled */, false /* is closed */);

                ctx.LineTo(e.GetPosition(mainCanvas), true /* is stroked */, false /* is smooth join */);

            }

            geometry.Freeze();

            myPath.Data = geometry;
            customCursor = e.GetPosition(mainCanvas);

        }
    }

Я читал о классах рисования и фигуры, но теперь я совершенно сбит с толку, что мне следует использовать и каким образом.

1 Ответ

0 голосов
/ 23 мая 2019

Игра, над которой я работал, включает в себя редактор карт. Это боевой симулятор, установленный в 18-19 веке, поэтому Э.Г. Ватерлоо, последний бой Кастера, Исандлвана.

Помимо других функций, пользователь может рисовать области или линии в форме линий. Е.Г. Леса или дороги.

Это довольно сложный процесс, поэтому это обязательно обзор.

Я использую InkCanvas для рисования кривых, потому что чернила очень хорошо сглаживают маленькие колебания при рисовании. И, конечно же, у этого есть курсор пера.

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

Это оформлено в пользовательский интерфейс с использованием шаблонов данных. У меня есть Canvas, так как панель элементов элемента управления контентом хранит все это.

Есть также здания и места, которые вы просто щелкаете где-то, чтобы разместить. Есть несколько шаблонов для зданий.

Каждая нарисованная или добавленная вещь является моделью представления, которая входит в наблюдаемую коллекцию, связанную с источником элементов этого элемента управления. Вы можете связать panel.zindex, но по умолчанию порядок их добавления определяет zindex.

Нет явной системы слоев, по которой вы можете сгруппировать их, но вы могли бы довольно легко представить виртуальную, добавив свойство слоя в вашу модель представления.

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

Я не реализовал их перетаскивание, но у меня есть аналогичные настройки для юнитов в редакторе сценариев. Вы можете перетащить юниты вокруг, чтобы расположить их. У них есть свойства X и Y, которые я связываю с canvastele шаблона itemtemplate и canvas.top. Пользователь может вращать юниты с помощью колесика мыши. У меня есть связанная команда делает это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...