Опубликован: 14.08.2012 | Доступ: свободный | Студентов: 880 / 20 | Оценка: 5.00 / 5.00 | Длительность: 09:59:00
Специальности: Программист
Самостоятельная работа 11:

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

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

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

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

Изображения для игры с боковым скроллингом

Рис. 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.

Игровой экран проекта P11_4

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

17.5. Выводы

В этой лабораторной работе была рассмотрена методика анимации спрайтов и фонов. Рассмотрены методы трансформации спрайтов, разработаны шаблоны скроллинговых игр.

17.6. Задание

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

Гулич Анна
Гулич Анна
Невозможно пройти тесты, в окне с вопросами пусто