| Невозможно пройти тесты, в окне с вопросами пусто |
Спрайтовая анимация
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 изображений, представляющих собой ландшафт, над которым "летит" самолет.

