Опубликован: 02.12.2011 | Уровень: специалист | Доступ: платный
Лекция 14:

Создание программы "Лабиринт"

< Лекция 13 || Лекция 14: 123
Аннотация: В лекции рассматривается создание приложения, в котором используются большинство возможностей OpenGL, рассмотренные в предыдущих лекциях.

Цель лекции: Создать приложения на C# и Object Pascal, моделирующие перемещение наблюдателя в лабиринте.

Примеры на C# (WinForms) и Object Pascal (Delphi)

Пример № 13.1 Программа "Лабиринт" (вариант 1). Пример реализует программу, моделирующую перемещение наблюдателя в помещении.

Пример № 13.2 Программа "Лабиринт" (вариант 2). Пример дополняет пример 13.1: выполняется наложение текстур на стены, добавлена вращающаяся сфера с текстурой.

В данной лекции будет рассмотрен пример создания программы, моделирующей перемещение наблюдателя в помещении. На примере этой программы можно увидеть использование большей части тех возможностей библиотеки OpenGL, которые были описаны в предыдущих лекциях.

Создание программы будет выполняться в два этапа. На первом этапе будет создано базовое приложение. В этом приложении будут отображаться стены лабиринта, и выполняться перемещение наблюдателя в лабиринте. На втором этапе в приложение будет добавлена текстура для стен и вращающаяся сфера с текстурой поверхности земли.

Создание базового приложения

Первоначально рассмотрим создание приложения, в котором не будет использоваться освещение и стены будут иметь различный цвет. Для моделирования нахождения наблюдателя в помещении потребуется использовать перспективную проекцию. Параметры перспективной проекции необходимо задать таким образом, чтобы боковые границы области видимости были меньше расстояния до боковых стен. Дальнюю границу области видимости расположим дальше, чем расстояние между самыми удалёнными друг от друга стенами, чтобы наблюдатель всегда мог видеть границу помещения лабиринта (листинги 13.1 и 13.2 ).

private void glControl1_Resize(object sender, EventArgs e)
{
  GL.Viewport(0, 0, glControl1.Width, glControl1.Height);
  GL.MatrixMode(MatrixMode.Projection);
  GL.LoadIdentity();
  GL.Frustum(-0.5, 0.5, -0.5, 0.5, 0.5, 50);
  GL.MatrixMode(MatrixMode.Modelview);
  glControl1.Invalidate();
}
Листинг 13.1. Обработчик события Resize формы для программы Лабиринт на C#
procedure TfrmGL.FormResize(Sender: TObject);
begin
  glViewport(0, 0, ClientWidth, ClientHeight);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity;
  glFrustum(-0.5, 0.5, -0.5, 0.5, 0.5, 50);
  glMatrixMode(GL_MODELVIEW);
  InvalidateRect(Handle, nil, False);
end;
Листинг 13.2. Обработчик события OnResize формы для программы Лабиринт на Object Pascal

Для описания расположения координат стен в программе на C# будет использоваться массив структур типа PointFloat. Тип PointFloat объявлен в программе:

public struct PointFloat
{
  public double X;
  public double Y;
Листинг 13.3. Объявление структуры PointFloat в программе на C#

}

В программе на Object Pascal для описания координат стен используется тип TPointFloat, который объявлен в модуле OpenGL.pas:

Type
  TPointFloat = record
    x, y: Single;
  end;
Листинг 13.4. Объявление типа данных TPointFloat в модуле OpenGL.pas (Object Pascal)

Для определения каждой стены в программе будет использоваться массив структур типа Wall в программе на C# ( пример 13.5) и типа TWall в программе на Object Pascal ( пример 13.6).

public struct Wall 
{
  public int L;
  public int R;
  public Color C;
}
Листинг 13.5. Объявление структуры Wall в программе на C#
type
  TWall = record
    l, r: Integer;
    c: TColor;
  end;
Листинг 13.6. Объявление структуры TWall в программе на Object Pascal

Поля структуры имеют следующие значения:

  • l, r – левая и правая границы стены, которые определяются индексами элементов массива coners;
  • c – цвет стены, который используется при отображении стен в режиме без освещения.

Координаты стен могут быть определены в виде массивов ( пример 13.7 и пример 13.8).

  // координаты углов стен
        PointFloat[] coners = new []{
            new PointFloat{X = -10, Y = -10},
            new PointFloat{X = -10, Y = 10},
            new PointFloat{X =  10, Y = 10},
            new PointFloat{X =  10, Y = -10},
            new PointFloat{X =  3, Y = 10},
            new PointFloat{X =  3, Y = 0}
        };
        // расположение стен в лабиринте
        Wall[] plan = new[]
        {
            new Wall{L = 0, R = 1, C = Color.Red},
            new Wall{L = 1, R = 2, C = Color.Green},
            new Wall{L = 2, R = 3, C = Color.Yellow},
            new Wall{L = 3, R = 0, C = Color.Blue},
            new Wall{L = 4, R = 5, C = Color.Aqua}
        };
Листинг 13.7. Определение массивов coners и plan для хранения данных о расположении стен лабиринта на C#
const
  coners: array [0..5] of TPointFloat = (
        (x:-10; y:-10),
        (x:-10; y: 10),
        (x: 10; y: 10),
        (x: 10; y:-10),
        (x: 0; y:-10),
        (x: 0; y: 0));
  plan: array [0..4] of TWall = (
    (l:0;r:1;c:clRed),(l:1;r:2;c:clGreen),
    (l:2;r:3;c:clYellow),(l:3;r:0;c:clBlue),
    (l:4;r:5;c: clAqua)); 
Листинг 13.8. Определение массивов coners и plan для хранения данных о расположении стен лабиринта на Object Pascal
< Лекция 13 || Лекция 14: 123
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Олег Шумилин
Олег Шумилин
Казахстан
Махмуд Магомедов
Махмуд Магомедов
Россия, Москва, МГТУ "СТАНКИН"