Почему мои методы рисования на форме не работают? (C #) - PullRequest
0 голосов
/ 10 апреля 2019

[решено] Я пытаюсь смоделировать "игру жизни" как в консоли, так и рисуя ее, но моя форма простая и белая.Как я могу сделать мои методы пригодными для использования?

Я делаю это как свой первый код на C # в VisualStudio 2019, просто чтобы ладить с объектно-ориентированными языками.Я пробовал рисование на основе событий (щелчки мыши, кнопки), и все было в порядке.

Мой класс формы выглядит так:

public partial class Board : Form
{
    private int BOARDWIDTH;
    private int BOARDHEIGHT;
    private int cellSize;
    private bool paint = false; //ADDED IN
    private World world;
    Graphics drawArea;
    public Board(World world, int cellsize)
    {
        this.BOARDHEIGHT = world.getWorldHeight() * cellsize;
        this.BOARDWIDTH = world.getWorldWidth() * cellsize;
        InitializeComponent();
        drawingArea.SetBounds(0, 0, this.BOARDWIDTH, this.BOARDHEIGHT);
        drawArea = drawingArea.CreateGraphics();
        this.cellSize = cellsize;
        this.world = world;
    }
    public void updateBoard(World world)
    {
        this.world = world;
    }
    protected override void OnPaint(PaintEventArgs e) // ADDED IN (Basically previous DrawCell inside)
    {
        base.OnPaint(e);
        if(paint)
        {
            Rectangle rect = new Rectangle(x*this.cellSize, y*this.cellSize, 
this.cellSize, this.cellSize);

            if (this.world.getCellState(x, y))
            {
                rect.Height--;
                rect.Width--;
                using (Pen wPen = new Pen(Color.Black))
                {
                    e.Graphics.DrawRectangle(wPen, rect);
                }

            }
            else
            {
                using (SolidBrush bBrush = new SolidBrush(Color.Black))
                {
                    e.Graphics.FillRectangle(bBrush, rect);
                }

            }
            paint = false;
        }
    }
    private void DrawCell(int x, int y) //CHANGED
    {
        this.x = x;
        this.y = y;
        paint = true;
    }
    public void DrawWorld(int refreshRate)
    {
        for(int i = 0; i < this.world.getWorldHeight(); i++)
        {
            for(int j = 0; j <this.world.getWorldWidth(); j++)
            {
                DrawCell(j, i);
            }
        }
    }
}
}

, а мой основной выглядит так:

static void Main()
{
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        World world = new World(20, 20);
        world.createRandomWorld();
        Board board = new Board(world, 10);
        Application.Run(board);
        board.DrawWorld(10);
}

Я хочу получить сетку из черных / белых квадратов, белых с границами.Теперь единственное, что я получаю, это то, что мой код не падает

[Edit] Я добавил OnPaint и немного изменил свой метод DrawCell, и у меня есть кое-что сейчас (оно рисует, даааа), но яполучить только одну ячейку, а не всю сетку.Кроме того, мое решение bool paint похоже на обходной путь, а не на правильный способ сделать это.Во всяком случае, я хотел бы видеть «правильный» рабочий код, потому что я не имею определения / примеры, которые есть в Интернете (страница Microsoft), не показывает мне, как я могу заставить его работать мой путь ^. ^

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Вместо того, чтобы пытаться нарисовать «эту ячейку сейчас», вы должны рисовать все World «по требованию» всякий раз, когда вызывается OnPaint.

Вы можете вызвать перерисовку, вызвав Invalidate() в форме, например, когда что-то в World изменилось. OnPaint также будет вызываться автоматически, например, когда ваша форма отображается впервые или когда она появляется после того, как была скрыта другим окном.

0 голосов
/ 16 апреля 2019

Хорошо, хорошо, поэтому, поняв, что я не могу сделать это «по-своему» (используйте метод, называемый за пределами класса Board, для рисования на форме), я сделал несколько повторных проверок и добавил timer + set OptimizedDoubleBuffer в true. Спасибо всем, кто помог, если кто-то хочет увидеть мой существующий класс Board, он выглядит следующим образом: https://pastebin.com/CP9XRN6r (не хотел занимать место с ненужным кодом), надеюсь, у вас будет отличный день, и мой пост поможет кому-нибудь когда-нибудь ^. ^

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...