Предыдущая Следующая
Последний блок кода метода DrawModel() задействует механизм языка программирования С# и оператор foreach для цикличного перебора данных массива или, как в нашем случае, коллекции данных. Оператор foreach позаимствован из языка программирования Visual Basic и позволяет циклично извлекать каждый элемент коллекции данных по очереди, помещая извлеченный элемент в очередной объект массива, который вынесен в заголовок этого оператора.
foreach (ModelMesh mesh in m.Meshes)
В результате этот механизм позволяет получить все компоненты мэша, объединить их воедино и сформировать трехмерную модель. Следующая строка кода
foreach (BasicEffect effect in mesh.Effects)
делает ту же самую операцию по извлечению коллекции данных, но уже в отношении шейдерных данных, а точнее вершинного потока, поступающего во входные данные видеоадаптера.
В данном контексте используется простой эффект BasicEffect, который дает возможность работать с шейдерами в автоматическом режиме. В этом случае система сама рассчитывает освещение, материал, нормали, трансформацию и другие виды преобразований в автоматическом режиме. Работать с шейдерами очень сложно, и освещение этой темы выходит за рамки книги, поэтому в программе применяется более простой в использовании класс BasicEffect.
Далее сам метод DrawModel() мы вызываем в методе, отвечающем за рисование графики на экране монитора.
case CurentGameState.GameScreen: {
graphics.GraphicsDevice.RenderState.DepthBufferEnable = true;
DrawModel(model);
break;
}
Здесь, думается, все понятно, за исключением самой верхней строки кода этого блока.
graphics.GraphicsDevice.RenderState.DepthBufferEnable = true;
На самом деле запись этой строки кода сейчас не имеет какой-либо смысловой нагрузки. Эта запись нам понадобится в следующих главах, когда мы добавим на экран вывод спрайтовых изображений.
Дело в том, что использование в программе объектов класса SpriteBatch несколько изменяет настройки видеоадаптера, перестраивая эти настройки под работу с двухмерной графикой. Поэтому очень важно возвращать некоторые настройки назад. В данном случае необходимо вновь включить буфер глубины, который SpriteBatch отключил для работы с двухмерной графикой. В противном случае ваша модель на экране будет представлена с большими визуальными дефектами. Кстати, может понадобиться и больше дополнительных настроек, для одновременной работы с моделями и двухмерной графикой.
Теперь обратитесь к полному исходному коду класса Gamel, который представлен в листинге 18.1. По обыкновению все новшества в коде выделены жирным шрифтом. В следующем разделе мы усовершенствуем работу программы и создадим отдельный класс для работы с трехмерными моделями. Предыдущая Следующая
|