Во время анимации менять скорость моделирования, к тому же нужно менять скорость каждого автомобиля - 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; } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д