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