Понятие компонента в XNA и его использование

Особенностью XNA Framework, которую нельзя не упомянуть, являются «игровые компоненты»:

§ Microsoft.Xna.Framework.Game Component

§ Microsoft.Xna.Framework.Drawable Game Component.

Смысл компонентов состоит в том, чтобы автоматизировать и стандартизировать вызов обновления (Update), отрисовки (Draw), загрузки контента (Load Content) и инициализации логики (Initia lization) для игровых объектов. Т.е. «облегчить» основной класс игры, внеся логику по работе с каждым объектом внутрь самого объекта и при этом сохранить структуру методов, предлагаемых нам шаблоном XNA. В итоге, просто добавив класс, наследник компонента, в коллекцию компонентов игры один раз, мы можем уже не думать о нем.

Первый компонент призван работать с невидимыми, но постоянно обновляемыми объектами, типа сила и направление ветра или логики искусственного интеллекта (ИИ) компьютерных оппонентов, а второй – для объектов, которые еще должны и выводится на экран, к примеру, счетчик FPS (Frame Per Second) или курсор мыши.

Компьютерная анимация.

Слова «анимация» и «мультипликация» означают одно и то же. На «западный манер» будем использовать первый вариант. Слово animation с английского языка можно перевести как оживление или воодушевление. Когда мы видим обычное рисованное изображение, которое, вдруг начинает двигаться и изменяться, то может действительно показаться, что произошло что-то невероятное, и картинка ожила. Но научное мировоззрение не позволяет нам поверить в это; поэтому обратимся к другому, логичному объяснению.

Если множество похожих изображений (рис. 2) быстро сменять друг за другом, то при определенной скорости смены человек будет воспринимать происходящее как плавное движение (или изменение) объекта на рисунке.


Рис. 2. Ряд изображений, при быстрой смене которых может возникнуть эффект анимации

Оптимальная скорость смены для человека равна 24 изображения (или кадра) в секунду. На самом деле в одном кадре может присутствовать несколько изображений (слоев). Кроме того, может быть всего одно изображение, которое в каждом последующем интервале времени (кадре) будет смещаться на небольшую величину (такую простейшую анимацию можно наблюдать, когда создаются спецэффекты в компьютерной презентации).

Из вышесказанного можно заключить, что создание анимации весьма трудоемкое занятие. Ведь зачастую каждый кадр требуется прорисовывать заново. Естественно, что с появлением современных компьютеров, начали появляться и программы, облегчающие и автоматизирующие труд аниматора. Кроме того, анимация, созданная с помощью компьютеров нашла свое применение не только в создании мультфильмов. Она широко используется в Интернет, презентациях, электронных обучающих курсах и т.д. Обычно служит для целей облегчения восприятия информации, т.к. большинство людей основную долю информации воспринимает с помощью зрения. Однако перебор анимации, ее низкое качество могут ухудшить восприятие, отвлекать и раздражать человека.

Компьютерная анимация создается с помощью специальных программ. Их достаточно много. Условно можно выделить два или три вида ПО для создания анимации:

1. Программы, позволяющие создавать анимацию из готовых изображений (различные gif-аниматоры, например, Microsoft GIF Animator).

2. Программные среды, позволяющие создавать 2D анимацию (например, Adobe Flash CS4, Synfig).

3. Программные среды, позволяющие создавать 3D анимацию (например, Autodesk 3ds Max, Blender).

Существенное облегчение труда аниматора гарантируют лишь среды из пунктов 2. и 3, т.к. в случае gif-аниматоров используется уже готовое множество изображений. В профессиональных же средах компьютерной анимации художнику не обязательно прорисовывать каждый кадр или аниматору его фиксировать, программа сама «вычислит» переход изображения из одного положения в другое. Это называется твинингом (tweening) - процесс генерации промежуточных кадров между двумя рисунками, создающий впечатление, что первый рисунок постепенно превращается во второй. Рассмотрим, как это делается.

Представим временную шкалу (киноленту) как дорожку, состоящую из отдельных кадров. Допустим, что в кадре №1 объект должен находиться слева, а в кадре №100 — справа. Эти два кадра отмечаются как ключевые для данного объекта. В них он располагается в начале и конце движения (рис. 3). Все остальные кадры — промежуточные — не требуют фиксации объекта — изображение в них создаст компьютерная программа. Она сама вычислит, где и в какой момент должен находиться объект. Понятно, что если мы ходим сделать передвижение объекта по кривой, то и ключевых кадров придется сделать больше (или использовать специальные средства, предоставляемые программой, для создания траектории).


Рис. 3. Положение объекта в 1-ом кадре киноленты (слева) и в 100-ом (справа).

Специальные эффекты.

Спецэффект, специальный эффект (англ. specialeffect, сокр. SPFX, SFX или FX) — технологический приём в кинематографе, на телевидении и в компьютерных играх, применяемый для визуализации сцен, которые не могут быть сняты обычным способом или не существуют в действительности (например, для визуализации сцен сражения космических кораблей в далёком будущем).

Спецэффекты также часто применяются, когда естественная съёмка сцены слишком затратна по сравнению со спецэффектом (например, съёмка масштабного взрыва). Спецэффекты применяются и для улучшения или модификации уже предварительно отснятого материала (например, для наложения погодной карты как фон для телеведущего, рассказывающего о прогнозе погоды).

Спецэффекты условно разделяют на две группы — визуальные и механические эффекты. К визуальным относятся оптические эффекты (комбинированные съёмки), а также компьютерная графика. Механические (физические) спецэффекты — это обработка материалов перед съемкой. Сюда относится моделирование, пиротехника и технические приспособления, специальный грим. Существуют также звуковые спецэффекты.

Методы исполнения спецэффектов также применяются при исполнении монтажных переходов между монтажными кадрами, например, распространённый метод вытеснения изображения.

 


ПРАКТИЧЕСКАЯ ЧАСТЬ

В разработанной игре используется компьютерная 2D анимация. Она предназначена для анимации движения персонажей в 4 направлениях, для реализации этого используется 4 графических файла формата .png, содержащих по 4 кадра, для каждого персонажа. Примеры файлов представлены на рисунках 4 и 5.

Рис. 4 Анимация движения вниз для главного героя.

Рис. 5 Анимация движения влево для противника.

Для создания анимации сначала необходимо создать самого персонажа. За все действия, связанные с персонажем отвечает класс Actor. Полный листинг этого класса представлен в Приложении А.

За создание персонажа отвечает конструктор класса. В нем находятся переменные, отвечающие за текстуры, ширину и высоту, направление, количество жизней и скорость персонажей.

public Actor(string textureFolder, ContentManager cont, int countFrames, int hp, int speed, Physics gamePhysics)

{

this.content = cont;

this.DownWalk = cont.Load<Texture2D>(textureFolder + @"/downMove");

this.UpWalk = cont.Load<Texture2D>(textureFolder + @"/upMove");

this.LeftWalk = cont.Load<Texture2D>(textureFolder + @"/leftMove");

this.RightWalk = cont.Load<Texture2D>(textureFolder + @"/rightMove");

 

this.countFrames = countFrames;

Width = DownWalk.Width / countFrames; // Ширина

Height = DownWalk.Height; // Высота

 

Position = Vector2.Zero;

Move = Vector2.Zero;

sourceRect = new Rectangle(0, 0, Width, Height);

this.hp = hp;

this.Speed = speed;

this.gamePhysics = gamePhysics;

// Ни с чем не пересекается

StopMove = Vector4.Zero;

}

За анимацию персонажей отвечает методы heroAnimation(отвечает за перемещение кадров), MoveUp, MoveDown, MoveLeft, MoveRight – отвечают за движение персонажа в 4 направлениях и DrawMotion(отвечает за анимацию персонажа).

public void heroAnimation(float elapsedTime) // Перемещение прямоугольника фрейма

{

elapsed += elapsedTime; // Смотрим на секундомер

if (elapsed >= delay) // Если прошло время

{

if (frame == countFrames - 1)

frame = 0;

else

frame++; // Меняем фрейм

 

elapsed = 0; // Сбрасываем секундомер

}

sourceRect.X = frame * Width; // Перемещаем прямоугольник фрейма

}

 

 

public void MoveUp()

{

Move.Y = -1; // Движение вверх

View.X = 0; // Меняем вид

View.Y = -1;

if (StopMove.Z == 0)

{

StopMove.Y = 0;

Position.Y -= Speed; // Меняем позицию

}

}

public void MoveDown()

{

Move.Y = 1; // Движение вниз

View.X = 0; // Меняем вид

View.Y = 1;

if (StopMove.Y == 0)

{

StopMove.Z = 0;

Position.Y += Speed; // Меняем позицию

}

}

public void MoveLeft()

{

Move.X = -1; // Движение влево

View.X = -1; // Меняем вид

View.Y = 0;

if (StopMove.W == 0)

{

StopMove.X = 0;

Position.X -= Speed; // Меняем позицию

}

}

public void MoveRight()

{

Move.X = 1; // Движение вверх

View.X = 1; // Меняем вид

View.Y = 0;

if (StopMove.X == 0)

{

StopMove.W = 0;

Position.X += Speed; // Меняем позицию

}

}

 

public void DrawMotion(SpriteBatch spriteBatch)

{

float layer = 0.8f + (Position.Y + Height) / 5400;

float scale = 1;

Rectangle zeroRec = new Rectangle(0, 0, Width, Height);

if (Move.Y < 0) // Идет вверх

spriteBatch.Draw(UpWalk, Position, sourceRect, Color.White, 0, Vector2.Zero, scale, SpriteEffects.None, layer);

else if (Move.Y == 0 && View.Y < 0) // Смотрит вверх

spriteBatch.Draw(UpWalk, Position, zeroRec, Color.White, 0, Vector2.Zero, scale, SpriteEffects.None, layer);

 

else if (Move.Y > 0) // Идет вниз

spriteBatch.Draw(DownWalk, Position, sourceRect, Color.White, 0, Vector2.Zero, scale, SpriteEffects.None, layer);

else if ((Move.Y == 0 && View.Y > 0) || (View.X == 0 && View.Y == 0)) // Смотрит вниз

spriteBatch.Draw(DownWalk, Position, zeroRec, Color.White, 0f, Vector2.Zero, scale, SpriteEffects.None, layer);

 

else if (Move.X > 0) // Если движется вправо

spriteBatch.Draw(RightWalk, Position, sourceRect, Color.White, 0, Vector2.Zero, scale, SpriteEffects.None, layer);

else if (Move.X == 0 && View.X > 0) // Смотрит вправо

spriteBatch.Draw(RightWalk, Position, zeroRec, Color.White, 0f, Vector2.Zero, scale, SpriteEffects.None, layer);

 

else if (Move.X < 0) // Если движется влево

spriteBatch.Draw(LeftWalk, Position, sourceRect, Color.White, 0, Vector2.Zero, scale, SpriteEffects.None, layer);

else if (Move.X == 0 && View.X < 0) // Смотрит влево

spriteBatch.Draw(LeftWalk, Position, zeroRec, Color.White, 0f, Vector2.Zero, scale, SpriteEffects.None, layer);

 

foreach (Bullet b in listBullet) // Рисуем пули

{ b.DrawBullet(spriteBatch); }

}

Для создания игрового окна используется класс Game1. Листинг класса представлен в Приложении Б. На рисунке 6 представлено игровое окно.

 


Рис. 6 Запущенная игра.

 


 

ЗАКЛЮЧЕНИЕ

Анимация в играх очень важный элемент без которого не обходится ни одна игра. Она отвечает за передвижение персонажей, взаимодействие их с окружающим миром. Также компьютерная анимация (последовательный показ слайд-шоу из заранее подготовленных графических файлов, а также компьютерная имитация движения с помощью изменения и перерисовки формы объектов или показа последовательных изображений с фазами движения, подготовленных заранее или порождаемых во время анимации) может применяться в мультимедийных приложениях (например, энциклопедиях), а также для «оживления» отдельных элементов оформления, например, веб-страниц и рекламы (анимированные баннеры). На веб-страницах анимация может формироваться средствами стилей (CSS) и скриптов (6-65994.php"> ⇐ Назад

  • 123
  • Далее ⇒