Winforms: вызов функции формы входа из другого класса - PullRequest
2 голосов
/ 18 марта 2012

Я немного новичок в программировании и получил вопрос о том, что такое хорошая практика.

Я создал класс, который представляет шар, и у него есть функция Jump(), которая использует 2 таймера и поднимает и опускает мяч.

Я знаю, что в Winforms вам нужно звонить Invalidate() каждый раз, когда вы хотите перекрасить экран или его часть. Я не нашел хорошего способа сделать это, поэтому я ссылаюсь на форму в своем классе и звонил Invalidate() в своем классе мяча каждый раз, когда мне нужно перекрасить в движение шара.

(это работает, но у меня сложилось впечатление, что это нехорошая практика)

Вот класс, который я создал:

public class Ball
{
    public Form1 parent;//----> here is the reference to the form
    public Rectangle ball;
    Size size;
    public  Point p;
    Timer timerBallGoUp  = new Timer();
    Timer timerBallGDown = new Timer();

    public  int ballY;

    public Ball(Size _size, Point _p)
    {
        size = _size;
        p = _p;
        ball = new Rectangle(p, size);
    }

    public void Jump()
    {
        ballY = p.Y;
        timerBallGDown.Elapsed += ballGoDown;
        timerBallGDown.Interval = 50;
        timerBallGoUp.Elapsed += ballGoUp;
        timerBallGoUp.Interval = 50;
        timerBallGoUp.Start();
    }

    private void ballGoUp(object obj,ElapsedEventArgs e)
    {
        p.Y++;
        ball.Location = new Point(ball.Location.X, p.Y);
        if (p.Y >= ballY + 50)
        {
            timerBallGoUp.Stop();
            timerBallGDown.Start();
        }

        parent.Invalidate(); // here i call parent.Invalidate() 1
    }

    private void ballGoDown(object obj, ElapsedEventArgs e)
    {
        p.Y--;
        ball.Location = new Point(ball.Location.X, p.Y);

        if (p.Y <= ballY)
        {
            timerBallGDown.Stop();
            timerBallGoUp.Start();
        }

        parent.Invalidate(); // here i call parent.Invalidate() 2
    }
}

Мне интересно, есть ли лучший способ сделать это?

(простите за мой английский)

1 Ответ

3 голосов
/ 18 марта 2012

Вы должны сделать событие Changed в вашем шаре, которое срабатывает всякий раз, когда необходимо перерисовать шар.
Затем вы можете обработать это событие в форме и Invalidate().

Однако онобыло бы лучше заменить все ваши таймеры одним таймером в форме, которая вызывает публичный метод Tick() для каждого объекта (мяч, кирпич и т. д.).
Вы можете сделать один Invalidate() после отметки каждогоobject.
Это также гарантирует, что все ваши объекты синхронизированы.

...