2015-09-14 3 views
0

Я хотел бы, чтобы перевернуть характер, когда он ходит влево \ право, я создал персонаж из различных частей тела, поэтому листать каждый из них это вызвано: enter image description hereлистать характер

причина, конечно, потому, что он перевернул тело части в их собственной позиции, но не все игроки вместе.

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

if(mLeavusSprite.isflipped==0) 
     spriteBatch.Draw(character, rec,rec, Color.White,0,Vector2.Zero,SpriteEffects.None,0); 
     else 
      spriteBatch.Draw(character, rec, rec, Color.White, 0, Vector2.Zero, SpriteEffects.FlipHorizontally, 0); 

character = визуализировать цель, на которую был нарисован игрок.

Есть ли что-нибудь, что я могу сделать? переворачивание вручную будет серьезной болью, мне нужно будет вручную перемещать более 10 анимаций с 4 кадрами каждый раз!

редактировать: Вот код для рисования:

  if (Frame == 0) 
      { 
       HeadPosition.X = Position.X; 
       HeadPosition.Y = Position.Y; 
       BodyPosition.X = HeadPosition.X + 8; 
       BodyPosition.Y = HeadPosition.Y + 32; 
       TopHandPosition.X = HeadPosition.X + 2; 
       TopHandPosition.Y = HeadPosition.Y + 36; 
       BackHandPosition.X = HeadPosition.X + 20; 
       BackHandPosition.Y = HeadPosition.Y + 36; 
       HeadSource = new Rectangle(0, 0, this.Head.Width, this.Head.Height); 
       BodySource = new Rectangle(0, 0, 24, 54); 
       TopHandSource = new Rectangle(0, 0, 10, 27); 
       BackHandSource = new Rectangle(0, 0, 15, 27); 
       theSpriteBatch.Draw(BackHand, BackHandPosition, BackHandSource, 
    Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
       theSpriteBatch.Draw(Body, BodyPosition, BodySource, 
      Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
       theSpriteBatch.Draw(Head, HeadPosition, HeadSource, 
       Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
       theSpriteBatch.Draw(TopHand, TopHandPosition, TopHandSource, 
     Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 

      } 

Edit 2:

if (Frame == 0) 
      { 
       HeadPosition.X = Position.X; 
       HeadPosition.Y = Position.Y; 
       BodyPosition.X = HeadPosition.X + 8 ; 
       BodyPosition.Y = HeadPosition.Y + 32; 
       TopHandPosition.X = HeadPosition.X + 2 ; 
       TopHandPosition.Y = HeadPosition.Y + 36; 
       BackHandPosition.X = HeadPosition.X + 20 ; 
       BackHandPosition.Y = HeadPosition.Y + 36; 
       HeadSource = new Rectangle(0, 0, this.Head.Width, this.Head.Height); 
       BodySource = new Rectangle(0, 0, 24, 54); 
       TopHandSource = new Rectangle(0, 0, 10, 27); 
       BackHandSource = new Rectangle(0, 0, 15, 27); 
       int bigx=0; 
       int smallx=0; 
       float[] numbers = new[] { HeadPosition.X, BodyPosition.X , TopHandPosition.X, BackHandPosition.X}; 
       float min = numbers.Min(); 
       numbers = new[] { HeadPosition.X+HeadSource.Width, BodyPosition.X + BodySource.Width, TopHandPosition.X + TopHandSource.Width, BackHandPosition.X + BackHandSource.Width }; 
       float max = numbers.Max(); 
       float center = (max - min)/2; 
       if (flip==1) 
       { 
        HeadPosition.X = Position.X; 

        BodyPosition.X = HeadPosition.X +center+ 8*flipOffset; 

        TopHandPosition.X = HeadPosition.X +center+ 2*flipOffset; 

        BackHandPosition.X = HeadPosition.X +center+ 20*flipOffset; 

       } 
       Debug.WriteLine("fff: " + center); 
       theSpriteBatch.Draw(BackHand, BackHandPosition, BackHandSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
       theSpriteBatch.Draw(Body, BodyPosition, BodySource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
       theSpriteBatch.Draw(Head, HeadPosition, HeadSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
       theSpriteBatch.Draw(TopHand, TopHandPosition, TopHandSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
      } 

enter image description here

+0

Можете ли вы разместить код, который рисует отдельные части тела, пожалуйста. – craftworkgames

+0

@craftworkgames отредактировал – SpoocyCrep

+0

почему вы добавили код 'if (flip == 1)? Вы пробовали код в моем ответе точно так же, как я его написал? – craftworkgames

ответ

2

хмм .. это хитрая один.

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

Однако, если вы хотите быстро и грязный подход, вы можете быть в состоянии просто щелкнуть смещения каждой части, как это:

var flipOffset = FlipIs == SpriteEffects.FlipHorizontally ? -1 : 1; 

if (Frame == 0) 
{ 
    HeadPosition.X = Position.X; 
    HeadPosition.Y = Position.Y; 
    BodyPosition.X = HeadPosition.X + 8 * flipOffset; 
    BodyPosition.Y = HeadPosition.Y + 32 * flipOffset; 
    TopHandPosition.X = HeadPosition.X + 2 * flipOffset; 
    TopHandPosition.Y = HeadPosition.Y + 36 * flipOffset; 
    BackHandPosition.X = HeadPosition.X + 20 * flipOffset; 
    BackHandPosition.Y = HeadPosition.Y + 36 * flipOffset; 
    HeadSource = new Rectangle(0, 0, this.Head.Width, this.Head.Height); 
    BodySource = new Rectangle(0, 0, 24, 54); 
    TopHandSource = new Rectangle(0, 0, 10, 27); 
    BackHandSource = new Rectangle(0, 0, 15, 27); 
    theSpriteBatch.Draw(BackHand, BackHandPosition, BackHandSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
    theSpriteBatch.Draw(Body, BodyPosition, BodySource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
    theSpriteBatch.Draw(Head, HeadPosition, HeadSource, Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
    theSpriteBatch.Draw(TopHand, TopHandPosition, TopHandSource,Color.White, 0.0f, Vector2.Zero, Scale, FlipIs, 0); 
} 

Это предполагает, что Position находится в самом центре спрайта, если нет, вам может понадобиться сделать некоторые настройки.

Слушайте, я буду честен с вами. Есть более эффективные способы решения этой проблемы, но для этого потребуется значительная переработка кода, и в одном ответе ее трудно объяснить.

Первое, что я хотел бы сделать для реорганизации проекта, - создать класс для представления отдельной части Sprite для хранения общих точек данных (смещение, исходный прямоугольник, текстура, цвет и т. Д.) И настройки данных в одном месте. Код анимации должен быть отделен от кода чертежа и т. Д.

+0

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

Смежные вопросы