我已经创建了一个“笔”,但是现在当我开始绘制时,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类的信息,但是现在我完全困惑了,我应该使用什么以及用什么方式。
答案 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。用户可以使用鼠标滚轮旋转单位。我有一个绑定的命令可以做到这一点。