netlib.narod.ru | < Назад | Оглавление | Далее > |
Вы начнете конструирование игры с создания игрового движка, а затем будете работать над игровым процессом. Начнем разработку игры с создания нового проекта Windows Game с именем XNA TPS. В этом новом игровом проекте создайте папки GameBase, GameLogic и Helpers. Эти папки помогут вам по отдельности управлять различными частями игрового кода, как было описано в разделе «Технический проект». Помимо кода, в папку Content, находящуюся внутри проекта XNA TPS, будут добавлены игровые ресурсы.
Большая часть движка игры XNA TPS была создана в главах 9, 10 и 11. Сейчас вы добавите созданные в предыдущих главах классы в пространство имен GameBase проекта XNA TPS.
Вы создали классы Cameras, Lights и Transformation в главе 9. Чтобы добавить эти классы в проект, вам надо сперва создать папки Cameras и Lights внутри папки GameBase. Затем добавьте все классы камер и источников освещения в папки Cameras и Lights соответственно, а класс Transformation поместите в папку GameBase.
Вы создали класс Terrain и его классы эффекта и материала в главе 10. Чтобы добавить эти классы к проекту, вам сначала надо создать папки Shapes, Materials и Effects. Затем добавьте класс Terrain в папку Shapes, класс TerrainEffect в папку Effects и все классы материалов в папку Materials. Вам также надо добавить класс VertexPositionTangentBinormal, используемый классом Terrain, в папку Helpers проекта XNA TPS.
И, наконец, добавим ресурсы ландшафта (карту высот, текстуры и эффекты) в папку Content проекта XNA TPS. Чтобы добавить эти ресурсы в папку Content, вы создадите несколько различных папок: папку Terrain, используемую для хранения карты высот ландшафта; папку Textures для хранения игровых текстур; и папку Effect, используемую для хранения эффектов. После добавления всех ресурсов в их папки не забудьте об изменении свойств карты высот ландшафта, поменяв значение свойства Build Action на None, а свойства Copy to Output Directory на Copy if Newer.
Вы создали обработчик анимированных моделей, библиотеку содержимого, класс времени выполнения и эффект в главе 11. Вместо добавления проектов обработчика содержимого анимированной модели и библиотеки содержимого к решению XNA TPS (которое содержит проект XNA TPS), вы просто добавите ссылки на скомпилированные сборки этих проектов. Для этого в проект XNA TPS добавьте ссылку на библиотеку содержимого анимированной модели, найдя двоичный файл AnimatedModelContentWin (в AnimatedModelContentWin/ bin/x86/ Release/ AnimatedModelContentWin.dll). В папку Content проекта (внутри проекта XNA TPS) добавьте ссылку на обработчик содержимого анимированной модели, найдя двоичный файл AnimatedModelProcessorWin (в AnimatedModelProcessorWin/ bin/x86/ Release/ AnimatedModelProcessorWin.dll). После установки ссылок на библиотеку содержимого и обработчик, добавьте к проекту XNA TPS классы AnimatedModel и AnimatedModelEffect. Поместите класс AnimatedModel в папку Shapes, а класс AnimatedModelEffect в папку Effects.
В конце вам надо добавить ресурсы анимированных моделей (модели, текстуры и эффекты) в папку проекта XNA TPS. В папке Content проекта вам потребуется создать новую папку с именем Models и поместить туда все файлы анимированных моделей. Эффекты анимированных моделей вы должны поместить в папку Effects, а их текстуры в папку Textures. После добавления к проекту всех ресурсов не забудьте сменить обработчик содержимого файлов анимированных моделей на обработчик анимированных моделей.
В игре небо используется для создания фона, охватывающего все объекты сцены и дающего ощущение бескрайнего пространства вокруг игрока. Помимо этого, небо также помогает располагать игрока в сцене, позволяя игроку получать представление о своем окружении. Заметьте, что когда мы говорим об игровом небе, мы говорим обо всем пейзаже, окружающем игрока. Одним из способов создания пейзажа вокруг игрока является рисование различных объектов в сцене, расположенных далеко от игрока. Однако, стоимость рисования таких объектов в реальном времени оказывается высокой. Кроме того, эти модели придется размещать на таком значительном расстоянии, что они не смогут обеспечивать высокий уровень детализации.
Общепринятым способом создания пейзажа у разработчиков игр является конструирование объема, охватывающего всю сцену. Этот объем может быть кубом, называемым небесный куб (sky cube); полусферой, называемой небесный купол (sky dome), или любым другим типом объемного тела. Теперь окружающий игрока пейзаж хранится в текстуре, накладываемой на небесный куб или небесный купол. Чтобы дать ощущение бесконечности горизонта, камера всегда помещается в центр неба, перемещаясь вместе с ним.
В небесном кубе небо создается как куб, состоящий из шести граней, где каждая из граней имеет отдельную текстуру. Создается куб, охватывающий всю сцену, все грани которого обращены внутрь куба; это вызвано тем, что вы будете смотреть на куб изнутри него, а не извне. Конструкция небесного куба показана на рис. 12.2.
Рис. 12.2. Небесный куб
Заметьте, что текстуры используемые в небесном кубе должны продолжать друг друга, иначе игрок легко увидит грани куба. Одним из преимуществ небесного куба является простота его конструкции, для которой достаточно всего 12 треугольников.
В небесном куполе небо создается как полусфера, использующая только одну текстуру, и размещаемая над сценой. Каркасная модель небесного купола показана на рис. 12.3.
Рис. 12.3. Каркасная модель небесного купола
Одним из преимуществ небесного купола является простота анимации его текстур. Например, вы можете использовать для неба две текстуры, применяя первую из них для фона, а другую для рисования второго слоя эффекта, такого как перемещающиеся облака. Одним из недостатков небесного купола является необходимость гораздо более детализированной сетки, чем в небесном кубе.
В нашей игре для рисования пейзажа сцены будет применяться небесный купол. В качестве небесного купола будет использоваться обычная трехмерная модель, заранее созданная в программе моделирования и обработанная конвейером содержимого. Модель неба будет загружена и обработана классом XNA Model. Заметьте, что модель неба можно генерировать динамически, а не загружать.
В этом разделе вы создадите класс для загрузки, обновления и рисования модели неба: класс SkyDome. Вы должны создать класс SkyDome в папке Shapes.
Поскольку небесный купол является объектом XNA Model, вам просто надо использовать диспетчер содержимого для его загрузки. Вот код метода Load класса SkyDome:
public void Load(string modelFileName) { model = Content.Load<Model>(GameAssetsPath.MODELS_PATH + modelFileName); }
Каждый раз, когда обновляется небо, вам необходимо переместить местоположение его центра в позицию камеры, гарантируя, что камера будет оставаться в центре неба. Вы можете также плавно вращать модель неба вокруг оси Y мира, создавая впечатление перемещающегося вокруг игрока горизонта. Вот код метода Update класса SkyDome:
public override void Update(GameTime time) { BaseCamera camera = cameraManager.ActiveCamera; // Центрируем камеру в небесном куполе transformation.Translate = new Vector3(camera.Position.X, 0.0f, camera.Position.Z); // Медленно вращаем небесный купол transformation.Rotate += new Vector3(0, (float)time.ElapsedGameTime.TotalSeconds * 0.5f, 0); base.Update(time); }
У модели небесного купола есть связанный с ней BasicEffect, который можно использовать для рисования. Но перед рисованием модели вам надо сконфигурировать ее эффект. Во-первых, установим текстуру неба, которую вы хотите использовать в модели (это необходимо потому что текстура не экспортируется с моделью неба). Затем установим мировую матрицу модели и матрицы вида и проекции камеры для эффекта. И, в конце, нарисуем модель неба.
Обратите внимание, что перед рисованием модели неба важно отключить буфер глубины; поскольку небо — это самый дальний из рисуемых объектов, нам не надо сохранять его глубину. Кроме того, если нарисовать модель неба с включенным буфером глубины, это может привести к проблемам точности при рисовании удаленных объектов. Вот код методов SetEffectMaterial и Draw, используемых для рисования неба:
private void SetEffectMaterial(BasicEffect basicEffect) { BaseCamera activeCamera = cameraManager.ActiveCamera; // Текстура материала basicEffect.Texture = textureMaterial.Texture; basicEffect.TextureEnabled = true; // Преобразование basicEffect.World = transformation.Matrix; basicEffect.View = activeCamera.View; basicEffect.Projection = activeCamera.Projection; } public override void Draw(GameTime time) { GraphicsDevice.RenderState.DepthBufferEnable = false; foreach (ModelMesh modelMesh in model.Meshes) { // Визуализируем модель с BasicEffect foreach (BasicEffect basicEffect in modelMesh.Effects) SetEffectMaterial(basicEffect); modelMesh.Draw(); } GraphicsDevice.RenderState.DepthBufferEnable = true; base.Draw(time); }
netlib.narod.ru | < Назад | Оглавление | Далее > |