Невозможно пройти тесты, в окне с вопросами пусто |
Спрайтовая анимация
17.4. Основа игры с боковым скроллингом
В предыдущем примере мы использовали один и тот же спрайт для создания эффекта движения. Возможен и вариант использования различных изображений – их может быть сколько угодно много – для организации вертикального или горизонтального скроллинга. Как правило, с помощью различных фонов для скроллинга организуют ландшафт для платформенных игр, где герой перемещается в горизонтальной плоскости, либо – в простых авиационных симуляторах, где объект, управляемый игроком, "летит" над какой-то местностью.
Создадим фоновые изображения, которые будем использовать. На рис. 17.6 вы можете видеть их.
Создадим новый игровой проект P11_4 на основе P11_3. Класс sprite нового проекта соответствует такому же классу проекта P11_3, а вот в класс Game1 внесены существенные изменения. Код этого класса вы можете найти в листинге 17.5
using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input.Touch; using Microsoft.Xna.Framework.Media; namespace P11_4 { /// <summary> /// Это главный тип игры /// </summary> 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"; graphics.IsFullScreen = true; // Частота кадра на Windows Phone по умолчанию — 30 кадров в секунду. TargetElapsedTime = TimeSpan.FromTicks(333333); // Дополнительный заряд аккумулятора заблокирован. InactiveSleepTime = TimeSpan.FromSeconds(1); } /// <summary> /// Позволяет игре выполнить инициализацию, необходимую перед запуском. /// Здесь можно запросить нужные службы и загрузить неграфический /// контент. Вызов base.Initialize приведет к перебору всех компонентов и /// их инициализации. /// </summary> protected override void Initialize() { //скорость скроллинга - 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(); } /// <summary> /// LoadContent будет вызываться в игре один раз; здесь загружается /// весь контент. /// </summary> protected override void LoadContent() { // Создайте новый SpriteBatch, который можно использовать для отрисовки текстур. 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); } /// <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(); //прокручиваем каждый из спрайтов влево 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); } /// <summary> /// Вызывается, когда игра отрисовывается. /// </summary> /// <param name="gameTime">Предоставляет моментальный снимок значений времени.</param> protected override void Draw(GameTime gameTime) { 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(); base.Draw(gameTime); } } }Листинг 17.5. Код класса Game1
Особенности работы кода отражены в комментариях.
На рис. 17.7 вы можете видеть игровой экран проекта P11_4.
17.5. Выводы
В этой лабораторной работе была рассмотрена методика анимации спрайтов и фонов. Рассмотрены методы трансформации спрайтов, разработаны шаблоны скроллинговых игр.
17.6. Задание
Разработайте собственный вариант скроллингового авиасимулятора. Используйте для анимации фона 5 изображений, представляющих собой ландшафт, над которым "летит" самолет.