Программирование простой игры в 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.
