Спонсор: Microsoft
Опубликован: 10.04.2009 | Уровень: специалист | Доступ: платный
Самостоятельная работа 6:

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

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

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

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

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

увеличить изображение
Рис. 10.5. Изображения для бокового скроллинга фона

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

using System;
using System.Collections.Generic;
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.Net;
using Microsoft.Xna.Framework.Storage;

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);
        }
    }
}
Листинг 10.5. Код класса Game1

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

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

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

увеличить изображение
Рис. 10.6. Игровой экран проекта P6_4

Задание

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

Alina Lasskaja
Alina Lasskaja

Быть может кто-то из Вас знает игру Sims, к какому жанру она относиться? Жизненная симуляция, ролевая игра, там можно и дома строить.....

Дмитрий Кацман
Дмитрий Кацман
Израиль
Андрей Веденин
Андрей Веденин
Россия, Белгород