Проблемы при рисовании в мой ClientRectangle с использованием GDI + & C # - PullRequest
0 голосов
/ 11 ноября 2009

Я работаю над пониманием обнаружения столкновений и решил создать программу, имитирующую Пакмана. Проще говоря, когда Пакман сталкивается с Призраком, он умирает.

Я указываю, сколько Pacmen мне нужно, и в моем MainForm_Paint (вызываемом, когда мой элемент управления требует рисования) я создаю массив указанного количества созданного мною класса с именем Pacman. Затем я продолжаю конструировать каждого Pacman в массиве с указанными параметрами.

Когда все сказано и сделано, я продолжаю просто пытаться нарисовать все Pacmen, находясь в цикле. Только один нарисован внутри ClientRectangle независимо от того, сколько я указываю рисовать. Когда я раскрываю свой ClientRectangle, я вижу маленькие линии или что-то вроде осколка Pacman. Я проверил, чтобы убедиться, что стартовые позиции находятся в системе ClientRectangles x, y, и они есть. Я просто озадачен тем, почему они не рисуют внутри ClientRectangle, хотя. :( Любая помощь будет высоко ценится.

Вот то, что я кодировал для MainForm_Paint

private void MainForm_Paint(object sender, PaintEventArgs e)
    {
        Graphics g = e.Graphics;           
        Rectangle rect = this.ClientRectangle;
        Pacman[] pacmen = new Pacman[parameters[0]];            
        int whichPacman = 0;  

        for (int i = 0; i < parameters[0]; i++)
        {
            pacmen[i] = new Pacman(rect, parameters[1]);                
        }

        while (play)
        {
            pacmen[whichPacman].PacmanDraw(g, rect);
            // Must reset whichPac if whichPac + 1 == parameters[0]
            // Break out while testing
            if ((whichPacman + 1) == parameters[0])
            {
                break;
            }
            else
            {
                whichPacman++;
            }
        }
    }

Вот что я кодировал для своего класса Pacman:

    public Pacman(Rectangle rect, int radius)
    {
        Random rand = new Random();                    
        this.xpos = rand.Next(rect.Left, rect.Left + rect.Width);
        this.ypos = rand.Next(rect.Top, rect.Top + rect.Height);
        this.radius = radius;            
    }

    public void PacmanDraw(Graphics g, Rectangle rect)
    {                         
        GraphicsPath path = new GraphicsPath();          
        path.AddArc(this.xpos, this.ypos, (float) this.radius * 2, (float) this.radius * 2, 0, 360);            
        path.CloseFigure();
        g.FillPath(new SolidBrush(Color.AliceBlue), path);
        path.Dispose();
    }

Спасибо за вашу помощь и извините, если это нецелевое использование SOF.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2009

Вы создаете новое начальное число для генератора случайных чисел каждый раз, когда вызываете конструктор Pacman. Когда вы делаете это в узком кругу, все Pacmen окажутся в одном месте. Это потому, что Random использует дату / время как часть своего начального числа.

Генерация случайного числа начинается с начального значения. Если одно и то же начальное число используется повторно, генерируется одна и та же серия чисел. Один из способов получения разных последовательностей - сделать начальное значение зависимым от времени, создавая тем самым разные серии с каждым новым экземпляром Random. По умолчанию конструктор без параметров класса Random использует системные часы для генерации своего начального значения, в то время как его параметризованный конструктор может принимать значение Int32 на основе количества тактов в текущем времени. Однако поскольку часы имеют конечное разрешение, использование конструктора без параметров для создания различных случайных объектов в тесной последовательности создает генераторы случайных чисел, которые генерируют идентичные последовательности случайных чисел. В следующем примере показано, что два случайных объекта, которые создаются в тесной последовательности, генерируют идентичные серии случайных чисел.

Создать генератор случайных чисел вне цикла и передать его в конструктор.

0 голосов
/ 11 ноября 2009

Вам необходимо учитывать тот факт, что вы указываете верхний левый объекта; Ваши xpos и ypos могут достигать максимума width - object width, чтобы он был полностью виден.

this.xpos = rand.Next(rect.Left, rect.Left + rect.Width - radius * 2.0);
this.ypos = rand.Next(rect.Top, rect.Top + rect.Height - radius * 2.0);
...