Random pos = new Random(Seed);
Size MazeSize = new Size(Convert.ToInt32(NewForm.eWidth.Value),
Convert.ToInt32(NewForm.eHeight.Value));
Point EnterPoint = new Point(0, pos.Next(MazeSize.Height));
Point ExitPoint =
new Point(MazeSize.Width-1, pos.Next(MazeSize.Height));
Maze = new CMaze(MazeSize.Width, MazeSize.Height, EnterPoint,ExitPoint);
Progress ProgressForm = new Progress();
ProgressForm.Show();
Buffer = new Bitmap(CellSize.Width * MazeSize.Width + 1,
CellSize.Height * MazeSize.Height + 1);
if (!CGenerator.Generate(MazeSize, Maze, Seed,ProgressForm.progressBar))
{
Maze.Dispose();
Maze = null;
}
ProgressForm.Dispose();
Field_Resize(this, null);
RedrawBuffer(false);
Field.Refresh();
}
NewForm.Dispose();
}
Как видно из приведенного кода, мы также задаем размер буфера исходя из размеров создаваемого лабиринта и размера локаций. Также перед генерированием лабиринта мы создаем форму, в которой будет отображаться прогресс генерирования. В качестве числа, используемого при генерировании, мы используем текущее время.
Для ускорения перерисовки лабиринта в главном окне используется буферизация. Т.е. при изменении размеров лабиринта, он прорисовывается полностью в буфере (в этом случае изменяется размер самого буфера), при изменении положения игрока, перерисовывается в буфере только локация, из которой он перешел, и локация, в которую он перешел. Для перерисовки же главного окна, изображение только копируется из буфера. При больших размерах лабиринта это позволяет достичь большой степени ускорения.
Для перерисовки буфера используем следующую функцию:
private void RedrawBuffer(bool OnlyPlayer)
{
if (this != null)
{
Size NewSize = new Size(CellSize.Width * Maze.Size.Width + 1,
CellSize.Height * Maze.Size.Height + 1);
if (NewSize != Buffer.Size)
{
Buffer.Dispose();
Buffer = new Bitmap(NewSize.Width, NewSize.Height);
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.