Не работает 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);
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы