翻转角色

时间:2015-09-14 19:05:41

标签: xna monogame

当我向左走时,我想翻转角色\右,我从不同的身体部位创建了一个角色,因此翻转每个角色都会导致: enter image description here

当然是因为它将身体部位翻转到自己的位置,但不是所有的球员都在一起。

之后我有了一个想法,它是绘制玩家渲染目标并在绘制时翻转渲染目标,它工作(有点),但是当我走路时翻转它向后走,它也打开了玩家的位置屏幕。这是代码:

  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); 

            }

编辑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

1 个答案:

答案 0 :(得分: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部件,以便在一个地方保存公共数据点(偏移,源矩形,纹理,颜色等)和设置数据。动画代码需要与绘图代码等分离。