Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 17:

Программирование простой игры в 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 -объектов, которыми мы будем отображать сгенерированные препятствия. В последней секции этого кода мы заготовили ссылки для адресации препятствий.

Генерация одного препятствия в конструкторе класса

  • Добавьте в класс Obstacle следующий параметризованный конструктор
// Параметризованный конструктор
        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.

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000