Возможно вы искали: 'Civil War General'

May 12 2025 01:24:30
  • Как сделать 8Gamers.Ru домашней страницей?
  • Игры
    • База данных по играх
    • Игровые новости
    • Игровая индустрия
    • Обзоры на игры
    • Прохождения игр
    • Гайды к играм
    • Превью о играх
    • Игровые тизеры
    • Игровые арты
    • Игровые обои
    • Игровые скриншоты
    • Игровые обложки
    • Игровые трейлеры
    • Игровое видео
    • Вышедшие игры
    • Ближайшие релизы игр
  • Кино и ТВ
    • База данных по кино
    • Статьи о кино
    • Постеры
    • Кадры из кино
    • Кино трейлеры
    • Сегодня в кино
    • Скоро в кино
  • Комиксы и манга
    • Манга по алфавиту
    • База данных по комиксах
    • Читать онлайн комиксы
    • Читать онлайн манга
    • База персонажей
  • Читы и коды
    • Чит-коды для PC игр
    • Чит-коды для консольных игр
    • Трейнеры
    • Коды Game Genie
  • Моддинг
    • Модификации
    • Карты к играм
    • Программы для моддинга
    • Статьи о моддинге
  • Геймдев
    • Всё о создании игр
    • Список движков
    • Утилиты в помощь игроделу
    • Конструкторы игр
    • Игровые движки
    • Библиотеки разработки
    • 3D-модели
    • Спрайты и тайлы
    • Музыка и звуки
    • Текстуры и фоны
  • Рецензии
    • Игры
    • Кино
    • Аниме
    • Комиксы
    • Мангу
    • Саундтреки
  • Саундтреки
    • Лирика
  • Файлы
    • Патчи к играм
    • Русификаторы к играм
    • Сохранения к играм
    • Субтитры к кино
  • Медиа
    • Видео
    • Фото
    • Аудио
    • Фан-арты
    • Косплей
    • Фото с виставок
    • Девушки из игр
    • Рисунки
    • Рисуем онлайн
    • Фотохостинг
  • Юмор
    • Анекдоты
    • Афоризмы
    • Истории
    • Стишки и эпиграммы
    • Тосты
    • Цитаты
  • Флеш
    • Азартные
    • Аркады
    • Бродилки
    • Гонки
    • Для девочек
    • Для мальчиков
    • Драки
    • Квесты
    • Леталки
    • Логические
    • Мультфильмы
    • Открытки
    • Приколы
    • Разное
    • Спорт
    • Стратегии
    • Стрелялки
Статистика

Статей: 87772
Просмотров: 96030355
Игры
Injustice:  Gods Among Us
Injustice: Gods Among Us
...
Dark Souls 2
Dark Souls 2
Dark Souls II - вторая часть самой хардкорной ролевой игры 2011-2012 года, с новым героем, сюжето...
Battlefield 4
Battlefield 4
Battlefield 4 - продолжение венценосного мультиплеер-ориентированного шутера от первого ли...
Кино
Steins;Gate
Steins;Gate
Любители японской анимации уже давно поняли ,что аниме сериалы могут дать порой гораздо больше пи...
Ку! Кин-дза-дза
Ку! Кин-дза-дза
Начинающий диджей Толик и всемирно известный виолончелист Владимир Чижов встречают на шумной моск...
Обзоры на игры
• Обзор Ibara [PCB/PS2] 18346
• Обзор The Walking ... 18789
• Обзор DMC: Devil M... 19864
• Обзор на игру Valk... 15867
• Обзор на игру Stars! 17754
• Обзор на Far Cry 3 17935
• Обзор на Resident ... 16012
• Обзор на Chivalry:... 17495
• Обзор на игру Kerb... 17970
• Обзор игры 007: Fr... 16604
Превью о играх
• Превью к игре Comp... 17946
• Превью о игре Mage... 14451
• Превью Incredible ... 14706
• Превью Firefall 13462
• Превью Dead Space 3 16325
• Превью о игре SimC... 14717
• Превью к игре Fuse 15432
• Превью Red Orche... 15532
• Превью Gothic 3 16334
• Превью Black & W... 17345
Главная » Статьи » Всё о XNA » Спрайтовая анимация

Спрайтовая анимация

В этой лабораторной работе мы познакомимся со способами спрайтовой анимации, применимыми в XNA 2.0/3.1

Цель работы
  • Научиться анимировать спрайты
Задачи работы
  • Освоить создание и использование спрайтов для покадровой анимации
  • Освоить трансформацию спрайтов
  • Освоить повороты спрайтов
  • Освоить изменение размеров спрайтов
  • Научиться создавать фон с эффектом скроллинга
  • Создать шаблон игры «Автомобильный симулятор»

Трансформация спрайтов

XNA поддерживает различные операции по трансформации спрайтов при их выводе на экран. Создадим новый игровой проек P6_1 на основе игрового проекта P3_1. Напомню, что в P3_1 мы рассматривали простой пример перемещения спрайта по экрану в соответствии с клавиатурными командами. Метод Draw() объекта класса SpriteBatch имеет 7 перегруженных вариантов. До этого мы пользовались простыми вариантами метода – теперь используем более сложный вариант, который предусматривает использование некоторых дополнительных параметров при выводе спрайта на экран. В листинге 6.1. вы можете видеть код объекта Game1, реализующий различные операции по трансформации спрайта.

Листинг 6.1. Трансформации спрайта
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
 
namespace P6_1
{
 
public class Game1 : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
//Текстура
private Texture2D MySprite;
//Исходная позиция спрайта
private Vector2 position = new Vector2(150, 200);
//Угол поворота спрайта (в радианах)
private float rotation = 0;
//Исходный оттенок спрайта
private Color color = new Color(255, 255, 255);
//Генератор случайных чисел для задания нового цвета
private Random rand = new Random();
//Размер спрайта
private Vector2 scale = new Vector2(1, 1);
//Начало координат спрайта
private Vector2 origin;
//Прямоугольник, ограничивающий спрайт
private Rectangle spRec = new Rectangle(0, 0, 17, 17);
 
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
}
 
protected override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(GraphicsDevice);
MySprite = Content.Load<Texture2D>("ball");
// TODO: use this.Content to load your game content here
}
 
protected override void UnloadContent()
{
}
 
protected override void Update(GameTime gameTime)
{
// Allows the game to exit
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
 
KeyboardState kbState = Keyboard.GetState();
if (kbState.IsKeyDown(Keys.Up))
position.Y -= 1;
if (kbState.IsKeyDown(Keys.Down))
position.Y += 1;
if (kbState.IsKeyDown(Keys.Left))
{
position.X -= 1;
rotation -= 0.1f;
}
if (kbState.IsKeyDown(Keys.Right))
{
position.X += 1;
rotation += 0.1f;
}
if (kbState .IsKeyDown (Keys .A))
{
color = new Color ((byte)rand .Next(0,255), (byte)rand .Next (0,255), (byte)rand .Next (0,255));
}
if (kbState .IsKeyDown (Keys .S ))
{
scale += new Vector2((float)0.2, (float)0.2);
}
if (kbState.IsKeyDown(Keys.W))
{
scale -= new Vector2((float)0.2, (float)0.2);
}
 
origin = (new Vector2 (spRec.Width ,spRec.Height ))/2;
}
 
protected override void Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(MySprite, position, spRec, color, rotation , origin , scale , SpriteEffects.None, (float)0);
spriteBatch.End();
 
// TODO: Add your drawing code here
 
base.Draw(gameTime);
}
}
}

 


Назначение переменных, используемых в программе, указано в листинге. При нажатии на кнопки-стрелки вверх и вниз спрайт перемещается в соответствующем направлении. При нажатии клавиш-стрелок влево и вправо спрайт так же перемещается в соответствующих направлениях, однако, вместе с изменением его координат по оси X модифицируется и переменная rotate, которая задает угол поворота спрайта.

Нажатие на кнопку A приводит к изменению цвета спрайта – новый цвет выбирается случайным образом. Нажатие на кнопку S приводит к уменьшению параметра scale, который отвечает за размер спрайта, выводимого на экран, нажатие на кнопку W приводит к увеличению параметра scale, и, соответственно, к уменьшению размера спрайта.

Параметр origin задает начало координат для спрайта. По умолчанию координата позиции спрайта соответствует его левому верхнему углу. Относительно левого верхнего угла, в таком случае, осуществляется и вращение спрайта. Для того, чтобы вращение происходило вокруг центра спрайта мы записываем в переменную Origin результат от деления длины и ширины спрайта на 2. В итоге спрайт, во-первых, выводится на экран с учетом нового для него начала координат, а во-вторых – при вращении спрайта оно осуществляется вокруг центра спрайта, а не вокруг его левого верхнего угла. Рассмотрим подробнее команду Draw, которую мы использовали для вывода спрайта на экран. В табл. 6.1. описан каждый из её параметров.

Таблица 6.1. Описание параметров команды Draw

Элемент Описание
MySprite Текстура спрайта
position Позиция спрайта
spRec Прямоугольник, ограничивающий спрайт в текстуре, может применяться для вывода различных участков текстуры
color Оттенок спрайта
rotation Угол поворота спрайта
origin Начало координат спрайта, относительно которого осуществляется поворот и вывод спрайта на экран
scale Размер (масштаб) спрайта.
SpriteEffects.None Эффект вывода спрайта – позволяет поворачивать спрайт на 180 градусов или, если установлен параметр None – никак не влияет на положение спрайта
(float)0 Глубина спрайта. Может изменяться от 0 до 1


На рис. 6.1. вы можете видеть игровой экран проекта P6_1.


Рис. 6.1. Экран проекта P6_1

Теперь рассмотрим анимацию спрайтов.

Анимация спрайтов

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

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


Рис. 6.2. Заготовка для анимации

Создадим стандартный игровой проект, назовем его P6_2. В листинге 6.2. приведен код класса Game1. В этом проекте мы обошлись без создания дополнительных игровых компонентов, реализовав всю необходимую функциональность в основном игровом классе.

Листинг 6.2. Код класса Game1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
 
namespace P6_2
{
    /// 
    /// This is the main type for your game
    /// 
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D texture;
        //Количество кадров в изображении
        const int frames = 2;
        //Частота анимации - кадров в секунду
        const int framesPerSec =10;
        //Текущий кадр для вывода на экран
        int numberOfFrame=0;
        //Время, в течение которого отображается один кадр
        float timePerFrame;
        //Время, которое прошло с начала отображения текущего кадра
        float totalElapsed;
        //Позиция вывода спрайта
        Vector2 position;
        //Прямоугольник для задания позиции кадра в изображении
        Rectangle sprRec;
        //Ширина кадра
        int widthFrame = 64;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
        protected override void Initialize()
        {
            position = new Vector2(100, 100);
            //Время для одного кадра вычисляется как результат деления 1 секунды
            //на заданное количество кадров в секунду
            timePerFrame = (float)1 / framesPerSec;
            sprRec = new Rectangle(0, 0, 64, 64);
 
            base.Initialize();
        }
 
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            texture = Content.Load<Texture2D>("animation");
 
            // TODO: use this.Content to load your game content here
        }
 
        protected override void UnloadContent()
        {
            // TODO: Unload any non ContentManager content here
        }
        //Эта процедура используется для анимации спрайта
        //Она принимает количество секунд, прошедших с предыдущего вызова
        //процедуры Update
        void ChangeFrame(float elpT)
        {
            //Увеличим общее время отображения спрайта на
            //время, прошедшее с последнего вызова процедуры
            totalElapsed += elpT;
            //если общее время отображения спрайта больше времени,
            //выделенного на один спрайт
                if (totalElapsed > timePerFrame)
                {
                    //Если номер кадра равен количеству кадров-1
                    if (numberOfFrame == frames-1)
                    {
                        //установим номер кадра в 0
                        numberOfFrame = 0;
                    }
                        //иначе увеличим номер кадра на 1
                    else numberOfFrame++;
                    //создадим новый прямоугольник
                    //Его координата X соответствует координате левого верхнего угла
                    //кадра, Y равно 0, длина и ширина всегда равны 64
                    sprRec = new Rectangle((int)widthFrame * numberOfFrame, 0, 64, 64);
                    //сбросим totalElapsed в 0
                    totalElapsed = 0;
                }
 
        }
 
        protected override void Update(GameTime gameTime)
        {
            //Вызов процедуры анимации спрайта
            //в качестве параметра передается время,прошедшее после
            //последнего вызова Update
            ChangeFrame((float)gameTime.ElapsedGameTime.TotalSeconds);
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
            spriteBatch.Draw(texture, position, sprRec, Color.White);
            spriteBatch.End();
            base.Draw(gameTime);
        }
    }
}

 


Если кратко описать последовательность работы этого проекта, получится следующее: в цикле Update() мы вызываем процедуру ChangeFrame(), которой передаем время, прошедшее после последнего вызова Update(). Внутри этой процедуры мы проверяем, достаточно ли времени текущий кадр отображался на экране, и если его время вышло – меняем на следующий.
Можно заметить, что здесь мы анимировали спрайт, который состоит лишь из двух кадров. Для того, чтобы анимировать спрайт, состоящий из большего количества кадров, достаточно модифицировать соответствующие параметры вышеприведенного кода.
Для применения подобного приема на практике лучше всего включить код анимации спрайтов в код игровых компонентов.
Рассмотрим анимацию фона, в частности – создание фона со скроллингом.

Основа симулятора автогонок

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

Разработаем текстуру, подходящую для фона. В нашем случае это будет полотно дороги, которая и нужна нам для имитации движения. На рис. 6.3. вы можете видеть соответствующее изображение. Мы создали изображение размером 400х600 пикселей – оно будет символизировать дорогу, и соответствующим образом «разметили» его.


Рис. 6.3. Заготовка для скроллингового фона

Идея скроллига фона заключается в следующем. Мы будем использовать два игровых объекта, символизирующих фон. Каждый из них в отдельности может выводить спрайт, изображенный на рис. 6.3. Выведем на экран первый объект и будем смещать с необходимой скоростью сверху вниз. Вслед за первым объектом будем смещать сверху вниз второй объект – таким образом мы получим иллюзию «бегущей» дороги, и неподвижный объект автомобиля, расположенный на этой дороге, будет «двигаться» по ней снизу вверх. Причем, если наделить этот объект возможностью перемещаться – при его перемещении вверх будет создаваться иллюзия ускорения, при перемещении вниз – торможения.

Создадим новый игровой проект, P6_3. Возьмем за основу проект P2_2 – управление спрайтами будет вестись из основной программы, а данные спрайтов будут храниться в отдельных объектах – класс для их хранения будет носить имя sprite.
В листинге 6.3. приведен код класса sprite – он хранит данные спрайта.

Листинг 6.3. Код класса sprite
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework;
 
namespace P6_3
{
    class sprite
    {
        public Texture2D spTexture;
        public Vector2 spPosition;
 
        public sprite(Texture2D newSpTexture, Vector2 newSpPosition)
        {
            spTexture = newSpTexture;
            spPosition = newSpPosition;
        }
    }
}

 


В листинге 6.4. приведен код класса Game1, реализующий функциональность по скроллингу фона.

Листинг 6.4. Код класса Game1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
 
namespace P6_3
{
 
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        //объекты для создания скроллингового фона
        sprite road1;
        sprite road2;
        //скорость скроллинга
        Vector2 scrolSpeed;
        //позиции, на которые устанавливаются обе "дороги"
        //в момент начала игры и каждый раз, когда они
        //сдвинутся на определенное расстояние
        Vector2 road1Start;
        Vector2 road2Start;
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
 
        protected override void Initialize()
        {
            //скорость скроллинга - 5 пикселей по оси Y за один
            //проход цикла Update
            scrolSpeed = new Vector2(0, 5f);
            //первая "дорога" будет изначально установлена в позиции 0,0
            //вторая дорога - за пределами игрового экрана - в позиции 0,-600
            road1Start = new Vector2(0, 0);
            road2Start = new Vector2(0, -600);
            base.Initialize();
        }
 
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            //создаем игровые объекты
            road1  = new sprite(Content.Load<Texture2D>("road"), road1Start );
            road2 = new sprite(Content.Load<Texture2D>("road"), road2Start );
 
 
        }
 
 
        protected override void UnloadContent()
        {
            road1.spTexture.Dispose();
            road2.spTexture.Dispose();
            spriteBatch.Dispose();
 
        }
 
        protected override void Update(GameTime gameTime)
        {
 
            //если первая "дорога" не спустилась ниже, чем координата 0,600
            //то есть все еще видна на экране
            //тогда переместить обе "дороги" на дистанцию, задаваемую
            //в scrolSpeed
            if (road1.spPosition.Y < 600)
            {
                road1.spPosition += scrolSpeed;
                road2.spPosition += scrolSpeed;
            }
            else
            {
                //если первая дорога ушла за пределы видимости
                //это означает что вторая полностью выведена на экран
                //вычислим новую позицию для установки объектов
                //для того, чтобы не было скачков при установке 
                //предварительно вычислим новую позицию
                road1Start.Y = road1.spPosition.Y - 600;
                road2Start.Y = road2.spPosition.Y - 600;
                road1.spPosition = road1Start;
                road2.spPosition = road2Start;
            }
 
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
 
            spriteBatch.Begin();
            //выведем первый и второй спрайт на экран
            spriteBatch.Draw(road1.spTexture, road1.spPosition, Color.White);
            spriteBatch.Draw(road2.spTexture, road2.spPosition, Color.White);
            spriteBatch.End();
            // TODO: Add your drawing code here
 
            base.Draw(gameTime);
        }
    }
}

 


На рис. 6.4. вы можете видеть окно проекта P6_3.


Рис. 6.4. Окно проекта P6_3

Теперь рассмотрим горизонтальный скроллинг фона, использующий различные спрайты для создания эффекта ландшафта.

Основа игры с боковым скроллингом

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

Создадим фоновые изображения, которые будем использовать. На рис. 6.5. вы можете видеть их.


Рис. 6.5. Изображения для бокового скроллинга фона

Создадим новый игровой проект P6_4 на основе P6_3. Класс sprite нового проекта соответствует такому же классу проекта P6_3, а вот в класс Game1 внесены существенные изменения. Код этого класса вы можете найти в листинге 6.5.

Листинг 6.5. Код класса Game1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
 
namespace P6_4
{
 
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        //объекты для создания скроллингового фона
        sprite back1, back2, back3, back4;
        //скорость скроллинга
        Vector2 scrolSpeed;
        //позиции, на которые устанавливаются объекты
        Vector2 back1Start, back2Start, back3Start, back4Start;
 
 
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
        }
 
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            //скорость скроллинга - 5 пикселей по оси X за один
            //проход цикла Update
            scrolSpeed = new Vector2(-5f, 0);
            back1Start = new Vector2(0, 0);
            back2Start  = new Vector2(800, 0);
            back3Start = new Vector2(1600, 0);
            back4Start = new Vector2(2400, 0);
            base.Initialize();
        }
 
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
            //создаем игровые объекты
            back1  = new sprite(Content.Load<Texture2D>("b1"), back1Start);
            back2 = new sprite(Content.Load<Texture2D>("b2"), back2Start);
            back3 = new sprite(Content.Load<Texture2D>("b3"), back3Start);
            back4 = new sprite(Content.Load<Texture2D>("b4"), back4Start);
            // TODO: use this.Content to load your game content here
        }
 
        protected override void UnloadContent()
        {
 
            // TODO: Unload any non ContentManager content here
        }
 
        protected override void Update(GameTime gameTime)
        {
 
                //прокручиваем каждый из спрайтов влево
 
                back1.spPosition += scrolSpeed;
                back2.spPosition += scrolSpeed;
                back3.spPosition += scrolSpeed;
                back4.spPosition += scrolSpeed;
 
            //Если координата Х одного из спрайтов меньше
            //чем -800 - то есть этот спрайт уже "ушел" влево
            //и исчез за пределами экрана - перенести этот спрайт
            //в позицию, которую занимает четвертый спрайт, то есть - 
            //в крайнюю правую позицию.
            //Таким образом после первого прохода всех спрайтов
            //первый спрайт будет следовать за четвертым, второй за первым и т.д.
 
                if (back1.spPosition.X < -800)
                {
                    float f = back1.spPosition.X + 800;
                    back1.spPosition.X  = back4Start.X +f;
                }
                if (back2.spPosition.X < -800)
                {
                    float f = back2.spPosition.X + 800;
                    back2.spPosition.X = back4Start.X + f;
                }
                if (back3.spPosition.X < -800)
                {
                    float f = back3.spPosition.X + 800;
                    back3.spPosition.X = back4Start.X + f;
                } 
                if (back4.spPosition.X < -800)
                {
                    float f = back4.spPosition.X + 800;
                    back4.spPosition.X = back4Start.X + f;
                }
 
            base.Update(gameTime);
        }
 
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
 
            spriteBatch.Begin();
            //выведем спрайты на экран
            spriteBatch.Draw(back1.spTexture, back1.spPosition, Color.White);
            spriteBatch.Draw(back2.spTexture, back2.spPosition, Color.White);
            spriteBatch.Draw(back3.spTexture, back3.spPosition, Color.White);
            spriteBatch.Draw(back4.spTexture, back4.spPosition, Color.White);
            spriteBatch.End();
            // TODO: Add your drawing code here
 
            base.Draw(gameTime);
        }
    }
}

 


Особенности работы кода отражены в комментариях.

На рис. 6.6. вы можете видеть игровой экран проекта P6_4.


Рис. 6.4. Игровой экран проекта P6_4

Вопросы

1) Анимация двумерных спрайтов в XNA Game Studio 2.0. может быть реализована следующим образом:
  • a. Анимация – встроенная возможность XNA, никаких дополнительных действий кроме подготовки подходящего спрайта, не требуется
  • b. Для анимации спрайта нужно создать механизм, который будет выводить кадры анимации с заданной частотой
  • c. В XNA невозможно реализовать анимацию двумерных спрайтов
2) Для создания иллюзии перемещения объекта можно настроить вертикальный скроллинг фона. Для того, чтобы создавалась иллюзия перемещения объекта снизу вверх, фон нужно перемещать в следующем направлении?
  • a. Сверху вниз (в строну возрастания координаты Y)
  • b. Снизу вверх (в сторону убывания координаты Y)
  • c. Справа налево (в сторону убывания координаты X)
  • d. Слева направо (в сторону возрастания координаты X)
3) Для создания иллюзии перемещения объекта в горизонтальной плоскости можно настроить горизонтальный скроллинг фона. Для того, чтобы создавалась иллюзия перемещения объекта слева направо, в каком направлении нужно перемещать фон?
  • a. Сверху вниз (в строну возрастания координаты Y)
  • b. Снизу вверх (в сторону убывания координаты Y)
  • c. Справа налево (в сторону убывания координаты X)
  • d. Слева направо (в сторону возрастания координаты X)
4) Верно ли, что описанным способом можно организовать вертикальный скроллинг фона: «Нужно как минимум два графических объекта. Их нужно синхронно сдвигать в направлении возрастания координаты Y. При уходе первого объекта за пределы видимости, его нужно переместить в исходную позицию второго объекта»
  • a. Да
  • b. Нет
5) Переменная position типа Vector2 содержит координаты точки привязки начала координат объекта. К ней прибавляют другую переменную - speed типа Vector2, которая содержит информацию о скорости перемещения. Если переменная speed была создана с такими параметрами: speed = new Vector2(-5f, 0), в какую сторону будет перемещаться фон?
  • a. Слева направо
  • b. Справа налево
  • c. Сверху вниз
  • d. Снизу вверх
  • e. По диагонали от левого нижнего угла к правому верхнему
  • f. По диагонали от правого верхнего угла к левому нижнему
  • g. По диагонали от левого верхнего угла к правому нижнему
  • h. По диагонали от правого нижнего угла к левому верхнему
6) Переменная position типа Vector2 содержит координаты точки привязки начала координат объекта. К ней прибавляют другую переменную - speed типа Vector2, которая содержит информацию о скорости перемещения. Если переменная speed была создана с такими параметрами: speed = new Vector2(5f, 0), в какую сторону будет перемещаться фон?
  • a. Слева направо
  • b. Справа налево
  • c. Сверху вниз
  • d. Снизу вверх
  • e. По диагонали от левого нижнего угла к правому верхнему
  • f. По диагонали от правого верхнего угла к левому нижнему
  • g. По диагонали от левого верхнего угла к правому нижнему
  • h. По диагонали от правого нижнего угла к левому верхнему
7) Переменная position типа Vector2 содержит координаты точки привязки начала координат объекта. К ней прибавляют другую переменную - speed типа Vector2, которая содержит информацию о скорости перемещения. Если переменная speed была создана с такими параметрами: speed = new Vector2(0, 5f), в какую сторону будет перемещаться фон?
  • a. Слева направо
  • b. Справа налево
  • c. Сверху вниз
  • d. Снизу вверх
  • e. По диагонали от левого нижнего угла к правому верхнему
  • f. По диагонали от правого верхнего угла к левому нижнему
  • g. По диагонали от левого верхнего угла к правому нижнему
  • h. По диагонали от правого нижнего угла к левому верхнему
8) Переменная position типа Vector2 содержит координаты точки привязки начала координат объекта. К ней прибавляют другую переменную - speed типа Vector2, которая содержит информацию о скорости перемещения. Если переменная speed была создана с такими параметрами: speed = new Vector2(-5f, 5f), в какую сторону будет перемещаться фон?
  • a. Слева направо
  • b. Справа налево
  • c. Сверху вниз
  • d. Снизу вверх
  • e. По диагонали от левого нижнего угла к правому верхнему
  • f. По диагонали от правого верхнего угла к левому нижнему
  • g. По диагонали от левого верхнего угла к правому нижнему
  • h. По диагонали от правого нижнего угла к левому верхнему
9) Переменная position типа Vector2 содержит координаты точки привязки начала координат объекта. К ней прибавляют другую переменную - speed типа Vector2, которая содержит информацию о скорости перемещения. Если переменная speed была создана с такими параметрами: speed = new Vector2(5f, -5f), в какую сторону будет перемещаться фон?
  • a. Слева направо
  • b. Справа налево
  • c. Сверху вниз
  • d. Снизу вверх
  • e. По диагонали от левого нижнего угла к правому верхнему
  • f. По диагонали от правого верхнего угла к левому нижнему
  • g. По диагонали от левого верхнего угла к правому нижнему
  • h. По диагонали от правого нижнего угла к левому верхнему
Задание

Разработайте собственный вариант скроллингового авиасимулятора. Используйте для анимации фона 5 изображений, представляющих собой ландшафт, над которым «летит» самолет.

2832 Прочтений •  [Спрайтовая анимация] [08.08.2012] [Комментариев: 0]
Добавил: Ukraine Vova
Ссылки
HTML: 
[BB Url]: 
Похожие статьи
Название Добавил Добавлено
• Спрайтовая анимация Ukraine Vova 08.08.2012
Ни одного комментария? Будешь первым :).
Пожалуйста, авторизуйтесь для добавления комментария.

Проект входит в сеть сайтов «8Gamers Network»

Все права сохранены. 8Gamers.NET © 2011 - 2025

Статьи
Рецензия на Pressure
Рецензия на Pressure
Чтобы обратить на себя внимание, начинающие маленькие разработчики, как правило, уходят в жанры, ...
Рецензия на Lost Chronicles of Zerzura
Рецензия на Lost Chron...
Игры, сделанные без любви и старания, похожи на воздушный шар – оболочка есть, а внутри пусто. Lo...
Рецензия на The Bridge
Рецензия на The Bridge
«Верх» и «низ» в The Bridge — понятия относительные. Прогуливаясь под аркой, можно запросто перей...
Рецензия на SimCity
Рецензия на SimCity
Когда месяц назад состоялся релиз SimCity, по Сети прокатилось цунами народного гнева – глупые ош...
Рецензия на Strategy & Tactics: World War 2
Рецензия на Strategy &...
Название Strategy & Tactics: World War II вряд ли кому-то знакомо. Зато одного взгляда на ее скри...
Рецензия на игру Scribblenauts Unlimited
Рецензия на игру Scrib...
По сложившейся традиции в информационной карточке игры мы приводим в пример несколько похожих игр...
Рецензия на игру Walking Dead: Survival Instinct, The
Рецензия на игру Walki...
Зомби и продукция-по-лицензии — которые и сами по себе не лучшие представители игровой биосферы —...
Обратная связь | RSS | Донейт | Статистика | Команда | Техническая поддержка