Проблема с передвижением объекта С#

292
06 октября 2017, 14:38

Здравствуйте! Я только начал разбираться с C#, хочу нарисовать движущийся круг. Написал такие методы:

private void draw()
{
    Pen myPen = new Pen(Color.Black);
    g.DrawRectangle(myPen, 10, 10, 50, 50);
    g.DrawEllipse(myPen, (float)xStart, (float)yStart, 5, 5);
}
private void updateCoords(object obj)
{
    if (xStart < 10)
        dx = -dx;
    if (xStart > 60)
        dx = -dx;
    if (yStart < 10)
        dy = -dy;
    if (yStart > 60)
        dy = -dy;
    xStart = xStart + dx;
    yStart = yStart + dy;
    draw();
}
private void button1_Click(object sender, EventArgs e)
{
    int time = 0;
    TimerCallback tc = new TimerCallback(updateCoords);
    System.Threading.Timer timer = new System.Threading.Timer(tc, ++time, 0, 100);
}

Когда нажимаю на кнопку, круг начинает перемещаться, но каждый раз, когда он рисуется заново, старые круги не пропадают, т.е. отображается много кругов сразу. Подскажите, пожалуйста, как сделать, чтоб в каждый момент отображался только один круг в текущем положении. Использую Visual Studio 2015.

Добавлено

Graphics g; // определяется в классе, но снаружи методов
public Form1() // есть у меня такой метод ещё
{
    InitializeComponent();
    g = panel1.CreateGraphics();
}
Answer 1

Как пример вот вам класс, но естественно его необходимо переделать под себя.

using System.Drawing;
using System.Windows.Forms;
public class MyPainter : Control
{
    private int _xStart, _yStart, _dx, _dy;
    private readonly System.Threading.Timer _timer;
    public MyPainter()
    {
        int time = 0;
        _timer = new System.Threading.Timer(UpdateCoords, ++time, 0, 100);
    }
    ~MyPainter()
    {
        _timer?.Dispose();
    }
    public void UpdateCoords(object obj)
    {
        _dx--;
        _dy--;
        if (_xStart < 10)
            _dx = -_dx;
        if (_xStart > 60)
            _dx = -_dx;
        if (_yStart < 10)
            _dy = -_dy;
        if (_yStart > 60)
            _dy = -_dy;
        _xStart = _xStart + _dx;
        _yStart = _yStart + _dy;
        Invalidate();
    }
    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawRectangle(Pens.White, new Rectangle(0, 0, Size.Width, Size.Height));
        e.Graphics.DrawRectangle(Pens.Black, 10, 10, 50, 50);
        e.Graphics.DrawEllipse(Pens.Black, new Rectangle(_xStart, _yStart, 40, 40));
    }
}
READ ALSO
Newtonsoft json

Newtonsoft json

Добрый вечер

371
XML не работает на андроиде

XML не работает на андроиде

Ни XmlDocument, ни HtmlDocument (из библиотеки HtmlAgilityPack) не хотят нормально работать с html страницейВот вам пример:

360
socket соединение

socket соединение

Хочу написать клиент-серверное приложение, клиенту нужно будет передавать данные на протяжении огромного количества времениСервер соответственно...

211
Корзина на бэкэнде

Корзина на бэкэнде

Использую entity framework,code first, решил сделать корзину на серверной стороне, чтобы заказ из мобильного приложения можно было продолжить на сайтеВот...

311