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

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

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

Примеры к лабораторной работе

Задачи работы

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

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

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

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_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);
        }
    }
}
Листинг 10.1. Трансформации спрайта
Alina Lasskaja
Alina Lasskaja

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

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