像在“画图”中那样,哪种最有效的方式来创建用于绘图的“笔工具”?

时间:2019-05-22 20:11:07

标签: c# wpf

我已经创建了一个“笔”,但是现在当我开始绘制时,CPU的负载超过60%,并且变得滞后。这对这个任务来说是一个非常糟糕的算法吗? 在msdn上找到它并进行更改。 每次当鼠标移到画布上时,im都会从以前的鼠标位置移动到当前位置。

有(我真的是新手)

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);

        }
    }

我阅读了有关Drawing和Shape类的信息,但是现在我完全困惑了,我应该使用什么以及用什么方式。

1 个答案:

答案 0 :(得分:0)

我正在研究的游戏包括一个地图编辑器。这是一场战斗模拟游戏,背景设定在18-19世纪,因此卡斯特(Custer)的最后一站Isandlwana(Esandlwana)是EG Waterloo。

在其他功能中,用户可以绘制区域或线形地形。 EG森林或道路。

这是一个相当复杂的过程,因此必定是一个概述。

我使用InkCanvas绘制曲线,因为在绘制时,墨水非常善于平滑小抖动。当然还有笔形光标。

然后我翻译他们绘制的用户笔划。我计算出其中的所有点,建立一个几何。

使用datatemplates将其模板化到UI中。我有一个Canvas,因为itemscontrol的itemspanel托管了所有这些画布。

还有一些建筑物和地点,您只需单击某个地方即可。建筑物有多个模板。

每个绘制或添加的东西都是一个视图模型,该视图模型进入一个可观察的集合中,该集合绑定到该itemscontrol的itemssource。您可以绑定panel.zindex,但默认情况下,它们的添加顺序定义zindex。

没有明确的分层系统可以将其分组,但是您可以通过在viewmodel中添加layer属性来很容易地引入虚拟系统。

我还将其过滤后的版本绑定到列表框,以便用户可以操纵每个地形的属性。您的版本可能包含诸如转换之类的功能,以使尺寸更大。

我还没有实现对它们的任何拖动,但是我在场景编辑器中对单元进行了类似的设置。您可以拖动单位来定位它们。它们具有X和Y属性,我绑定到itemtemplate的canvas.left和canvas.top。用户可以使用鼠标滚轮旋转单位。我有一个绑定的命令可以做到这一点。