| Sims - какой жанр |
Спрайтовая анимация
Основа игры с боковым скроллингом
В предыдущем примере мы использовали один и тот же спрайт для создания эффекта движения. Возможен и вариант использования различных изображений – их может быть сколько угодно много – для организации вертикального или горизонтального скроллинга. Как правило, с помощью различных фонов для скроллинга организуют ландшафт для платформенных игр, где герой перемещается в горизонтальной плоскости, либо – в простых авиационных симуляторах, где объект, управляемый игроком, "летит" над какой-то местностью.
Создадим фоновые изображения, которые будем использовать. На рис. 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.
Задание
Разработайте собственный вариант скроллингового авиасимулятора. Используйте для анимации фона 5 изображений, представляющих собой ландшафт, над которым "летит" самолет.

