|
Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Создание программы "Лабиринт"
Информация обо всех стенах лабиринта будет храниться в массиве plan, каждый элемент которого описывает расположение и цвет одной из стен лабиринта.
В программе также будут использоваться несколько глобальных переменных и констант ( пример 13.9 и пример 13.10).
Bitmap bmpBrick; Bitmap bmpEarth; double AngleX = 0; double AngleY = 0; double AngleZ = 0; // шаг перемещения наблюдателя в лабиринте const double Step = 0.2; // высота стен лабиринта const double hdl = 5; const double AngleDl = 5; // координаты положения наблюдателя PointFloat Pos;Листинг 13.9. Объявление переменных и констант программы Лабиринт на C#
var // переменные для хранения данных о тектурах texBrick, texEarth: TGLTexture; // направление движения наблюдателя (угол его поворота), // изменяется с помощью клавиш со стрелками влево и вправо AngleY: integer; // координаты положения наблюдателя Pos: TPointFloat; // угол поворота сферы RY: integer; Const AngleDl=5; //угол разворота при нажатии на клавишу Step = 0.2; // шаг перемещения наблюдателя в лабиринте hdl=5; // высота стен лабиринтаЛистинг 13.10. Объявление переменных и констант программы Лабиринт на Object Pascal
Переменная Pos будет использоваться для хранения текущих координат положения наблюдателя в лабиринте, константа Step будет определять изменение положения наблюдателя в направлении перемещения ("длина шага" наблюдателя в лабиринте).
Изображение лабиринта будет формироваться на основе данных массивов points и coners ( пример 13.11 и пример 13.12).
private void glControl1_Paint(object sender, PaintEventArgs e)
{
// очистка буферов цвета и глубины
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
// поворот изображения
GL.LoadIdentity();
GL.Rotate(AngleY, 0.0, 1.0, 0.0);
GL.Translate(Pos.X, 0, Pos.Y);
// стены лабиринта
for (int i = 0; i < plan.Length; ++i)
{
// длина стены
double wdl = Math.Sqrt(Math.Pow(coners[plan[i].L].X - coners[plan[i].R].X, 2)
+ Math.Pow(coners[plan[i].L].Y - coners[plan[i].R].Y, 2)) / 4;
GL.Color4(plan[i].C);
GL.Begin(BeginMode.Quads);
GL.TexCoord2(0, 0); GL.Vertex3(coners[plan[i].L].X, -hdl,
coners[plan[i].L].Y);
GL.TexCoord2(0, hdl / 2); GL.Vertex3(coners[plan[i].L].X, hdl,
coners[plan[i].L].Y);
GL.TexCoord2(wdl, hdl / 2); GL.Vertex3(coners[plan[i].R].X, hdl,
coners[plan[i].R].Y);
GL.TexCoord2(wdl, 0); GL.Vertex3(coners[plan[i].R].X, -hdl,
coners[plan[i].R].Y);
GL.End();
}
GL.Flush();
GL.Finish();
glControl1.SwapBuffers();
}
Листинг
13.11.
Обработчик события Paint компонента GLControl программы Лабиринт на C#
procedure TForm1.FormPaint(Sender: TObject);
var i: integer;
begin
// очистка буфера цвета
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity;
// перемещение наблюдателя
glRotatef(AngleY, 0.0, 1.0, 0.0);
glTranslatef(Pos.X, 0, Pos.Y);
// стены лабиринта
for i:=0 to High(plan) do begin
glBegin(GL_QUADS);
glColor(GetRValue(plan[i].c),GetGValue(plan[i].c),
GetBValue(plan[i].c));
glVertex3f(coner[plan[i].l].x, -hdl, coner[plan[i].l].y);
glVertex3f(coner[plan[i].l].x, hdl, coner[plan[i].l].y);
glVertex3f(coner[plan[i].r].x, hdl, coner[plan[i].r].y);
glVertex3f(coner[plan[i].r].x, -hdl, coner[plan[i].r].y);
glEnd;
end;
glFlush;
glFinish;
SwapBuffers(DC);
end;
Листинг
13.12.
Обработчик события OnPaint формы программы Лабиринт на Object Pascal
Для возможности перемещения наблюдателя в лабиринте в программе будут использоваться клавиши со стрелками. Клавиши со стрелками влево и вправо будут использоваться для поворота наблюдателя в соответствующем направлении, клавиши со стрелками вперед и назад – для перемещения наблюдателя вперед и назад ( пример 13.13 и пример 13.14).
private void glControl1_KeyDown(object sender, KeyEventArgs e)
{
switch(e.KeyCode)
{
case Keys.Left: AngleY += -AngleDl; break;
case Keys.Right: AngleY -= -AngleDl; break;
case Keys.Up:
Pos.X = Pos.X - Step * Math.Sin(AngleY * Math.PI / 180);
Pos.Y = Pos.Y + Step * Math.Cos(AngleY * Math.PI / 180);
break;
case Keys.Down:
Pos.X = Pos.X + Step * Math.Sin(AngleY * Math.PI / 180);
Pos.Y = Pos.Y - Step * Math.Cos(AngleY * Math.PI / 180);
break;
}
if (AngleY>=360) AngleY -= 360;
glControl1.Invalidate();
}
Листинг
13.13.
Обработчик события KeyDown компонента GLControl программы Лабиринт
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_LEFT: inc(AngleY, -AngleDl);
VK_RIGHT: dec(AngleY, -AngleDl);
VK_UP: begin
PosX:=PosX - Step*Sin(AngleY*pi/180);
PosZ:=PosZ + Step*Cos(AngleY*pi/180);
end;
VK_DOWN: begin
PosX:=PosX + Step*Sin(AngleY*pi/180);
PosZ:=PosZ - Step*Cos(AngleY*pi/180);
end;
end;
if AngleY>=360 then dec (AngleY, 360);
InvalidateRect(Handle, nil, False);
end;
Листинг
13.14.
Обработчик события FormKeyDown формы программы Лабиринт на Object Pascal
В результате будет получено приложение, которое рисует замкнутое помещение с одной дополнительной стеной, все стены имеют различный цвет. Программа позволяет наблюдателю перемещаться в этом помещении ( рис. 13.1). В полученном приложении не контролируются границы стен.
