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;
}
那比我的好多了。