Во время анимации менять скорость моделирования, к тому же нужно менять скорость каждого автомобиля - C#

Узнай цену своей работы

Формулировка задачи:

Всем добрый вечер. Я недавно познакомился с С#, поэтому застрял. Я разрабатываю приложение для визуализации некоторого процесса. Скажем похоже на автобан с автомобилями. 2 или больше полосы, автомобили едут, обгоняют и т.п. Но вопрос не в этом. Нужно во время анимации менять скорость моделирования, к тому-же нужно менять скорость каждого автомобиля. Мануалы я читать умею, форум тоже, но никак ко мне не доходит как это все организовать. Что почерпнул из форума так это то что нужно использовать отдельный поток для рассчетов и BufferedGraphics для отрисовки чтобы не было задержек. Или нет? Кто-то может обьяснить на словах как лучше организовать? Ибо сделал рассчеты и отрисовку в отдельном потоке, и в итоге даже остановка процесса происходит только через секунду после нажатия кнопки стоп. И да, все происходит в цикле, процесс итерационный. Буду очень признателен за помощь.

Решение задачи: «Во время анимации менять скорость моделирования, к тому же нужно менять скорость каждого автомобиля»

textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
 
namespace tank
{
    class _Bullet
    {
        public Point Location { get; set; }
        public Size Size { get; set; }
        public _Orientation Or { get; set; }
        public int Velocity { get; set; }
        public bool IsRunning { get; set; }
        public Image Image { get; set; }
 
        public Rectangle Rectangle
        {
            get { return new Rectangle(Location, Size); }
        }
 
        int maxWidth, maxHeight;
 
        public _Bullet(int maxWidth, int maxHeight)
        {
            Location = new Point(-10, -10);
            Size = new Size(6, 6);
            Velocity = 4;
            Image = tank.Properties.Resources.bulletImage;
 
            this.maxWidth = maxWidth;
            this.maxHeight = maxHeight;
        }
 
        public void Reset()
        {
            Location = new Point(-10, -10);
            IsRunning = false;
        }
 
        public void StartShoot(Point location, Size size, _Orientation orientation)
        {
            switch (orientation)
            {
                case _Orientation.Up:
                    {
                        Location = new Point(location.X + size.Width / 2 - Size.Width / 2, location.Y - Size.Height / 2);
                        break;
                    }
 
                case _Orientation.Down:
                    {
                        Location = new Point(location.X + size.Width / 2 - Size.Width / 2, location.Y + size.Height - Size.Height / 2);
                        break;
                    }
 
                case _Orientation.Left:
                    {
                        Location = new Point(location.X - Size.Width / 2, location.Y + size.Height / 2 - Size.Height / 2);
                        break;
                    }
 
                case _Orientation.Right:
                    {
                        Location = new Point(location.X + size.Width - Size.Width / 2, location.Y + size.Height / 2 - Size.Height / 2);
                        break;
                    }
            }
            IsRunning = true;
            Or = orientation;
        }
 
        public void Update(ref List<_Block> blocks)
        {
            int dx = 0, dy = 0;
            if (IsRunning)
            {
                if (Or == _Orientation.Up)
                    dy = -Velocity;
                else
                    if (Or == _Orientation.Down)
                        dy = Velocity;
                    else
                        if (Or == _Orientation.Left)
                            dx = -Velocity;
                        else
                            if (Or == _Orientation.Right)
                                dx = Velocity;
 
                Rectangle rect = new Rectangle(Location, Size);
                rect.Offset(dx, dy);
 
                bool intersect = false;
 
                for (int i = 0; i < blocks.Count; i++)
                {
                    if (RectIntersect(rect, new Rectangle(blocks[i].Location, blocks[i].Size)))
                    {
                        intersect = true;
                        blocks.RemoveAt(i);
                        i--;
                    }
                }
 
                if (rect.Top > 0 && rect.Bottom < maxHeight && rect.Left > 0 && rect.Right < maxWidth&&!intersect)
                    Location = rect.Location;
                else
                    Reset();
            }
        }
 
        public void Draw(Graphics graphics)
        {
            graphics.DrawImage(Image, Location);
        }
 
        /// <summary>
        /// проверяет, пересекаются ли 2 прямоугольника
        /// </summary>
        /// <param name="rect1"> 1 прямоугольник </param>
        /// <param name="rect2"> 2 прямоугольник </param>
        /// <returns> true - пересекаются, false - не пересекаются </returns>
        bool RectIntersect(Rectangle rect1, Rectangle rect2)
        {
            bool intersect = false;
 
            if (rect1.Left >= rect2.Left && rect1.Left <= rect2.Right && rect1.Top >= rect2.Top && rect1.Top <= rect2.Bottom
               || rect1.Left >= rect2.Left && rect1.Left <= rect2.Right && rect1.Bottom >= rect2.Top && rect1.Bottom <= rect2.Bottom
               || rect1.Right >= rect2.Left && rect1.Right <= rect2.Right && rect1.Top >= rect2.Top && rect1.Top <= rect2.Bottom
               || rect1.Right >= rect2.Left && rect1.Right <= rect2.Right && rect1.Bottom >= rect2.Top && rect1.Bottom <= rect2.Bottom)
                intersect = true;
 
            return intersect;
        }
    }
}

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


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

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

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