Среда, 17 Января 2018, 07:57

Приветствую Вас Гость

Меню сайта
Категории каталога
Создание игр [307]
Статьи об общих понятиях связанных с созданием игр.
Программирование [69]
Гайды по программированию на разных ЯП.
Движки и Гейммейкеры [123]
Статьи о программах для создания игр, уроки и описания.
Софт [27]
Различные программы, в том числе в помощь игроделам.
2D-графика [11]
Уроки по рисованию, растр, пиксель-арт, создание спрайтов и пр.
3D-графика [10]
Уроки по моделированию, ландшафт, модели, текстурирование и пр.
Моддинг игр [4]
Модификация компьютерных игр, создание дополнений, перевод, хакинг.
Игры [70]
Статьи об играх, в том числе и сделанных на гейммейкерах.
Разное [58]
Статьи, которые не вошли в определённые разделы.
Наш опрос
На каких мобильных устройствах вы играете?
Всего ответов: 691
Главная » Статьи » Создание игр

XNA для начинающих: рисование спрайтов, анимация и бег. Часть третья.


Часть 3. Перемещение спрайта в 2D пространстве.

Немного теории:

Вот и подошли мы к заключительной части данной статьи. Здесь я научу Вас, как перемещать персонажей в двухмерном пространстве с помощью координат левого верхнего угла спрайта или прямоугольной области, охватывающей весь спрайт. Так же здесь мы поработаем с некоторыми простыми эффектами в XNA.
Но, для начала, давайте разберемся, чем же различаются «координаты» и «прямоугольник».

Использование координат левого верхнего угла спрайта удобно в тех случаях, когда по нажатию клавиши мыши (или же по какой-нибудь другой команде) нужно передвинуть обычный объект в пространстве. Для примера возмем всем известную детскую игру «Шарик». Вы ездите небольшой платформой внизу экрана, ловите падающий шарик и запускаете его в кирпичики. Цель игры, разбить все кирпичи. Вот один из «интерфейсов» данной игры:



Так вот, для того чтобы передвигать нижнюю платформу вполне сойдет способ задания координат левого верхнего угла. Так здесь не нужно ни делать какие-то эффекты, не просчитывать физику платформы, ничего особенного, короче говоря.

Другое дело прямоугольник. Он позволяет задавать размеры спрайту непосредственно в игре, добавлять эффекты к спрайту, просчитывать различные физические велечины со спрайтом (такие как бег, падение, прыжок и тп.). Конечно, физику можно просчитывать и с помощью первого способа, но с помощью прямоугольника это делать значительно проще и быстрее. Эффекты же можно применять только к прямоугольнику.

Итак, если Вы разобрались, чем же различаются способы задания координат спрайту, тогда приступим к практике!

Перемещение спрайта первым (и самым простым) способом:

Сейчас мы попробуем сделать так, что бы при нажатии на клавишу «влево» (или же любую удобную для Вас клавишу) проигрывалалсь не только анимация бега, но и происходил тот самый бег. Как Вы помните, координаты мы задавали с помощью объекта класса Vector2. Управлять таким объектом очень просто. Достаточно лишь указать имя объекта (у нас это spritePosition) и через точку написать координату. Например, что бы указать координаты 50 (по X) и 100 (по Y) можно писать не только:

Code
spritePosition = new Vector2(50, 100);


Но и:

Code
spritePosition.X = 50;
sprirePosition.Y = 100;


Как я уже и говорил, все координаты у нас указываются в пикселях, т.е. что бы объект двигался, нужно изменять его координа в нужную сторону (X – лево/право, Y – верх/низ) на несколько пикселей.

Например, чтобы сделать эффект бега, мы должны при нажатии на клавишу влево отнимать от нашей X-координаты несколько пикселей (например 5) (если Вам нужно чтобы герой взлетал/падал отнимайте или прибавляет нужные пиксели к коорлинате Y). Давайте попробуем в методе Draw (класса Game1) после строки

Code
runAnimation.DrawAnimation(spriteBatch);


Написать:

Code
runAnimation.spritePosition.X -= 5;


Тем самым мы указали, что пока мы держим нажатой клавишу «влево», не только проигрывается анимация бега, но и наш герой перемещается. Почему «минус X» спросите Вы? Не забывайте, что в компьютерной графике координаты перевернуты, и чтобы герой бежал влево, координату Х нужно каждый раз уменьшать!

Способ дествительно прост, не так ли? Но, есть несколько проблем. Во первых, как Вы заметили, перемещается только спрайт с анимацией. Если отпустить клавишу «влево», то спрайт idle будет стоять на прежнем месте. Это происходит потому, что координаты спрайта анимции и текстуры отдыха задаются отдельно. Что бы это исправить, измените строки:

Code

else
  hero.Draw(spriteBatch);


На этот код:

Code
else
  {
  hero.spritePosition = runAnimation.spritePosition;
  hero.Draw(spriteBatch);
   
  }


Самое главное здесь то, что сначала должны указываться координаты, а лишь потом рисоваться спрайт! Иначе после каждого бега будет видно, как спрайт idle перемещается на нужную позицию.

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

Поэтому, чтобы сделать копию нашей анимации, и повернуть ее вправо, мы будем использовать прямоугольник…

Перемещение спрайта вторым способом. Позиция:

Ну, теперь давайте разберемся, как же нам создать наш прямоугольник. Здесь все тоже довольно не сложно. Кстати, мы его уже создавали в методе DrawAnimation класса Sprites:

Code
Rectangle rectangle = new Rectangle(frameWidth * frame, 0, frameWidth, spriteTexture.Height);


По такому принципу мы и создадим наш прямоугольник. Как Вы помните, первые два параметра – положение левого верхнего угла, а вторые два – размеры прямоугольника. И так, теперь давайте создадим его, чтобы очертить в нем нашего персонажа. Для этого в классе Sprites, заменим строку

Code
public Vector2 spritePosition;


На

Code
public Rectangle rect;


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

Ну, а сейчас продолжим. Изменим строку

Code
spriteBatch.Draw(spriteTexture, spritePosition, Color.White);


На

Code
spriteBatch.Draw(spriteTexture, rect, Color.White);


Эта строка находится в методе Draw, класса Sprites. Как Вы поняли, теперь в роли позиции у нас выступает прямоугольник rect. Вот его как раз мы и указали. Подобным же образом изменим метод DrawAnimation. Изменим строку

Code
spriteBatch.Draw(spriteTexture, spritePosition, rectangle, Color.White);


На

Code
spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White);


Теперь перейдем в класс Game1. В конструкторе изменим строки:

Code
hero.spritePosition = new Vector2(300, 300);
runAnimation.spritePosition = new Vector2(300, 300);


На

Code
hero.rect = new Rectangle(300, 300, 96, 96);
runAnimation.rect = new Rectangle(300, 300, 96, 96);


Как я уже говорил, первые два параметра (300, 300) это позиция, а вторые два (96, 96) это размеры. Здесь у Вас могут быть другие числа, так как размеры текстур у всех разные. У меня это 96х96 пикселей. Но, так же, если Вам нужно отмасштабировать (изменить размер) свои спрайты, то можете указать нужный размер. Тогда спрайты примут его. И так, теперь изменим

Code
if (states.IsKeyDown(Keys.Left))
  {
  runAnimation.DrawAnimation(spriteBatch);
  runAnimation.spritePosition.X -= 5;
  }
  else
  {
  hero.spritePosition = runAnimation.spritePosition;
  hero.Draw(spriteBatch);
   
  }


На

Code
if (states.IsKeyDown(Keys.Left))
  {
  runAnimation.DrawAnimation(spriteBatch);
   
  }
  else
  {
   
  hero.Draw(spriteBatch);
   
  }



Передвижение мы пока задавать не будем. И так, попробуем запустить. Если спрайт имеет необходимые размеры, находится в нужном месте и анимация проигрывается, значит мы все сделали правильно. У меня все выглядит как и прежде.



А при нажатой клавише влево:



Перемещение спрайта вторым способом. Эффект:

Итак, когда у нас все работает с прямоугольником, приступим к эффектам. А именно к эффекту отражения! Ведь, нам нужно отразить наш спрайт так, чтобы он бежал не только влево, но и вправо. Для этого в классе Sprites создадим вспомогательную переменную, которая будет нам показывать, бежит герой вправо или влево. Точнее говоря, это будет не переменная, а параметр метода DrawAnimation(), ведь рисование спрайта (а соответственно и его отражение) происхдит именно в нем. Измените строку:

Code
public void DrawAnimation(SpriteBatch spriteBatch)



На

Code
public void DrawAnimation(SpriteBatch spriteBatch, bool Left)


Если эта переменная примет значение true, значит наш герой бежит влево. Иначе он будет бежать вправо. Теперь давайте в этом же методе создадим условие. Для этого измените код метода на этот:

Code
public void DrawAnimation(SpriteBatch spriteBatch, bool Left)
{
  int frameWidth = spriteTexture.Width / FrameCount;

Rectangle rectangle = new Rectangle(frameWidth * frame, 0, frameWidth, spriteTexture.Height);

if (!Left)
{

}
else
  spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White);

}


Этот код означает, что если Left равно true, то проиграется наша анимация. Если же Left не равное true, тогда выполнитя блок кода if. Сейчас он пуст. Давайте его заполним. Создадим эффект. Для этого добавьте в блок кода if такую строку:

Code
SpriteEffects effect = new SpriteEffects();


Этой строкой кода мы создали простой эффект. Теперь давайте напишем ему определенные свойства. В нашем случае он должен отражать изображение по горизонтали. Для это сразу после только что написанной строки запишем:

Code
effect = SpriteEffects.FlipHorizontally;


Теперь наш эффект буде выполнять необходимую нам операцию. Далее запишем новый вид метода spriteBatch.Draw:

Code
spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White, 0, Vector2.Zero, effect, 0);


Он отличается от предыдущего вида большим количеством параметров. Как Вы знаете, первый параметр это текстура, второй – позиция, третий – прямоугольник для анимации, четвертый – цвет (т.к. нам нужен прозрачный цвет закрашивания, установим Color.White). Далее идут новые параметры. Пятый – это поворот, но он нам не нужен, поэтому установим его в ноль. Шестой – угол поворота. Так как поворот равен нулю, установим и угол в Vector2.Zero. Далее идет наш эффект, а последний - это слой. Он нам тоже не нужен, установим его в ноль.

Считайте, что основную работу мы выполнили. Вот полный код метода DrawAnimation:

Code
public void DrawAnimation(SpriteBatch spriteBatch, bool Left)
{
  int frameWidth = spriteTexture.Width / FrameCount;

Rectangle rectangle = new Rectangle(frameWidth * frame, 0, frameWidth, spriteTexture.Height);

if (!Left)
{
  SpriteEffects effect = new SpriteEffects();
  effect = SpriteEffects.FlipHorizontally;

spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White, 0, Vector2.Zero, effect, 0);

}
else
  spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White);

}


Теперь перейдем в класс Game1 и изменим строки (в методе Draw):

Code
if (states.IsKeyDown(Keys.Left))
{
  runAnimation.DrawAnimation(spriteBatch);
   
}
else
{
   
  hero.Draw(spriteBatch);
   
}


На

Code

if (states.IsKeyDown(Keys.Left))
  {
  runAnimation.DrawAnimation(spriteBatch, true);
   
  }
  else if (states.IsKeyDown(Keys.Right))
  {
  runAnimation.DrawAnimation(spriteBatch, false);
  }
  else
  {

  hero.Draw(spriteBatch);

  }



Как Вы видите, мы добавили условие, при котором будет нажата клавиша «вправо». Если она нажата, то аргумент Left равен false и герой бежит вправо. Запустим игру и проверим. У меня все работает:



Если нажата клавиша «влево»:



Если нажата клавиша «вправо»:



Самое сложное уже позади. Осталось лишь немного поработать над перемещениями.

Перемещение спрайта вторым способом. Перемещение:

Теперь приступим к заключительной части этой статьи. А именно к перемещению спрайта по экрану. Так же мы обработаем столкновение с границами экрана. Т.е., если спрайт дойдет до левого или правого края игрового окна, то он не сможет дальше передвигаться. Для этого мы воспользуемся такой методикой.
Мы создадим новый прямоугольник (назовем его next), который будет находиться впереди нашего прямоугольника. next будет определять, пересекается ли он с границой экрана.

Если нет, тогда мы можем спокойно идти, а если пересекается, т.е. на следующем шаге и наш rect выйдет за границу экрана, значит сделать этат шаг мы не сможем. И так, создадим наш прямоугольник. Для этого в методе Update (класса Sprites), после строки:

Code
TotalTime -= TimeForFrame;
  }


Напишите:

Code
Rectangle next = rect;


Этим мы создали новый прямоугольник и установили его позицию в старый (rect). Это нужно для того, чтобы в будущем его сместить относительно этой позиции.

Теперь давайте сдвинем наш прямоугольник по координате X на на определенное расстояние. Для этого воспользуемся такой формулой: X = X + Vxt.

Т.е. новая позиция нашего прямоугольника будет равна старой позиции, плюс скорость по горизонтали умноженная на время.

Но, не забывайте что прямоугольник можно сдвинуть как влево, так и вправо. Для того чтобы узнать, в какую сторону бежит наш герой (и, соответственно, в какую сторону сдигать прямоугольник), создадим вспомогательную переменную isLeft. Для этого перед конструктором Sprites запишите:

Code
bool isLeft;


И в начале метода DrawAnimation запишите:

Code
isLeft = Left;


Все, теперь переменная isLeft хранит состояние нашего героя, а именно то, в какую сторону он бежит. Теперь добавьте в метод Update (класcа Sprites), после строки

Code
Rectangle next = rect;


код для создания переменной dx (в которой будет храниться значение формулы X = X + Vxt).

Code
int dx = 3 * gameTime.ElapsedGameTime.Milliseconds / 10;


Как Вы поняли из формулы, 3 – это наша скорость, а gameTime.ElapsedGameTime.Milliseconds / 10 – время. Так как значение gameTime.ElapsedGameTime.Milliseconds получается очень большим, мы разделим его на десять.

И так, теперь в тот же метод добавим сроки, которые будут отвечать за смещение нашего прямоугольника. После

Code
int dx = 3 * gameTime.ElapsedGameTime.Milliseconds / 10;


Добавьте:

Code
if (isLeft)
  next.Offset(-dx, 0);
else
  next.Offset(dx, 0);


Этот код означает, что если мы бежим влево, то прямоугольник next находится слева от нашего героя, и проиститывает, можно ли сделать следующий шаг (т.е., не попадет ли наш герой за границу экрана при следующем шаге). А если же мы не бежим влево, значит происходит все тоже самое, только в правую сторону. Помните, что координаты в компьютерной графике перевернуты, и чтобы передвинуть прямоугольник влево, то от координаты X нужно отнимать какое-либо значение. А если вправо – то наоборот, прибавлять.

Теперь давайте обработаем столкновения с границами экрана. Как Вы помните, наше игровое окно имеет размеры 600x600 пикселей. Т.е., можно записать такой код: если левая сторона прямоугольника next не касается координаты X = 0 (т.е. координаты этой стороны больше нуля), и правая сторона прямоугольника next касается координаты Х = 600 (т.е. ее координаты меньше нуля), тогда мы можем передвинуть наш rect на next. Запишем этот код сразу после строки:

Code
if (isLeft)
  next.Offset(-dx, 0);
else
  next.Offset(dx, 0);


Напишите:

Code
if(next.Left > 0 && next.Right < 600)
  rect = next;


Это значит, что если наш игрок находится между координатами 0 и 600 (т.е. на игровом поле), тогда мы можем передвинуть наш rect на позицию next.

И так, мы на «финишной прямой». Собственно, наш персонаж уже может передвигаться, но не может выйти за границы экрана. Но, как можно заметить, передвигается только текстура бега. А текстура отдыха остается на прежней позиции. Давайте это исправим. В начале класса Sprites, после строки:

Code
bool isLeft;


Добавьте строку

Code
bool isRight;


Тем самым мы создали переменную, которая будет отвечать за передвижение вправо. Она нам будет необходима, когда мы будем просчитывать, бежит ли наш персонаж или стоит. Ведь, переменная isLeft может нам «сказать» только, бежит наш персонаж в лево или вправо. Но, пока персонаж бежит, прямоугольник rect движется. Вы можете это проверить, написав в классе Game1, в методе Draw, перед строкой

Code
hero.Draw(spriteBatch);


строку:

Code
hero.rect = runAnimation.rect;


Попробуйте запустить игру. Наш персонаж движется в независимости от того, нажали ли мы какую-либо клавишу, или нет. Это происходит потому, что фактически бег нашего персонажа не заканчивается. Если

Code
isLeft = true;


он бежит влево, если

Code
isLeft = false;


он бежит вправо. Поэтому, чтобы указать, что наш персонаж наконец остановился, мы создадим перемнную isRight. Тогда можно будет сказать, что если

Code
isLeft = false && isRight = false


Значит наш герой стоит.

И после строки

Code
isLeft = Left;


Напишите

Code
isRight = right;


Этим мы добавили новый параметр методу и присвоили значение нашей переменной. Теперь замените условие выбора:

Code
if (!Left)
{
  SpriteEffects effect = new SpriteEffects();
  effect = SpriteEffects.FlipHorizontally;

spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White, 0, Vector2.Zero, effect, 0);

}
else
  spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White);



На это:

Code
if (right)
{
  SpriteEffects effect = new SpriteEffects();
  effect = SpriteEffects.FlipHorizontally;

spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White, 0, Vector2.Zero, effect, 0);

}
  else if(Left)

  spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White);



Теперь перейдем в метод Update (класса Sprites) и заменим строки:

Code
if (isLeft)
  next.Offset(-dx, 0);
else
  next.Offset(dx, 0);


На эти:

Code
if (isLeft)
  next.Offset(-dx, 0);
  else if (isRight)
  next.Offset(dx, 0);

  if (!isLeft && !isRight)
  next.Offset(0, 0);


Осталось лишь перейти в метод Draw (класса Game1) и перед строкой:

Code
hero.Draw(spriteBatch);


Добавить:

Code
runAnimation.DrawAnimation(spriteBatch, false, false);
hero.rect = runAnimation.rect;


Тем самым мы указали, что наш герой не идет ни влево, ни вправо (т.е. остановили движение) и присвоили позицию анимации бега, позиции отдыха героя. Можете запустить проект и посмотреть на результат. У меня все работает как надо. При нажатии клавиши влево герой бежит влево, при нажатии клавиши вправо герой бежит вправо, а если мы ничего не нажимаем, то наш герой стоит.

Вот весь код класса Game1:

Code
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.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;

namespace DrawSprite
{
  /// <summary>
  /// This is the main type for your game
  /// </summary>
  public class Game1 : Microsoft.Xna.Framework.Game
  {
  GraphicsDeviceManager graphics;
  SpriteBatch spriteBatch;

  KeyboardState states;

  Sprites hero;
  Sprites runAnimation;

  public Game1()
  {
  graphics = new GraphicsDeviceManager(this);
  Content.RootDirectory = "Content";
  hero = new Sprites();
  runAnimation = new Sprites(10);

  graphics.PreferredBackBufferHeight = 600; //Ширина экрана
  graphics.PreferredBackBufferWidth = 600; //Высота экрана

  hero.rect = new Rectangle(300, 300, 96, 96);
  runAnimation.rect = new Rectangle(300, 300, 96, 96);
   

   
  }

  /// <summary>
  /// Allows the game to perform any initialization it needs to before starting to run.
  /// This is where it can query for any required services and load any non-graphic
  /// related content. Calling base.Initialize will enumerate through any components
  /// and initialize them as well.
  /// </summary>
  protected override void Initialize()
  {
  // TODO: Add your initialization logic here

  base.Initialize();
  }

  /// <summary>
  /// LoadContent will be called once per game and is the place to load
  /// all of your content.
  /// </summary>
  protected override void LoadContent()
  {
  // Create a new SpriteBatch, which can be used to draw textures.
  spriteBatch = new SpriteBatch(GraphicsDevice);

  hero.LoadContent(Content, "Textures//idle");
  runAnimation.LoadContent(Content, "Textures//run");

  // TODO: use this.Content to load your game content here
  }

  /// <summary>
  /// UnloadContent will be called once per game and is the place to unload
  /// all content.
  /// </summary>
  protected override void UnloadContent()
  {
  // TODO: Unload any non ContentManager content here
  }

  /// <summary>
  /// Allows the game to run logic such as updating the world,
  /// checking for collisions, gathering input, and playing audio.
  /// </summary>
  /// <param name="gameTime">Provides a snapshot of timing values.</param>
  protected override void Update(GameTime gameTime)
  {
  // Allows the game to exit
  if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
  this.Exit();

  states = Keyboard.GetState();

  // TODO: Add your update logic here

  runAnimation.Update(gameTime);

  base.Update(gameTime);
  }

  /// <summary>
  /// This is called when the game should draw itself.
  /// </summary>
  /// <param name="gameTime">Provides a snapshot of timing values.</param>
  protected override void Draw(GameTime gameTime)
  {
  GraphicsDevice.Clear(Color.CornflowerBlue);

  spriteBatch.Begin();
   

  if (states.IsKeyDown(Keys.Left))
  {
  runAnimation.DrawAnimation(spriteBatch, true, false);
   
  }
  else if (states.IsKeyDown(Keys.Right))
  {
  runAnimation.DrawAnimation(spriteBatch, false, true);
  }
  else
  {
  runAnimation.DrawAnimation(spriteBatch, false, false);
  hero.rect = runAnimation.rect;
  hero.Draw(spriteBatch);

   
  }

  spriteBatch.End();

  // TODO: Add your drawing code here

  base.Draw(gameTime);
  }
  }
}


А вот весь код класса Sprites:

Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework;

namespace DrawSprite
{
  class Sprites
  {
  public Texture2D spriteTexture;
   
  public Rectangle rect;
   
   

  int FrameCount; //Количество всех фреймов в изображении (у нас это 10)
  int frame;//какой фрейм нарисован в данный момент
  float TimeForFrame;//Сколько времени нужно показывать один фрейм (скорость)
  double TotalTime;//сколько времени прошло с показа предыдущего фрейма

  bool isLeft;
  bool isRight;
   

  public Sprites()
  {
   
  }

  public Sprites(int speedAnimation)
  {
   
  frame = 0;
  TimeForFrame = (float)1 / speedAnimation;
  TotalTime = 0;
  }

   

  public void Update(GameTime gameTime)
  {

  FrameCount = spriteTexture.Width / spriteTexture.Height;
  TotalTime += gameTime.ElapsedGameTime.TotalSeconds;

  if (TotalTime > TimeForFrame)
  {
  frame++;

  frame = frame % (FrameCount - 1);

  TotalTime -= TimeForFrame;
  }

  Rectangle next = rect;

  int dx = 3 * gameTime.ElapsedGameTime.Milliseconds / 10;

  if (isLeft)
  next.Offset(-dx, 0);
  else if (isRight)
  next.Offset(dx, 0);

  if (!isLeft && !isRight)
  next.Offset(0, 0);
   
  if(next.Left > 0 && next.Right < 600)
  rect = next;

  }

  public void LoadContent(ContentManager Content, String texture)
  {
  spriteTexture = Content.Load<Texture2D>(texture);
   
  }

   

  public void DrawAnimation(SpriteBatch spriteBatch, bool Left, bool right)
  {
  isLeft = Left;
  isRight = right;
   
   

   
  int frameWidth = spriteTexture.Width / FrameCount;

  Rectangle rectangle = new Rectangle(frameWidth * frame, 0, frameWidth, spriteTexture.Height);

  if (right)
  {
  SpriteEffects effect = new SpriteEffects();
  effect = SpriteEffects.FlipHorizontally;

  spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White, 0, Vector2.Zero, effect, 0);

  }
  else if(Left)

  spriteBatch.Draw(spriteTexture, rect, rectangle, Color.White);
   
   
   

  }

  public void Draw(SpriteBatch spriteBatch)
  {
  spriteBatch.Draw(spriteTexture, rect, Color.White);
  }

   

   
  }
}


Послесловие:

Если Вы читаете эту заключительную часть статьи, то хочу поблагодарить Вас за то, что Вы не пожалели своего времени и все же прочитали этот урок. Если у Вас будут какие-то проблемы с рисованием, анимированием или перемещением спрайтов в XNA – обращайтесь. Помогу по мере сил. Надеюсь, что этот урок помог Вам в освоении этой не совсем простой, но очень интересной среды разработки!
Категория: Создание игр | Добавил: Stalker_Shooter (06 Августа 2011) | Автор: Максим
Просмотров: 15539 | Комментарии: 3 | Рейтинг: 4.1/9 |
Теги: 2d, C#, эффекты, Программирование, анимация, Класс, XNA Game Studio, фрейм, перемещения, спрайт
Дополнительные опции:
Также если вы считаете, что данный материал мог быть интересен и полезен кому-то из ваших друзей, то вы бы могли посоветовать его, отправив сообщение на e-mail друга:

Игровые объявления и предложения:
Если вас заинтересовал материал «XNA для начинающих: рисование спрайтов, анимация и бег. Часть третья.», и вы бы хотели прочесть что-то на эту же тему, то вы можете воспользоваться списком схожих материалов ниже. Данный список сформирован автоматически по тематическим меткам раздела. Предлагаются такие схожие материалы: Если вы ведёте свой блог, микроблог, либо участвуете в какой-то популярной социальной сети, то вы можете быстро поделиться данной заметкой со своими друзьями и посетителями.

Всего комментариев: 3
+0-
3 beril   (12 Октября 2013 22:28)
berilКлассная и понятная статья

+3-
1 GameMix   (08 Августа 2011 08:57)
GameMixТы крут! Отличная статья. Пиши ещё статьи! smile

+3-
2 Stalker_Shooter   (08 Августа 2011 09:52)
Stalker_ShooterСпасибо. Как только будет время, обязательно напишу еще happy

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск по сайту
10 случ. движков
  • Nebula
  • InterAx
  • GameSalad
  • eDizzy
  • Xenko
  • Алгоритм
  • Platfinity
  • Construct 2
  • uranEngine
  • Glint 3d
  • Друзья сайта
    Игровой форум GFAQ.ru Перевод консольных игр
    Все права сохранены. GcUp.ru © 2008-2018 Рейтинг