110,534
社区成员
发帖
与我相关
我的任务
分享
private void timerPlay_Tick(object sender, EventArgs e)
{
if (Players0.Location != destPt)
{
orgPt = Players0.Location;
turn[0] = Players0.Left - destPt.X;
turn[1] = Players0.Top - destPt.Y;
double s = Math.Sqrt((orgPt.X - destPt.X) * (orgPt.X - destPt.X) + (orgPt.Y - destPt.Y) * (orgPt.Y - destPt.Y));
Players0.Left += (int)(Speed0 * (destPt.X - orgPt.X) / s);
Players0.Top += (int)(Speed0 * (destPt.Y - orgPt.Y) / s);
int xx = Players0.Left - destPt.X;
int yy = Players0.Top - destPt.Y;
if(xx * turn[0] <= 0) //是否改变了方向,防止左右晃动
Players0.Left = destPt.X;
if (yy * turn[1] <= 0)
Players0.Top = destPt.Y;
}
else
{
timerPlay.Enabled = false;
}
}
public partial class Form1 : Form
{
//目标坐标X
private int targetX=-1;
//目标坐标Y
private int targetY=-1;
//计时器,实现游戏循环
private Timer loop;
//角色
private Player player;
//速度
private int speed = 5;
public Form1()
{
InitializeComponent();
DoubleBuffered = true;
player = new Player();
loop = new Timer();
loop.Interval = 10;
loop.Tick += GameLoop;
loop.Start();
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
player.Render(e.Graphics);
}
private void GameLoop(object sender, EventArgs e)
{
float dx = targetX - player.X;
float dy = targetY - player.Y;
float dd = (float)Math.Sqrt(dx * dx + dy * dy);
if (dd < 5)
{
player.X = targetX;
player.Y = targetY;
}
else
{
player.X += dx / dd*speed;
player.Y += dy / dd*speed;
}
this.Invalidate();
}
private void Form1_MouseClick(object sender, MouseEventArgs e)
{
// 目标坐标
targetX = e.X;
targetY = e.Y;
}
}
/// <summary>
/// 角色
/// </summary>
public class Player
{
public float X { get; set; }
public float Y { get; set; }
public void Render(Graphics g)
{
using (Brush brush = new SolidBrush(Color.Red))
{
g.FillRectangle(brush, X-10, Y-10, 20, 20);
}
}
}