Движение фигур - вопрос оптимальной прорисовки - 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;
}
}