| Невозможно пройти тесты, в окне с вопросами пусто |
Опубликован: 14.08.2012 | Уровень: специалист | Доступ: платный
Самостоятельная работа 20:
Анимация, эффекты
После вышеописанной подготовки всё готово к реализации примера, его код приведен в листинге 27.2
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
namespace P20_2
{
/// <summary>
/// Это главный тип игры
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
//Для вывода двумерных изображений
SpriteBatch spriteBatch;
//Трёхмерная модель
Model model;
//Фон
Texture2D background;
//Кубическая карта окружающей среды
TextureCube cubeMap;
//Показатели, влияющие на наложение карты среды
//Цвет
float amount = 1.0f;
//Коэффициент Френеля
float fresnel = 0.1f;
//Альфа-фактор
float specular = 0.3f;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
// Частота кадра на Windows Phone по умолчанию — 30 кадров в секунду.
TargetElapsedTime = TimeSpan.FromTicks(333333);
// Дополнительный заряд аккумулятора заблокирован.
InactiveSleepTime = TimeSpan.FromSeconds(1);
//Параметры экрана
graphics.PreferredBackBufferWidth = 480;
graphics.PreferredBackBufferHeight = 800;
}
/// <summary>
/// Позволяет игре выполнить инициализацию, необходимую перед запуском.
/// Здесь можно запросить нужные службы и загрузить неграфический
/// контент. Вызов base.Initialize приведет к перебору всех компонентов и
/// их инициализации.
/// </summary>
protected override void Initialize()
{
base.Initialize();
}
/// <summary>
/// LoadContent будет вызываться в игре один раз; здесь загружается
/// весь контент.
/// </summary>
protected override void LoadContent()
{
// Создайте новый SpriteBatch, который можно использовать для отрисовки текстур.
spriteBatch = new SpriteBatch(GraphicsDevice);
//Фон
background = Content.Load<Texture2D>("back");
// Модель
model = Content.Load<Model>("saucer");
//Кубическая карта
cubeMap = Content.Load<TextureCube>("cubemap");
}
/// <summary>
/// UnloadContent будет вызываться в игре один раз; здесь выгружается
/// весь контент.
/// </summary>
protected override void UnloadContent()
{
// ЗАДАЧА: выгрузите здесь весь контент, не относящийся к ContentManager
}
/// <summary>
/// Позволяет игре запускать логику обновления мира,
/// проверки столкновений, получения ввода и воспроизведения звуков.
/// </summary>
/// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
protected override void Update(GameTime gameTime)
{
// Позволяет выйти из игры
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
base.Update(gameTime);
}
/// <summary>
/// Вызывается, когда игра отрисовывается.
/// </summary>
/// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param>
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.Black);
// Вывод фонового изображения
spriteBatch.Begin(0, BlendState.Opaque);
spriteBatch.Draw(background, new Rectangle(0, 0, 480, 800), Color.White);
spriteBatch.End();
//// Вычисление матриц для управления камерой
float time = (float)gameTime.TotalGameTime.TotalSeconds;
Matrix rotation = Matrix.CreateRotationX(time * 0.3f) *
Matrix.CreateRotationY(time);
Matrix view = Matrix.CreateLookAt(new Vector3(4500, -400, 0),
new Vector3(0, -400, 0),
Vector3.Up);
Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4,
GraphicsDevice.Viewport.AspectRatio,
10, 10000);
Matrix[] transforms = new Matrix[model.Bones.Count];
model.CopyAbsoluteBoneTransformsTo(transforms);
//Настройка параметров графического устройства
GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;
//Вывод модели с использованием EnvironmentMapEffect
foreach (ModelMesh mesh in model.Meshes)
{
foreach (EnvironmentMapEffect effect in mesh.Effects)
{
Matrix world = transforms[mesh.ParentBone.Index] * rotation;
//Настройка параметров эффекта
effect.World = world;
effect.View = view;
effect.Projection = projection;
effect.EnvironmentMap = cubeMap;
effect.EnableDefaultLighting();
effect.EnvironmentMapAmount = amount;
effect.FresnelFactor = fresnel * 2;
effect.EnvironmentMapSpecular = new Vector3(1, 1, 0.5f) * specular;
}
mesh.Draw();
}
base.Draw(gameTime);
}
}
}
Листинг
27.2.
Код класса Game1
На рис. 27.7 вы можете видеть игровое окно проекта.
27.3. Выводы
В этой лекции мы рассмотрели приёмы скелетной анимации персонажей, создали кубическую карту окружающей среды и ознакомились с применением EnvironmentMapEffect для создания эффекта зеркального объекта, в котором отражается окружающий мир.
27.4. Задание
Найдите или создайте скелетную трехмерную модель и анимируйте её в зависимости от особенностей модели. Самостоятельно изучите возможности эффектов SkinnedEffect, DualTextureEffect, AlphaTestEffect.
