C# WPF蛇形游戏鼠标光标跟踪

C# WPF蛇形游戏鼠标光标跟踪,c#,wpf,game-physics,C#,Wpf,Game Physics,我正在尝试创建一个简单的蛇游戏,蛇跟着老鼠。我的蛇身必须是一条多段线。我的问题是,当我移动鼠标太快或太慢时,我的蛇的身体会变长/变短,我知道这是因为我正在用鼠标坐标添加新的点,然后当我连接线时,问题就出现了。但我想不出任何更聪明的解决方案 public partial class MainWindow : Window { Point mousePos; Polyline polyline; public MainWindow() { Initia

我正在尝试创建一个简单的蛇游戏,蛇跟着老鼠。我的蛇身必须是一条
多段线
。我的问题是,当我移动鼠标太快或太慢时,我的蛇的身体会变长/变短,我知道这是因为我正在用鼠标坐标添加新的点,然后当我连接线时,问题就出现了。但我想不出任何更聪明的解决方案

public partial class MainWindow : Window
{
    Point mousePos;
    Polyline polyline;
    public MainWindow()
    {
        InitializeComponent();

        polyline = new Polyline();
        polyline.Stroke = Brushes.Black;
        polyline.StrokeThickness = 4;

        var points = new PointCollection();
        for (int i = 0; i < 50; i++)
        {
            points.Add(new Point(i, i));
        }
        polyline.Points = points;
        canvas.Children.Add(polyline);

    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
        base.OnMouseMove(e);
        mousePos = e.GetPosition(canvas);

        polyline.Points.Add(mousePos);

        for (int i = 0; i < polyline.Points.Count - 1; i++)
        {
            polyline.Points[i] = new Point(polyline.Points[i + 1].X, polyline.Points[i + 1].Y);
        }

        polyline.Points.RemoveAt(0);

    }
}
公共部分类主窗口:窗口
{
点鼠标;
多段线;
公共主窗口()
{
初始化组件();
多段线=新的多段线();
多段线。笔划=画笔。黑色;
折线.StrokeThickness=4;
var points=new PointCollection();
对于(int i=0;i<50;i++)
{
增加(新的第(i,i)点);
}
多段线。点=点;
canvas.Children.Add(多段线);
}
MouseMove上的受保护覆盖无效(MouseEventArgs e)
{
基地移动(e);
鼠标点=e.GetPosition(画布);
多段线.点.添加(鼠标点);
对于(int i=0;i
我建议进行以下代码中注释的几项修改

原理是仅当鼠标到最后一个点的距离足够大时才创建新点,如果距离太远,则限制位移

Point mousePos;
Polyline polyline;
double stepSize = 10; // Square size
double stepSize2; // For precalculation (see below)

public MainWindow()
{
    InitializeComponent();

    polyline = new Polyline();
    polyline.Stroke = Brushes.Black;
    polyline.StrokeThickness = 4;

    polyline.Points = new PointCollection(); // Starts with an empty snake
    canvas.Children.Add( polyline );

    stepSize2 = stepSize * stepSize; // Precalculates the square (to avoid to repeat it each time)
}
protected override void OnMouseMove( MouseEventArgs e )
{
    base.OnMouseMove( e );
    var newMousePos = e.GetPosition( canvas ); // Store the position to test

    if ( Dist2( newMousePos, mousePos ) > stepSize2 ) // Check if the distance is far enough
    {
        var dx = newMousePos.X - mousePos.X;
        var dy = newMousePos.Y - mousePos.Y;

        if ( Math.Abs( dx ) > Math.Abs( dy ) ) // Test in which direction the snake is going
            mousePos.X += Math.Sign( dx ) * stepSize;
        else
            mousePos.Y += Math.Sign( dy ) * stepSize;

        polyline.Points.Add( mousePos );

        if ( polyline.Points.Count > 50 ) // Keep the snake lenght under 50
            polyline.Points.RemoveAt( 0 );
    }
}

double Dist2( Point p1, Point p2 ) // The square of the distance between two points (avoids to calculate square root)
{
    var dx = p1.X - p2.X;
    var dy = p1.Y - p2.Y;
    return dx * dx + dy * dy;
}

那比我的好多了。