Движение фигур - вопрос оптимальной прорисовки - C#
Формулировка задачи:
Доброго времени суток.
Нужно написать мини-игру. Суть игры простая на экране три прямоугольника-коробки в них сверху падают круги разного цвета, так же они могут выпадать из коробки вниз, по окончанию игрок должен ответить на ряд вопросов (что-то вроде "Сколько синих шаров в третей коробке?" или "Сколько жёлтых и зелёных шаров в первой коробке?") за каждый правильный ответ игрок получает определённое количество очков.
Теперь о вопросе подробней. Что касается реализации математической части игры и вопросов в конце сделать это не составляет труда, а вот с кругами проблема. Я не смог придумать не чего лучше как постоянно перерисовывать PictureBox с помощью Refresh к тому же надо что бы круги уходили за коробки, а не просто рисовалось всё одной кучей
P.S. Не обязательно именно писать код, достаточно будет ссылки на статью или на проект где описывается движение фигур или отрывок чужого кода, в общем хоть что-то, а то своими силами нечего найти не удалось
Решение задачи: «Движение фигур - вопрос оптимальной прорисовки»
textual
Листинг программы
using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.Linq; namespace WindowsFormsApplication318 { public partial class Form1 : Form { private Ball ball; private Box box = new Box(); public Form1() { InitializeComponent(); SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.ResizeRedraw, true); box = new Box {Bounds = new RectangleF(Width/2 - 50, Height/2, 100, 30)}; Application.Idle += delegate { Invalidate(); }; } protected override void OnPaint(PaintEventArgs e) { if (ball == null || ball.Location.Y > Height) { ball = new Ball(); ball.Location = new PointF(Width/2, 0); } if (box.Bounds.Contains(ball.Location)) ball.Speed = 2; ball.Update(0.01f); e.Graphics.SmoothingMode = SmoothingMode.HighQuality; e.Graphics.FillEllipse(Brushes.Red, ball.Location.X - ball.Radius, ball.Location.Y - ball.Radius, ball.Radius * 2, ball.Radius * 2); e.Graphics.FillRectangle(Brushes.Blue, box.Bounds); } } class Ball { public PointF Location { get; set; } public float Radius { get; set; } public float Speed { get; set; } public Ball() { Radius = 10; } public void Update(float dt) { Speed += 9.8f * dt; Location= new PointF(Location.X, Location.Y + Speed * dt); } } class Box { public RectangleF Bounds; } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д