Украина, Киев |
Программирование простой игры в DirectX
Добавление к приложению нового класса Obstacle (препятствия)
- В панели Solution Explorer щелкните правой кнопкой мыши на файле Car.cs и через контекстное меню выполните команду Copy
- Щелкните правой кнопкой мыши на узле с именем проекта и выполните команду Paste
- Переименуйте полученную копию файла в файл Obstacle.cs
- Выполните команду меню оболочки Window/Close All Documents, чтобы закрыть все окна редактируемых файлов
- В панели Solution Explorer двойным щелчком на файле Obstacle.cs откройте его на редактирование, переименуйте класс в Obstacle и очистите от лишнего кода
using System; using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Dodger { public class Obstacle { } }Листинг 17.37. Начальный код класса Obstacle
Добавление переменных и констант в класс Obstacle
- Добавьте в класс Obstacle переменные и константы характеристик препятствий, упакованные в секцию #region
using System; using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Dodger { public class Obstacle { #region Секция характеристик препятствий private const int NUMBER_MESH_TYPES = 5; private const float OBJECT_LENGTH = 3.0f; private const float OBJECT_RADIUS = OBJECT_LENGTH / 2.0f; private const int OBJECT_STACKS_SLICES = 18; // Цвета препятствий private static readonly Color[] ObstacleColors = { Color.Red, Color.Blue, Color.Green, Color.Bisque, Color.Cyan, Color.DarkKhaki, Color.OldLace, Color.PowderBlue, Color.DarkTurquoise, Color.Azure, Color.Violet, Color.Tomato, Color.Yellow, Color.Purple, Color.AliceBlue, Color.Honeydew, Color.Crimson, Color.Firebrick }; // Ссылки для Mesh-информации private Mesh obstacleMesh = null; private Material obstacleMaterial; private Vector3 position; private bool isTeapot; #endregion } }Листинг 17.38. Добавление переменных и констант в класс Obstacle
Первая константа NUMBER_MESH_TYPES расчитана на пять примитивных Mesh -объектов (сфера, куб, тор, цилиндр, заварочный чайник - sphere, cube, torus, cylinder, teapot), которые можно сгенерировать классом Mesh. Большинство этих типов будут иметь или параметр длины (константа OBJECT_LENGTH ), или параметр радиуса (константа OBJECT_RADIUS ), которыми можно варьировать для управления размером препятствия. Последняя константа OBJECT_STACKS_SLICES отвечает за дополнительные параметры примитивов (пачки, наборы, сектора, кольца, треугольники и т.д.), которые управляют числом встроенных полигонов. При увеличении значения этой константы растет число используемых полигонов, а следовательно, и качество картинки, но увеличиваются вычислительные затраты.
Далее идет массив цветов для Mesh -объектов, которыми мы будем отображать сгенерированные препятствия. В последней секции этого кода мы заготовили ссылки для адресации препятствий.
Генерация одного препятствия в конструкторе класса
// Параметризованный конструктор public Obstacle(Device device, float x, float y, float z) { // Сохраняем нашу позицию position = new Vector3(x, y, z); // Пока это - не заварочный чайник isTeapot = false; // Создать новое препятствие switch (Utility.Rnd.Next(NUMBER_MESH_TYPES)) { case 0: obstacleMesh = Mesh.Sphere(device, OBJECT_RADIUS, OBJECT_STACKS_SLICES, OBJECT_STACKS_SLICES); break; case 1: obstacleMesh = Mesh.Box(device, OBJECT_LENGTH, OBJECT_LENGTH, OBJECT_LENGTH); break; case 2: obstacleMesh = Mesh.Teapot(device); isTeapot = true; break; case 3: obstacleMesh = Mesh.Cylinder(device, OBJECT_RADIUS, OBJECT_RADIUS, OBJECT_LENGTH, OBJECT_STACKS_SLICES, OBJECT_STACKS_SLICES); break; case 4: obstacleMesh = Mesh.Torus(device, OBJECT_RADIUS / 3.0f, OBJECT_RADIUS / 2.0f, OBJECT_STACKS_SLICES, OBJECT_STACKS_SLICES); break; } // Установить цвет препятствия obstacleMaterial = new Material(); Color objColor = ObstacleColors[Utility.Rnd.Next(ObstacleColors.Length)]; obstacleMaterial.Ambient = objColor; obstacleMaterial.Diffuse = objColor; }Листинг 17.39. Параметризованный конструктор класса Obstacle
Конструктор класса будет срабатывать автоматически всякий раз, когда будет создаваться объект препятствия. При этом тип препятствия и его цвет будут выбраны случайно с использованием функции присоединенного нами ранее файла Utility.cs.