Не работает 2D передвижение объекта к месту клика мышкой - C#
Формулировка задачи:
Суть в том, что после клика мыши объект получает координаты X и Y клика, и должен двигаться в том направлении. Координаты передаются в MoveTo, а угол высчитывается в GetAngle. В математике почти ноль, формулы с форумов.
private double GetAngle(double x1,double y1,double x2,double y2) { double ang = Math.Atan((x1 - x2) / (y1 - y2)) * Rad2Deg; if ((x1 < x2) && (y1 > y2)) return ang; else if (((x1 < x2) && (y1 < y2)) || ((x1 > x2) && (y1 < y2))) return ang + 180d; else return ang + 360d; } public void MoveTo(double x, double y) { TX = x; TY = y; Angle = GetAngle(TX, TY, X, Y); TimerMove.Interval = 10; TimerMove.Start(); } private void Move(object sender, EventArgs e) { X += Speed * (Math.Sin(Angle * Rad2Deg)); Y += Speed * (Math.Cos(Angle * Rad2Deg)); }
Решение задачи: «Не работает 2D передвижение объекта к месту клика мышкой»
textual
Листинг программы
using System; using System.Drawing; using System.Windows.Forms; namespace WindowsFormsApplication254 { public partial class Form1 : Form { private Bot bot = new Bot(); public Form1() { InitializeComponent(); SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint, true); Application.Idle += (o, e) => Invalidate();//постоянно обновляем MouseDown += (o, e) => bot.TargetLocation = e.Location;//устанавливаем цель для бота } protected override void OnPaint(PaintEventArgs e) { base.OnPaint(e); //обновляем состояние бота bot.Update(); //рисуем бота e.Graphics.FillRectangle(Brushes.Red, bot.Location.X-2, bot.Location.Y-2, 5, 5); } } public class Bot { public float Speed = 0.2f; public PointF Velocity { get; private set; } public PointF Location = new PointF(10, 10); public PointF TargetLocation = new PointF(100, 100); public void Update() { var d = new PointF(TargetLocation.X - Location.X, TargetLocation.Y - Location.Y);//вектор движения var length = (float) Math.Sqrt(d.X * d.X + d.Y * d.Y); if (length < Speed) { Location = TargetLocation; Velocity = new PointF(0, 0); } else Velocity = new PointF(d.X * Speed / length, d.Y * Speed / length); Location = new PointF(Location.X + Velocity.X, Location.Y + Velocity.Y); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д